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

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

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

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

03.04.2013, 11:40. Просмотров 620. Ответов 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. Пробовал указать полный путь к библиотеке. Даже где-то нашёл совет двойной слэш ставить в пути. Не помогло. Не подгружается и всё.

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

Заранее огромное спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2013, 11:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с загрузкой DLL (C++):

Проблемы с dll - C++
Прошу помощи. Сам написал dll, функции из нёё исправно вызываются из приложения на С++, но во время работы все время скачет ошибка ...

Проблемы с Ati2dvag.dll - C++
когда роботаю в среде С++ выбиваэт синий екран и там много чего написано,типа проблемы с Ati2dvag.dll! што ето может быть? ошыбка...

Проблемы с isapi.dll - C++
na servere zapuskaju 4erez html ISAPI extensions://folder/mydll.dll,no zagruzaetsja pustaja stranica.Predvaritelno sozdala kak WIn32...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями? - C++
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL - C++
День добрый! При запуске моей программы (много моего кода + много разных сторонних dll) на WinXP SP2, получаем соответствующую ошибку...

Добавление своей dll в список dll подгружаемых процессом чужого процесса - C++
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не запущенного процесса?Не изменяя структуры файла.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 11:51 #2
Давно на WinAPI не кодил, там вроде есть что-то типа LastError(). Посмотри, что пишет, там будет более подробная информация типа "файл не найден" или "путь не существует", короче можно будет понять в чем причина.

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

Пока найти в гугле работающего рецепта решения проблемы не удалось.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 12:04 #4
Строка запроса "LoadLibrary error 14001". Очень много результатов.
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 12:24  [ТС] #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
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 12:39 #6
Цитата Сообщение от pivkos Посмотреть сообщение
Скомпилировалось, но упало с ошибкой.
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот GetLastError(). Она возвращает номер ошибки, по этому номеру можно нагуглить текст ошибки.
Какая ошибка то?
-=ЮрА=-
Заблокирован
Автор FAQ
03.04.2013, 12:41 #7
Цитата Сообщение от pivkos Посмотреть сообщение
Пока найти в гугле работающего рецепта решения проблемы не удалось.
- вот возьми простой пример с либой
Помогите с подключением dll к проекту
Я лично думаю что в проекте есть косяк с юникодом
Цитата Сообщение от pivkos Посмотреть сообщение
L"pHash.dll"
, либо pHash.dll не лежит в папке проекта.

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

На этой строке:
C++
1
_ph_dct_imagehash("test.jpg", myhash);
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 13:18 #9
а GetProcAddress() точно то что надо возвращает?
pivkos
0 / 0 / 0
Регистрация: 11.08.2009
Сообщений: 9
03.04.2013, 13:25  [ТС] #10
Затрудняюсь ответить. А как это проверить?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 13:27 #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  [ТС] #12
Посмотрел в отладчике:
В _ph_dct_imagehash - 0x00000000

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

Добавлено через 4 минуты
GetLastError вернул ошибку 127
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
03.04.2013, 13:56 #13
Цитата Сообщение от pivkos Посмотреть сообщение
А в чём может быть причина?
Причина может быть в том, что функция после "украшения имен" называется не "ph_dct_imagehash", а как-нибудь по-другому.
Я в Total Commander'е смотрел реальное название функций. Там есть функция "просмотр" (или как-то так), которая показывает имена из dll'ки. Непомню входит ли в пакет MinGW утилита nm, если входит и есть MinGW, то можно ей посмотреть. Можно еще погуглить, как имена функций в dll глянуть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2013, 13:56
Привет! Вот еще темы с ответами:

Как узнать путь к загруженной DLL из самой DLL? - C++
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/. В коде самой dll, после её подгрузки в программу, можно...

Запись из внедренной dll в другую dll этого процесса - C++
main.cpp #include &lt;Windows.h&gt; extern int writeprocess(); DWORD WINAPI MainThread(LPVOID lpParam) { ...

Dll файл в exe файле. Вшить dll libcurl - C++
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все носить в одном exe. Enigma Virtual Box использовать нельзя,...

При компиляции DLL-проекта не создается DLL-ка - C++
Добрый день. создал в Visual Studio 2010 проект C+= типа DLL. В файл dllmain.cpp вставил вот такой код: // test.cpp: определяет...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.04.2013, 13:56
Ответ Создать тему
Опции темы

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