Использование DLL в DLL
От: Cory Россия  
Дата: 18.01.02 06:00
Оценка:
Здравствуйте, уважаемые.
Вопрос у меня такой. Необходимо написать 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 (Б) или не использует.
Re: Использование DLL в DLL
От: Stanislav V. Zudin Россия  
Дата: 18.01.02 07:48
Оценка:
Здравствуйте Cory, Вы писали:

C>Здравствуйте, уважаемые.

C>Вопрос у меня такой. Необходимо написать DLL-ку (А) , которая, в числе прочего, использует другую DLL-ку (Б), причем подключаю я ее статически. Все делаю, как положено. Включаю в проект хедер и либку, все компилируется на раз, можно вроде пользовать. НО... При попытке вызвать мою функцию, которую экспортирует DLL (А), в тестовом клиенте программа вываливается на Unhandled exception. При этом я точно знаю, что DllEntryPoint (DllMain) отрабатывает корректно. Если посмотреть мою DLL (А) с помощью Quick view, то видно, что помимо моих функций она пытвется экспортировать классы используемой DLL (Б), причем как-то странно.

Предполагаю, что функции экспортируются с помощью __declspec(dllexport), обернутого в макрос.
Причем один и тот же в обеих DLL. В этом случае нет ничего удивительного, что A.dll пытается
_Экспортировать_ функции, объявленные в B.dll, вместо того, чтобы их _импортировать_.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Использование DLL в DLL
От: Cory Россия  
Дата: 18.01.02 08:08
Оценка:
Здравствуйте 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 . Это не помогает ну ни капельки. Может, все таки есть модный способ? Например, чего нибудь с директивами препроцессора.
Re[3]: Использование DLL в DLL
От: Stanislav V. Zudin Россия  
Дата: 18.01.02 09:31
Оценка:
Здравствуйте Cory, Вы писали:

C>Я навроде уже проблемку поборол. Действительно, в хедере функции и классы объявляются с помощью макроса OEXPORT __declspec(dllexport). Удалив этот макрос из объявлений классов я добился нормальной работы. Но это скучно. Должен заметить, что в своей DLL я использую другой макрос для __declspec(dllexport), а именно DLLEXPORT :-). Это не помогает ну ни капельки. Может, все таки есть модный способ? Например, чего нибудь с директивами препроцессора.


Начало-то правильное. Только нужно подходить к задаче творчески :-).
Итак,

B.dll
файл B_dll.h

// **************************************************************************
//             ОБЪЯВЛЕНИЯ ДЛЯ ИМПОРТА/ЭКСПОРТА КЛАССОВ/ФУНКЦИЙ
#ifdef B_DLL_EXPRT
#  define B_EXP_FUNC __declspec(dllexport)
#else
#  define B_EXP_FUNC __declspec(dllimport)
#endif
// **************************************************************************

//                      ОБЪЯВЛЕНИЯ ТВОИХ ФУНКЦИЙ
B_EXP_FUNC void b_dll_func();


В настройках проекта, либо в глобальном заголовочном файле объяви B_DLL_EXPRT (я предпочитаю первый вариант).

Теперь при использовании B_dll.h файла в проекте "В" функция void b_dll_func() будет экспортироваться, во всех остальных проектах — импортироваться.

Теперь A.dll:

Файл A_dll.h


// **************************************************************************
//             ОБЪЯВЛЕНИЯ ДЛЯ ИМПОРТА/ЭКСПОРТА КЛАССОВ/ФУНКЦИЙ
#ifdef A_DLL_EXPRT
#  define A_EXP_FUNC __declspec(dllexport)
#else
#  define A_EXP_FUNC __declspec(dllimport)
#endif
// **************************************************************************

//                      ОБЪЯВЛЕНИЯ ТВОИХ ФУНКЦИЙ
A_EXP_FUNC void a_dll_func();


Все то же самое — В настройках проекта объявляем A_DLL_EXPRT.

Вот и все.
_____________________
С уважением,
Stanislav V. Zudin
Re[4]: Использование DLL в DLL
От: dad  
Дата: 19.07.05 11:37
Оценка:
SVZ>
SVZ>B_EXP_FUNC void b_dll_func();

SVZ>

SVZ>Файл A_dll.h


SVZ>
SVZ>A_EXP_FUNC void a_dll_func();

SVZ>



как раз сейчас бьюсь с подобной схемой — на винде вся конструкция
exe -> a.dll (+lib) -> b.dll(+lib)
не загружается (отваливается либа a.dll)
под линуксом же все ок..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.