Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Динамическое подключение dll


Автор: Paradox 23.9.2004, 10:40
Я создаю dll и пытаюст ее динамически подключить к приложению
код dll
Код
__declspec(dllexport) void TestFunc(char* FileName) {
printf("%s",FileName);
}

BOOL APIENTRY DllMain( HANDLE hModule,
                      DWORD  ul_reason_for_call,
                      LPVOID lpReserved
     )
{
   return TRUE;
}


приложение
Код
typedef void (CALLBACK* TSTFUNC)(char*);


int main(int argc, char* argv[])
{
HINSTANCE dll = LoadLibrary(Путь к моей dll);
TSTFUNC pTSTFUNC = (TSTFUNC)GetProcAddress(dll,"TestFunc");
(*pOpenXMLFile)("C:\\Ivan\\kassa.xml");
FreeLibrary(dll);
return 0;

}

почему то всегда pTSTFUNC получается NULL, а dll всегда 0x1000000
отчего так ?

Автор: Олег М 23.9.2004, 11:39
Посмотри что GetLastError возвращает. И посмотри при помощи Depends какие функции есть в твоей ДЛЛке

Автор: srd 23.9.2004, 12:27
1. Если экспортируешь функцию с помощью директивы __declspec(dllexport), то лучше использовать в клиентской программе __declspec(dllimport). Тогда часть проблем будет разруливаться компилятором, а не тобой.
2. Если нужно использовать LoadLibrary, то для экспорта функций лучше использовать DEF файл. Добавь в свой проект текстовый файл с расширением DEF и следующего содержания
Код

LIBRARY имя-библиотеки
EXPORTS
TestFunc PRIVATE

В твоём коде на первый взгляд видно следующие ошибки:
1. Вместо pOpenXMLFile должно быть pTSTFUNC
2. Если хочешь находить функцию именно по имени TestFunc, то юзай DEF файл или напиши
Код

extern "C" __declspec(dllexport) void TestFunc(char* FileName) {
 printf("%s",FileName);
}

После этого GetProcAddress найдет твою функцию по строке TestFunc, но т.к. TSTFUNC имеет тип компоновки __stdcall (замаскированный макросом CALLBACK), то при попытке вызвать эту функцию стек будет угроблен. Либо напиши:
Код

ехtern "C" __declspec(dllexport) void __stdcall TestFunc(char* FileName) {
 printf("%s",FileName);
}

а в качестве параметра для GetProcAddress передавай строку "_TestFunc@4", либо
убери из определения TSTFUNC макрос CALLBACK, либо опять-таки используй DEF файлы.

Автор: JackYF 23.9.2004, 23:48
Вопрос - а в каком компиляторе делается?

Автор: Paradox 24.9.2004, 05:45
проблема была в этом
забыл
Код
ехtern "C"
biggrin.gif

Автор: NeXWiZ 28.1.2005, 21:30
Подскажите smile как реализовать на C# вот это:
Код

typedef void (CALLBACK* TSTFUNC)(char*);


int main(int argc, char* argv[])
{
HINSTANCE dll = LoadLibrary(Путь к моей dll);
TSTFUNC pTSTFUNC = (TSTFUNC)GetProcAddress(dll,"TestFunc");
(*pOpenXMLFile)("C:\\Ivan\\kassa.xml");
FreeLibrary(dll);
return 0;

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)