Czy Mogę używać kompilatora C++ Visual Studio 2010 z biblioteką C++ Runtime Visual Studio 2008?

Mam aplikację, która musi działać na Windows 2000. Chciałbym również skorzystać z Visual Studio 2010 (głównie ze względu na zmianę definicji słowa kluczowego auto). Jednak jestem trochę związany, ponieważ potrzebuję aplikacji, aby móc działać na starszych systemach operacyjnych, a mianowicie:]}

  • Windows 2000
  • Windows XP RTM
  • Windows XP SP1

Biblioteka uruchomieniowa Visual Studio 2010 zależy od API EncodePointer / DecodePointer, które zostało wprowadzone w systemie Windows XP SP2.

Jeśli użycie alternatywnej biblioteki uruchomieniowej jest możliwe, czy ten kod złamie się, który opiera się na funkcjach C++0x dodanych w VS2010, takich jak std::regex?

Author: John Saunders, 2010-03-20

8 answers

Rozwiązanie Sumy wyglądało obiecująco, ale nie działa: symbole __imp__*@4 muszą byćwskaźnikami do funkcji, a nie same funkcje. Niestety nie wiem jak sprawić, by Visual C++ wypluł wskaźnik o takiej nazwie... (cóż, __declspec(naked) w połączeniu z __stdcall robi sztuczkę, ale wtedy Nie wiem, jak emitować wskaźnik).

Jeśli użycie asemblera w czasie budowania jest OK, rozwiązanie jest dość trywialne-zmontuj następujący kod z FASM i linkiem do produkowanego pliku obiektowego, a presto-brak odniesień do EncodePointer/DecodePointer w exe:

use32
format ms coff

section ".data" data
public __imp__DecodePointer@4
__imp__DecodePointer@4 dd dummy

public __imp__EncodePointer@4
__imp__EncodePointer@4 dd dummy

section ".text" code
dummy:
mov eax, [esp+4]
retn 4
 11
Author: snemarch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:44

Najprostszym rozwiązaniem jest ustawienie zestawu narzędzi platformy w ustawieniach projektu w VS2010 na v900, który będzie używał bibliotek i kompilatora Visual Studio 2008. Oznacza to również utratę funkcji C++0x, takich jak auto, ale szczerze mówiąc, obejście tego z niektórymi typedef S jest prawdopodobnie łatwiejsze niż budowanie własnej wersji CRT lub innych bardziej skomplikowanych rozwiązań. Alternatywnie, wystarczy użyć VS2008! Nie wiem, czy są inne funkcje C++0x, które są krytyczne dla Twojej aplikacji chociaż nie wspomniałeś - poza std::regex, który myślę, że nadal znajduje się w zestawie narzędzi v900 w przestrzeni nazw raportu technicznego 1 (std::tr1::regex).

Tylko z wrażenia, jakie mam, przewidywałbym niedogodności związane z uruchomieniem bibliotek VS2010 NA XP SP1 jest większa niż wygoda funkcji C++0x, więc ogólnie nie byłoby tego warte.

 24
Author: AshleysBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-13 16:22:52

Nie można użyć 2008 CRT, ale można zapobiec połączeniu nowych funkcji DecodePointer/EncodePointer z jądra. Całkiem łatwo jest zastąpić nowe funkcje za pomocą stubów.

Można spróbować wykonać następujące czynności: umieść kod w swoim głównym.źródło cpp:

extern "C" {

  void *__stdcall _imp__DecodePointer(void *x) {return x;}
  void *__stdcall _imp__EncodePointer(void *x) {return x;}

};

Powyższe nie działa. Chociaż podstawową ideą jest dźwięk, wykonanie musi być trochę inne. Jak opisał snemarch w komentarzu i kolejna odpowiedź , __imp__ nie może to być wywołanie funkcji, tylko wskaźnik do niej. Ponieważ wydaje się, że nie jest możliwe wygenerowanie wskaźnika bezpośrednio przez kompilator, musisz złożyć następujący kod z MASM i link do wytworzonego pliku obiektu.

.model flat

