Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2012, 21:09   #1
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию Динамическая загрузка dll

Здравствуйте, у меня возникла проблема с динамической загрузкой dll.
Проблемы вызова функции библиотеки находящейся в памяти через GetModuleHandle не возникает. Трабл с ф-ей LoadLibrary.

вот код моей тестовой библиотеки
Код:
dllhead.h

#include "stdafx.h"
#include "iostream"

using namespace std;

extern "C++" _declspec(dllexport) int myfunction(int, int);

________________________________________

#include "stdafx.h"
#include "dllhead.h"

extern "C++" _declspec(dllexport) int myfunction(int one,int two) {
	int sum=one+two;
	return sum;

}

Вот программа импорта ф-ии из dll.

Код:

#include "stdafx.h"
#include "process.h"
#include "windows.h"
#include "iostream"

using namespace std;

typedef  int (WINAPI *PGNSI)(int,int);


int _tmain(int argc, _TCHAR* argv[])
{

PGNSI GetDll;
HMODULE hint;

if((hint= LoadLibrary("dlltest"))==NULL) { MessageBox(0,"loading","error",0) ; }

GetDll=(PGNSI) GetProcAddress(hint,"myfunction");

int p=GetDll(4,4);

std::cout << p << std::endl;

system("pause");
	return 0;
}
Ошибка - Необработанное исключение в "0x00000000" в "Dll_exportprog.exe": 0xC0000005: Access violation.

Последний раз редактировалось Stilet; 19.06.2012 в 21:38.
Dizelektwo вне форума Ответить с цитированием
Старый 19.06.2012, 21:30   #2
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

скорее всегда функция экспортируется, то имени отличном от "myfunction", скорее всего там суффикс есть тира "@8". посмотрите таблицу экпорта через LordPE или другую подобую программу

после GetProcAddress обычно проверяют результат её выполнения на нулевой результат
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 19.06.2012, 21:36   #3
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

скорее всегда функция экспортируется, то имени отличном от "myfunction", скорее всего там суффикс есть тира "@8". посмотрите таблицу экпорта через LordPE или другую подобую программу

после GetProcAddress обычно проверяют результат её выполнения на нулевой результат
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 19.06.2012, 22:16   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам нужно экспортировать строго через def файл.
иначе обрастает постфиксами.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.06.2012, 22:26   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ещё есть SafeLoadLibrary
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2012, 22:39   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это делфи функция, и дело не в этом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2012, 13:55   #7
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Пепел Феникса

Низкий поклон Вам и всем тем, кто откликнулся. Добавил def файл- проблема решена.
Зубодробительные и интуитивно не понятные ямы от майкрософта. Ухайдокал целый вечер на эту мелочь.

Если Вам не трудно, подскажите, есть ли еще какие либо методы динамической загрузки Dll? Говорю к тому, что бы не таскать файлы dll, библиотеки экспорта и деф файл.
Нужно копаться в таблице экспорта и указывать адрес вызываемой ф-ии из библиотеки вручную , да?
Dizelektwo вне форума Ответить с цитированием
Старый 20.06.2012, 16:32   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
что бы не таскать файлы dll
эмм?
а из чего грузить будете?
Цитата:
библиотеки экспорта и деф файл.
деф файл нужен для правильного экспорта во вне, при компиляции длл.
библиотека экспорта? может импорт к длл, нужен для статической загрузки длл, и лишь при компиляции приложения нужен(и то при статической линковке)
Цитата:
Зубодробительные и интуитивно не понятные ямы от майкрософта.
правда?
в msdn описаны оба способа экспорта, описано какой когда нужен.
Цитата:
Нужно копаться в таблице экспорта и указывать адрес вызываемой ф-ии из библиотеки вручную , да?
это за вас делает GetProcAddress.
просто у вас при импорте было не правильное имя.

кратко процитирую ту статью про экспорт.
dllexport/dllimport применяется в случае, если нужен статический импорт в итоге.
причем как длл, так и приложение её применяющее пишется на одной версии компилятора.
этот метод кодирует параметры в постфикс имени функции.
например функция void __stdcall do(void*);
будет экспортирована как do@4.

def файл применяет для явного задания имен экспортируемых функций и их индексов.
применяется для динамической загрузки(так как имя будет строго то что вы задали) и в случае если разные версии компилятора(в том числе разные ЯП)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 20.06.2012 в 16:42.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2012, 16:56   #9
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Про Dll и таблицу экспорта я конечно от спешки намелил невесть чего. В общем теперь все стало ясно. Еще раз Большое спасибо

Последний раз редактировалось Dizelektwo; 20.06.2012 в 16:59.
Dizelektwo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая загрузка статического метода из DLL Granus Общие вопросы C/C++ 6 15.02.2012 15:47
Динамическая загрузка формы из DLL grominfo Помощь студентам 1 15.11.2011 17:10
Посоветуйте с DLL (динамическая загрузка) yasic Общие вопросы Delphi 4 18.01.2011 18:24
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Динамическая загрузка DLL ImportDLL Общие вопросы C/C++ 2 12.06.2009 11:33