Russian Qt Forum
Ноябрь 27, 2024, 06:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: LoadLibrary() не принимает имя библиотеки из переменной  (Прочитано 3929 раз)
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;
  }
. . . и т. д.
Записан
Andrey_hello
Гость
« Ответ #1 : Март 02, 2008, 22:56 »

И заодно  Улыбающийся, знает кто нибудь, как сделать в линуксе (для dlsym()) аналог:

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

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

Спасибо.
« Последнее редактирование: Март 02, 2008, 22:59 от Andrey_hello » Записан
Tonal
Гость
« Ответ #2 : Март 03, 2008, 08:31 »

У тебя тип параметра libName - const char*
а ты приводишь его к LPCWSTR который раскрывается в const wchar_t* или в const unsigned short* в зависимости от компилятора и настроек.
Либо явно используй версию LoadLibraryA, либо честно конвертируй параметр в широкую строку.
Ну и расширение по хорошему тоже надо бы дописывать - иначе возможны разные глюки.
Записан
Andrey_hello
Гость
« Ответ #3 : Март 03, 2008, 20:30 »

Спасибо
Записан
Andrey_hello
Гость
« Ответ #4 : Март 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;

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 21.