.data
__imp__EncodePointer@4 dd dummy
__imp__DecodePointer@4 dd dummy
EXTERNDEF __imp__EncodePointer@4 : DWORD
EXTERNDEF __imp__DecodePointer@4 : DWORD

.code
dummy proc
mov eax, [esp+4]
ret 4
dummy endp

end

Symbole z projektu mają pierwszeństwo przed symbolami z bibliotek. Biblioteki DLL są połączone za pomocą .lib części, które zawierają tylko __imp__ "wektory" przeskakujące do funkcji rzeczywistych. Zastępując __imp__ "wektory" nie dotykasz linkowania DLL, wymień .lib part. Sprawdziłem, że nie ma już żadnej zależności exe od DecodePointer / EncodePointer.

Tło

Statycznie powiązana biblioteka wprowadza do aplikacji tylko używane funkcje. Można znaleźć, które konkretne funkcje CRT wprowadzają te nowe API, używając linkera verbose progress output:

Found __imp__EncodePointer@4
  Referenced in LIBCMT.lib(crtmboxw.obj)
  Referenced in LIBCMT.lib(invarg.obj)
  Referenced in LIBCMT.lib(handler.obj)
  Referenced in LIBCMT.lib(onexit.obj)
  Referenced in LIBCMT.lib(cmiscdat.obj)
  Referenced in LIBCMT.lib(tidtable.obj)
  Referenced in LIBCMT.lib(hooks.obj)
  Referenced in LIBCMT.lib(winsig.obj)
  Referenced in LIBCMT.lib(rand_s.obj)

Found __imp__DecodePointer@4
  // ... same list, only order differs ... 

To pokazuje, że nowe Api są używane w niektórych CRT, aby zapewnić większe bezpieczeństwo dla niektórych funkcji, które uważa się za częste wektory ataku.

Z pewnym wysiłkiem byłoby możliwe użycie LoadLibrary / GetProcAddress, aby zapewnić prawdziwą funkcjonalność tam, gdzie oferuje system operacyjny, ale nie sądzę, że to naprawdę przyniesie cokolwiek. Funkcje uruchomieniowe, które używają DecodePointer / EncodePointer tak naprawdę nie potrzebują go, aby zapewnić jakiekolwiek kodowanie, wszystko, czego potrzebują, to kodowanie symetryczne. Tak naprawdę nie potrzebujesz rozszerzonego bezpieczeństwa (VS 2008 runtime też ci go nie da).

Mam nadzieję, że nie ma innych przeszkody czekają na ciebie - nie mam dostępu do systemu Win2k lub XP pre SP2, dlatego nie mogę spróbować. Jeśli są jakieś flagi nagłówka exe uniemożliwiające nawet próbę uruchomienia exe na takich systemach, powinny być łatwe do zmiany.

 24
Author: Suma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:36

Ponieważ Visual Studio jest wyposażone w obsługę MASM (zobacz Właściwości projektu - > Tworzenie dostosowań...) przydatne może być następujące tłumaczenie kodu snemarch na MASM:

.model flat

.data
__imp__EncodePointer@4 dd dummy
__imp__DecodePointer@4 dd dummy
EXTERNDEF __imp__EncodePointer@4 : DWORD
EXTERNDEF __imp__DecodePointer@4 : DWORD

.code
dummy proc
mov eax, [esp+4]
ret 4
dummy endp

end

I pamiętaj, aby ustawić Linker - > System - > minimalną wymaganą wersję na 5.0 (domyślnie jest to 5.1) do uruchomienia w systemie Windows 2000.

 8
Author: Tomasz Grobelny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-14 11:54:37

