Здравствуйте, уважаемые.
Вопрос у меня такой. Необходимо написать DLL-ку (А) , которая, в числе прочего, использует другую DLL-ку (Б), причем подключаю я ее статически. Все делаю, как положено. Включаю в проект хедер и либку, все компилируется на раз, можно вроде пользовать. НО... При попытке вызвать мою функцию, которую экспортирует DLL (А), в тестовом клиенте программа вываливается на Unhandled exception. При этом я точно знаю, что DllEntryPoint (DllMain) отрабатывает корректно. Если посмотреть мою DLL (А) с помощью Quick view, то видно, что помимо моих функций она пытвется экспортировать классы используемой DLL (Б), причем как-то странно.
Например
000f 000340bc
??_7OSessionCollection@@6B@
0010 000340a4
?GetIndex@OField@@QAEHXZ
0000 000010d2 GenerateReport // моя функция
Если выключить из проекта моей DLL (А) хотя бы один только хедер DLL (Б), то все хорошо, DLL (А) экспортирует только мои функции и прекрасно работает с тестовым клиентом.
Поможите кто чем может пожалуйста.
P.S. Еще забыл сказать, что этот ексепшн совершенно не зависит от того, использует ли вызываемая клиентом функция методы и классы DLL (Б) или не использует.
Здравствуйте Cory, Вы писали:
C>Здравствуйте, уважаемые. C>Вопрос у меня такой. Необходимо написать DLL-ку (А) , которая, в числе прочего, использует другую DLL-ку (Б), причем подключаю я ее статически. Все делаю, как положено. Включаю в проект хедер и либку, все компилируется на раз, можно вроде пользовать. НО... При попытке вызвать мою функцию, которую экспортирует DLL (А), в тестовом клиенте программа вываливается на Unhandled exception. При этом я точно знаю, что DllEntryPoint (DllMain) отрабатывает корректно. Если посмотреть мою DLL (А) с помощью Quick view, то видно, что помимо моих функций она пытвется экспортировать классы используемой DLL (Б), причем как-то странно.
Предполагаю, что функции экспортируются с помощью __declspec(dllexport), обернутого в макрос.
Причем один и тот же в обеих DLL. В этом случае нет ничего удивительного, что A.dll пытается
_Экспортировать_ функции, объявленные в B.dll, вместо того, чтобы их _импортировать_.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте Cory, Вы писали:
C>>Здравствуйте, уважаемые. C>>Вопрос у меня такой. Необходимо написать DLL-ку (А) , которая, в числе прочего, использует другую DLL-ку (Б), причем подключаю я ее статически. Все делаю, как положено. Включаю в проект хедер и либку, все компилируется на раз, можно вроде пользовать. НО... При попытке вызвать мою функцию, которую экспортирует DLL (А), в тестовом клиенте программа вываливается на Unhandled exception. При этом я точно знаю, что DllEntryPoint (DllMain) отрабатывает корректно. Если посмотреть мою DLL (А) с помощью Quick view, то видно, что помимо моих функций она пытвется экспортировать классы используемой DLL (Б), причем как-то странно.
SVZ>Предполагаю, что функции экспортируются с помощью __declspec(dllexport), обернутого в макрос. SVZ>Причем один и тот же в обеих DLL. В этом случае нет ничего удивительного, что A.dll пытается SVZ>_Экспортировать_ функции, объявленные в B.dll, вместо того, чтобы их _импортировать_.
Я навроде уже проблемку поборол. Действительно, в хедере функции и классы объявляются с помощью макроса OEXPORT __declspec(dllexport). Удалив этот макрос из объявлений классов я добился нормальной работы. Но это скучно. Должен заметить, что в своей DLL я использую другой макрос для __declspec(dllexport), а именно DLLEXPORT . Это не помогает ну ни капельки. Может, все таки есть модный способ? Например, чего нибудь с директивами препроцессора.
Здравствуйте Cory, Вы писали:
C>Я навроде уже проблемку поборол. Действительно, в хедере функции и классы объявляются с помощью макроса OEXPORT __declspec(dllexport). Удалив этот макрос из объявлений классов я добился нормальной работы. Но это скучно. Должен заметить, что в своей DLL я использую другой макрос для __declspec(dllexport), а именно DLLEXPORT :-). Это не помогает ну ни капельки. Может, все таки есть модный способ? Например, чего нибудь с директивами препроцессора.
Начало-то правильное. Только нужно подходить к задаче творчески :-).
Итак,
как раз сейчас бьюсь с подобной схемой — на винде вся конструкция
exe -> a.dll (+lib) -> b.dll(+lib)
не загружается (отваливается либа a.dll)
под линуксом же все ок..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)