Przy użyciu Visual Studio C++ V10, staram się dowiedzieć, jak zbudować DLL i rozwiązać konflikt nazw plików DLL. Oto szczegóły.Unmanaged C++ DLL o tej samej nazwie współistnieją w tym samym procesie
Firma S wysyła produkt o nazwie M.EXE
. Załóżmy, że M.EXE
jest zainstalowany w \S\BIN\M.EXE
. Firma S statycznie łączy się z biblioteką DLL o nazwie U.DLL
, która jest instalowana w wersji \S\BIN\U.DLL
. U.DLL
zawiera kod open source i jest zbudowany z opcjami kompilatora Visual C++ /Zc:wchar_t-
, który nie rozpoznaje wchar jako natywnego typu.
Firma C wysyła bibliotekę DLL o nazwie O.DLL
i publikuje interfejsy API dla tej biblioteki DLL oraz wysyła bibliotekę importowania dla O.DLL
. Załóżmy, że O.DLL
jest zainstalowany w \C\BIN\O.DLL
. O.DLL
statycznie łączy się z biblioteką DLL o nazwie U.DLL
, która jest instalowana w wersji \C\BIN\U.DLL
. U.DLL
jest zbudowany na tym samym kodzie open source, ale jest zbudowany z opcjami kompilatora Visual C++ /Zc:wchar_t
, który rozpoznaje wchar_t
jako natywny typ.
Idealnie firma C i firma S zgodziłaby się zbudować U.DLL
przy użyciu tych samych opcji Visual C++, ale to nie jest możliwe.
M.EXE
z firmy S jest rozszerzalny, że mogę stworzyć własną bibliotekę DLL w niezarządzanych C++, nazywają to NODE.DLL
że M.EXE
wywoła jeśli ustawi wszystko poprawnie. Chciałbym zbudować NODE.DLL
tak, że statycznie linki do O.DLL
z firmy C. Ale problemem jest to, że raz M.EXE
działa, załadował bibliotekę U.DLL
z \S\BIN
, a symbole z \S\BIN\U.DLL
są nieco inne niż te w \C\BIN\U.DLL
, ze względu na to, w jaki sposób każda firma zbudowała U.DLL
. Tak więc, gdy M.EXE
próbuje załadować NODE.DLL
, nie powiedzie się, ponieważ gdy NODE.DLL
ładuje O.DLL
, który potrzebuje U.DLL
, symbole potrzebne od \C\BIN\U.DLL
nie istnieją, ponieważ system Windows widzi U.DLL
jako już załadowany.
Schemat sytuacja przedstawia się następująco:
M.EXE static link to -> \S\BIN\U.DLL
M.EXE dynamic link to -> NODE.DLL
NODE.DLL static link to O.DLL
O.DLL static link to \C\BIN\U.DLL
efekcie, trzeba zarówno \S\BIN\U.DLL
i \C\BIN\U.DLL
współistnieć na tym samym miejscu procesu, i M.EXE
wykorzysta wersją U.DLL
i O.DLL
użyciu jego wersja U.DLL
.
Należy pamiętać, że nie mam opcji odbudować M.EXE
lub O.DLL
, aby zmienić sposób ich ładowania U.DLL
. Pochodzą od stron trzecich, więc nie można zmienić linkowania statycznego. Nie mam również możliwości użycia LoadLibrary
na O.DLL
, ponieważ jest to biblioteka C++, dostarczana z biblioteką importu.
wierzę, że manifesty można stosować tak, że kiedy budować NODE.DLL
, który jest połączony z O.DLL statycznie, ustawić rzeczy w manifeście NODE.DLL
tak że O.DLL
ładuje własną kopię U.DLL
który jest zainstalowany w \C\BIN\U.DLL
. Po prostu nie mogę wymyślić, jak to zrobić. Idealnie nie chciałbym modyfikować manifestu O.DLL
, ale jeśli to jedyne rozwiązanie, będę z tym żyć.
DLL's, DLL's ALLERWHERE! (Przepraszam, nie mogłem się powstrzymać) Cześć i witaj. – doge
Zasadniczo problem polega na tym, że 'O.DLL' w IAT określa, że łączy się z' U.DLL', bez zastrzeżeń. – MSalters