Mam dwie biblioteki DLL, do których muszę uzyskać dostęp w tym samym pliku wykonywalnym. Mam pliki nagłówkowe i pliki .LIB dla obu bibliotek. Niestety, podzbiór funkcji, które muszę mieć dostęp, ma dokładnie takie same nazwy. Najlepszym rozwiązaniem, jakie udało mi się wymyślić do tej pory, jest użycie LoadLibrary do załadowania jednej z bibliotek DLL i jawne wywołanie jej metod za pomocą GetProcAddress. Czy istnieje sposób dla mnie, aby niejawnie załadować obie biblioteki i jakoś dać kompilatorowi wskazówkę, że w jednym przypadku chcę wywołać OpenApi w DLL A, a w innym przypadku chcę wywołać OpenApi w DLL B?Wywołanie dwóch funkcji o tej samej nazwie z dwóch różnych bibliotek DLL C
Opracowuję swój plik wykonywalny w C++ przy użyciu Visual Studio 2008 i odpowiedniej biblioteki uruchomieniowej C (msvcr90.dll).
[Edytuj]
Commenter Ilya pyta poniżej tego, co mi się nie podoba o rozwiązanie GetProcAddress. Nie podoba mi się to z dwóch powodów:
- Sprawia, że kod jest bardziej złożony. Jedna linia kodu do wywołania funkcji zostaje zastąpiona trzema liniami kodu, jedna do zdefiniowania sygnatury funkcji, jedna do wywołania GetProcAddress, a druga do wywołania funkcji.
- Jest bardziej podatna na błędy czasu wykonywania. Jeśli źle wypiszesz nazwę funkcji lub zepsuję podpis, nie widzę błędu do czasu wykonania. Powiedzmy, że postanowiłem zintegrować nową wersję biblioteki dll i jedna z nazw metod została zmieniona, skompiluje się dobrze i nie będzie miała problemu aż do faktycznego połączenia z GetProcAddress, które może nawet zostać pominięte w przepustce testowej.
Ponieważ jest to C++, można również rozważyć użycie przestrzeni nazw w celu rozróżnienia tych dwóch funkcji, zamiast mieszania nazw funkcji w sposób specjalny, który należy wyjaśnić dalej. Wadą jest to, że nie działa to dla wywołujących język C. – orcmid
Znajduję Twoją oryginalną propozycję za pomocą LoadLibrary i GetProcAddress jako najbardziej logiczne i w rzeczywistości najłatwiejsze do wdrożenia. Czy możesz wyjaśnić, dlaczego masz problem z tym podejściem i szukasz alternatywy? – Ilya