Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
#1

Проблемы с загрузкой DLL - C++

03.04.2013, 11:40. Просмотров 585. Ответов 12
Метки нет (Все метки)

Здравствуйте!

Скачал отсюда библиотеку: phash.org

Создал консольный проект проект( в Visual C++ 2010 Express):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include <iostream>
#include <windows.h>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    HINSTANCE hInstLibrary = LoadLibrary(L"pHash.dll");
 
   if (hInstLibrary)
   {
      
 
      FreeLibrary(hInstLibrary);
   }
   else
   {
      std::cout << "DLL Failed To Load!" <<  std::endl;
   }
 
   std::cin.get();
 
   return 0;
}
Как я не бьюсь - всё время пишет: DLL Failed To Load!
dll и в папку с проектом кидал и в папку Debug. Пробовал указать полный путь к библиотеке. Даже где-то нашёл совет двойной слэш ставить в пути. Не помогло. Не подгружается и всё.

Нужна ваша помощь.

Заранее огромное спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 11:51     Проблемы с загрузкой DLL #2
Давно на WinAPI не кодил, там вроде есть что-то типа LastError(). Посмотри, что пишет, там будет более подробная информация типа "файл не найден" или "путь не существует", короче можно будет понять в чем причина.

Добавлено через 1 минуту
Вот GetLastError(). Она возвращает номер ошибки, по этому номеру можно нагуглить текст ошибки. Вроде есть какая-то стандартная приблуда для вывода текста ошибки по номеру, но я всегда гуглил
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 11:58  [ТС]     Проблемы с загрузкой DLL #3
Ошибка: 14001

Пока найти в гугле работающего рецепта решения проблемы не удалось.
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 12:04     Проблемы с загрузкой DLL #4
Строка запроса "LoadLibrary error 14001". Очень много результатов.
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 12:24  [ТС]     Проблемы с загрузкой DLL #5
Результатов действительно много. Но пока ни один не помог.

Добавлено через 2 минуты
Ура. Один всё-таки помог: перекомпиляция dll

ок. Хорошо, что сейчас были исходники. А если бы исходников не было?

Добавлено через 13 минут
Библиотеку загрузил, теперь пытаюсь вызвать нужную функцию.

Код подправил так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "stdafx.h"
#include <iostream>
#include <windows.h>
 
using namespace std;
typedef unsigned __int64 ulong64;
 
typedef int (*ph_dct_imagehash)(const char* file,ulong64 &hash);
 
int _tmain(int argc, _TCHAR* argv[])
{
    ph_dct_imagehash _ph_dct_imagehash;
    HINSTANCE hInstLibrary = LoadLibrary(L"pHash.dll");
 
   if (hInstLibrary)
   {
      std::cout << "Ok!" <<  std::endl;
 
      _ph_dct_imagehash = (ph_dct_imagehash)GetProcAddress(hInstLibrary, "ph_dct_imagehash");
      ulong64 myhash=0;
      _ph_dct_imagehash("test.jpg", myhash);
      std::cout << myhash <<  std::endl;
 
      FreeLibrary(hInstLibrary);
   }
   else
   {
      std::cout << "DLL Failed To Load!" <<  std::endl;
      std::cout << GetLastError() <<  std::endl;
   }
 
   std::cin.get();
 
   return 0;
}
Скомпилировалось, но упало с ошибкой.

Буду рад совету. Спасибо!
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 12:39     Проблемы с загрузкой DLL #6
Цитата Сообщение от pivkos Посмотреть сообщение
Скомпилировалось, но упало с ошибкой.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот GetLastError(). Она возвращает номер ошибки, по этому номеру можно нагуглить текст ошибки.
Какая ошибка то?
-=ЮрА=-
Заблокирован
Автор FAQ
03.04.2013, 12:41     Проблемы с загрузкой DLL #7
Цитата Сообщение от pivkos Посмотреть сообщение
Пока найти в гугле работающего рецепта решения проблемы не удалось.
- вот возьми простой пример с либой
Помогите с подключением dll к проекту
Я лично думаю что в проекте есть косяк с юникодом
Цитата Сообщение от pivkos Посмотреть сообщение
L"pHash.dll"
, либо pHash.dll не лежит в папке проекта.

Добавлено через 22 секунды
Вот ещё пример структура в dll
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 13:15  [ТС]     Проблемы с загрузкой DLL #8
Какая ошибка то?
Ошибка: 0xC0000005: Access violation

На этой строке:
C++
1
_ph_dct_imagehash("test.jpg", myhash);
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 13:18     Проблемы с загрузкой DLL #9
а GetProcAddress() точно то что надо возвращает?
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 13:25  [ТС]     Проблемы с загрузкой DLL #10
Затрудняюсь ответить. А как это проверить?
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 13:27     Проблемы с загрузкой DLL #11
If the function succeeds, the return value is the address of the exported function or variable.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Проверь не NULL ли там. Можно в отладчике, можно напечатать.
C++
1
std::cout << std::hex << (unsigned long long) _ph_dct_imagehash << std::endl;
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 13:35  [ТС]     Проблемы с загрузкой DLL #12
Посмотрел в отладчике:
В _ph_dct_imagehash - 0x00000000

А в чём может быть причина? Ведь на вид всё правильно. Или я ошибаюсь?

Добавлено через 4 минуты
GetLastError вернул ошибку 127
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2013, 13:56     Проблемы с загрузкой DLL
Еще ссылки по теме:

C++ Добавление своей dll в список dll подгружаемых процессом чужого процесса
C++ Visual Studio LightSwitch, ошибка с загрузкой символов
Обращение к ресурсам DLL из самой DLL C++
Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL C++
C++ Сохранение вектора в файл работает, а с загрузкой из файла беда

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4261 / 2793 / 219
Регистрация: 12.12.2009
Сообщений: 7,120
Записей в блоге: 1
Завершенные тесты: 1
03.04.2013, 13:56     Проблемы с загрузкой DLL #13
Цитата Сообщение от pivkos Посмотреть сообщение
А в чём может быть причина?
Причина может быть в том, что функция после "украшения имен" называется не "ph_dct_imagehash", а как-нибудь по-другому.
Я в Total Commander'е смотрел реальное название функций. Там есть функция "просмотр" (или как-то так), которая показывает имена из dll'ки. Непомню входит ли в пакет MinGW утилита nm, если входит и есть MinGW, то можно ей посмотреть. Можно еще погуглить, как имена функций в dll глянуть.
Yandex
Объявления
03.04.2013, 13:56     Проблемы с загрузкой DLL
Ответ Создать тему
Опции темы

Текущее время: 22:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru