Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Andrey_hello от Март 02, 2008, 22:38



Название: LoadLibrary() не принимает имя библиотеки из переменной
Отправлено: Andrey_hello от Март 02, 2008, 22:38
Пытаюсь замутить код по идиоме - получение ресурса есть инициализация для работы с библиотеками и заодно что бы клиенты не заботились об кроссплатформенности и сообщениях пользователю.

Параметром конструктора передается имя библиотеки. Если пишу имя L"mail_forDocflow" - библиотека открывается, если передаю имя из параметра (сейчас закомментированное) GetLastError() возвращает ошибку 126 (ERROR_MOD_NOT_FOUND)????

Код:
func_from_dll::func_from_dll(const char *libName)
{
  cout << "func_from_dll::func_from_dll()" << endl;
  map<string, opd_library>::iterator it = stLib_map.find(libName);
  nameThis_opened_dll = libName;

  if ( it == stLib_map.end() ) // Такой библиотеки нет в списке открытых библиотек
    {
    #ifdef WIN32
      ptrThis_opened_dll = LoadLibrary(L"mail_forDocflow");//((LPCWSTR)libName);
    #else
      ptrThis_opened_dll = dlopen(libName, RTLD_LAZY);
    #endif

    if ( ptrThis_opened_dll == NULL )
  { // Получить ошибки и выйти
      cout << "ptrThis_opened_dll == NULL" << endl;

  #ifdef WIN32
  fprintf(stderr,"* dlerror()= %d\n", GetLastError());
    #else
      fprintf(stderr,"* dlerror()= %s\n", dlerror());
    #endif

      return;
  }
. . . и т. д.


Название: Re: LoadLibrary() не принимает имя библиотеки из переменной
Отправлено: Andrey_hello от Март 02, 2008, 22:56
И заодно  :), знает кто нибудь, как сделать в линуксе (для dlsym()) аналог:

Код:
(FARPROC &)pVar = GetProcAddress(hLib, "Var");

Что бы не делать приведения возвращаемого значения, как:
Код:
pVar = (тип(*)(тип, тип, тип))GetProcAddress(hLib, "Var");

Спасибо.


Название: Re: LoadLibrary() не принимает имя библиотеки из переменной
Отправлено: Tonal от Март 03, 2008, 08:31
У тебя тип параметра libName - const char*
а ты приводишь его к LPCWSTR который раскрывается в const wchar_t* или в const unsigned short* в зависимости от компилятора и настроек.
Либо явно используй версию LoadLibraryA, либо честно конвертируй параметр в широкую строку.
Ну и расширение по хорошему тоже надо бы дописывать - иначе возможны разные глюки.


Название: Re: LoadLibrary() не принимает имя библиотеки из переменной
Отправлено: Andrey_hello от Март 03, 2008, 20:30
Спасибо


Название: Re: LoadLibrary() не принимает имя библиотеки из переменной
Отправлено: Andrey_hello от Март 03, 2008, 21:25
Счастие пришло.

Код:
size_t size = strlen(libName);
wchar_t *out = new wchar_t[size];
size_t res = mbstowcs (out, libName, size);

cout << "res= " << res << endl;

ptrThis_opened_dll = LoadLibrary(out);
   
delete out;