//#ifdef __cplusplus
extern "C" {
//#endif
#ifdef WIN32
__declspec(dllexport)
#endif
int mail_for_docflow_new(char *FullHtmFileName, ADDRLIST *PreAddrList)
{
#ifdef _test_pr
cout << "mail_for_docflow_new()" << endl;
#endif
return 0;
}
//#ifdef __cplusplus
}
//#endif
Не находит символ библиотеки (GetProcAddress)
Проблема заключается в следующем.
Для скомпилированной библиотеки при попытке запустить её функцию (GetProcAddress) выдает ошибку 3 (ERROR_PATH_NOT_FOUND). Библиотека открывается (LoadLibrary).
Qt3.3.3, Microsoft VS 2003.
Вот код библиотеки:
Код:
Вот запускающий код:
Код:
#ifdef WIN32
HINSTANCE dll = LoadLibrary(L"mail_forDocflow.dll");
#else
void *dll = dlopen("../lib/libmail_forDocflow.so", RTLD_LAZY);
#endif
int (*p)(char *FullHtmFileName, ADDRLIST *PreAddrList);
if (dll != NULL)
{
fprintf(stderr, "IDDB=%d\n", IDDB);
#ifdef WIN32
p = (int (*)(char *FullHtmFileName, ADDRLIST *PreAddrList))GetProcAddress(dll, "mail_for_docflow_new");
#else
p = (int (*)(char *FullHtmFileName, ADDRLIST *PreAddrList))dlsym(dll, "mail_for_docflow_new ");
#endif
#ifdef WIN32
fprintf(stderr,"GetLastError()= %d\n", GetLastError());
#else
fprintf(stderr,"dlerror()= %s\n", dlerror());
#endif
}
HINSTANCE dll = LoadLibrary(L"mail_forDocflow.dll");
#else
void *dll = dlopen("../lib/libmail_forDocflow.so", RTLD_LAZY);
#endif
int (*p)(char *FullHtmFileName, ADDRLIST *PreAddrList);
if (dll != NULL)
{
fprintf(stderr, "IDDB=%d\n", IDDB);
#ifdef WIN32
p = (int (*)(char *FullHtmFileName, ADDRLIST *PreAddrList))GetProcAddress(dll, "mail_for_docflow_new");
#else
p = (int (*)(char *FullHtmFileName, ADDRLIST *PreAddrList))dlsym(dll, "mail_for_docflow_new ");
#endif
#ifdef WIN32
fprintf(stderr,"GetLastError()= %d\n", GetLastError());
#else
fprintf(stderr,"dlerror()= %s\n", dlerror());
#endif
}
Код:
GetProcAddress(dll, "_mail_for_docflow_new");
подробнее смотрите статью о конвенциях вызова
http://www.unixwiz.net/techtips/win32-callconv.html
Цитата: Нездешний
попробуйте перед именем функции поставить знак подчеркивания:
подробнее смотрите статью о конвенциях вызова
Код:
GetProcAddress(dll, "_mail_for_docflow_new");
подробнее смотрите статью о конвенциях вызова
Спасибо за помощь, но ха - ха - ха (смеюсь над собой и этой глупой ошибкой).
Указатель на библиотеку получил, на функцию получил, а вызывать функцию, как говорится, будет дядя.:)