Typowym obejściem tego problemu jest zbudowanie własnej niestandardowej wersji CRT. Są instrukcje tutaj. Wystarczy edytować kod, aby zignorować EncodePointer i DecodePointer. (Powinno być już #define do tego.)

Są dwie inne drobne rzeczy, które musisz zrobić:

  • przejdź do Ustawienia Linker- > dodatkowe katalogi bibliotek i ustaw C:\Microsoft Visual Studio 9.0\VC\lib jako pierwszą ścieżkę do przeszukiwania. (Zakładam, że użyłeś domyślnego katalogu instalacyjnego, w przeciwnym razie Zmień w stosownych przypadkach.)
  • Zmień wersję podsystemu w nagłówku PE na 5.00 (użyj darmowego CFF Explorer Suite, Jeśli nie masz pod ręką innego narzędzia).

To powinno umożliwić działanie programu w systemie Windows 2000, jak również w późniejszych wersjach.

 4
Author: Head Geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-13 06:25:20

Opcja 1-Utwórz zmodyfikowaną wersję środowiska uruchomieniowego 2010, która przekieruje wywołania problemowego interfejsu API do dostarczonej biblioteki DLL. Nie wiem, jak łatwe lub trudne byłoby to - mam nadzieję, że tylko drobne poprawki do tabeli symboli, ale zależy to od formatu pliku-i bardzo prawdopodobne jest, że napotkasz klauzulę inżynierii odwrotnej licencji, oczywiście.

Opcja 2-Porównanie eksportowanych symboli w dwóch różnych wersjach bibliotek runtime. Jeśli symbole są takie same, masz dobre kursy zgodności - choć bez gwarancji. Możliwe nawet, że formaty plików lib są różne.

Opcja 3-Sprawdź, czy możesz uzyskać dostęp do źródeł runtime przez MSDN lub podobne, w szczególności w celu utworzenia poprawionej wersji.

Opcja 4-Sprawdź, czy możesz użyć kompilatora 2010, ale starszego linkera, być może skonfigurowanego w Twoich rozwiązaniach jako niestandardowy krok budowania. Ponownie, zależy to od tego, czy pliki obj i lib są w tym samym formacie - ale możesz być potrafi napisać małe narzędzie do łatania prostych różnic, takich jak numery wersji w nagłówku. Starszy linker nie powinien mieć problemu z linkowaniem w starszym runtime-zakładając, że obiekty z nowego kompilatora są z nim zgodne.

Opcja 5-budowanie bibliotek DLL w 2010 roku, które nie potrzebują własnego środowiska wykonawczego, ale które są ładowane i hostowane przez aplikację zbudowaną przy użyciu starszego kompilatora. Osiągnięcie wymogu "no runtime" dla bibliotek DLL może oznaczać, że wiele bibliotek musi być wbudowanych w aplikacja hostingowa, oczywiście, i może być konieczne zapewnienie własnych interfejsów (za pośrednictwem aplikacji host) do funkcji bibliotecznych, z którymi musisz pracować - zwłaszcza alokacji pamięci rzeczy.

Opcje warte sprawdzenia, ale jestem pewien, że już myślałeś o nich wszystkich-przepraszam, nie mam pojęcia , czy któreś z nich zadziała-lub czy będą prawie działać, ale powodują przerywane problemy.

 3
Author: Steve314,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-21 16:21:38

Byłoby to o wiele łatwiejsze, jeśli możesz korzystać z biblioteki DLL. Zasadniczo, napisz EXE, który nie wymaga żadnych funkcji uruchomieniowych C, używając funkcji linker / ENTRYPOINT. Po przetestowaniu, że Twoje podstawowe wymagania wstępne są spełnione i zgłoszeniu wszelkich problemów użytkownikowi za pośrednictwem tylko interfejsów API dostarczanych przez System Windows dostępnych na wszystkich docelowych systemach operacyjnych (np. MessageBox), zadzwoń do LoadLibrary, aby uruchomić bibliotekę DLL, która zawiera większość twojej logiki. Ta biblioteka DLL może używać środowiska wykonawczego VS2010 jak zwykle. Możesz nawet unikaj wdrażania dwóch oddzielnych plików przez dekompresję DLL z zasobu zawartego w głównym .EXE przy starcie. (Można to zrobić całkowicie w pamięci bez pisania .DLL na dysk, ale nie, jeśli chcesz skorzystać z Windows PE loader naprawić wszystkie import).

 3
Author: Ben Voigt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-01 23:39:21

Create a .LIB, który implementuje brakującą funkcjonalność i łączy ją przed KERNEL32.LIB.

Będziesz musiał użyć opcji linker /NODEFAULTLIB: kernel32.lib tak, że można umieścić swój w2kcompat.lib przed kernel32.lib.

 0
Author: Gideon7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-29 00:23:56