Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Экспорт / Подмена DLL


Автор: MrKernighan 25.7.2011, 19:26
Доброго времени суток Уважаемые эксперты. Я разобрался с проблемой "Точка входа в процедуру 'x' не найдена в DLL 'y'" но теперь возникла другая проблема (смотреть скрин), я уже устал и честно даже не знаю что уже делать.
Я тупой и наверное я не программист и больше слов у меня нет. Это уже 4 или 5 день от когда я взялся за эту задачу...

http://radikal.ru/F/i018.radikal.ru/1107/a5/e4ae866e0afb.jpg.html

Порыскал google, он мне сказал что такая проблема происходит когда где-то памяти не может произойти запись куда-то, таки да, открыл свой *.exe могучей Олькай, так она остановилась на этом месте (смотреть скрин).
Вообще *.exe работает отлично, не подумайте что это могут проблемы в *.exe, проблема изза моей *.dll

http://radikal.ru/F/i073.radikal.ru/1107/b4/98332c3ca1b4.jpg.html

~Описываю все действия что я сделал:
1) Подставил фейк opengl32.dll в директорию  с моим приложением чтобы происходило чтение моей *dll а не оригинальной opengl32 из системной директории.
2) Экспортирую все функции используемые *.exe приложением следующим образом. Код объемный в 2к с копейками строчек, изза количество функций, поэтому вынужден сделать вложение но приведу еще 1 пример как я это делаю.
 # Указатель на оригинальную функцию
  - void (APIENTRY *ptr_glAccum) (GLenum op, GLfloat value);
 # Получаем модуль 
  - HMODULE hDLL = LoadLibraryA("c:\windows\system32\opengl32.dl)
 # Получаем адрес ориг. функции
  - (FARPROC&)ptr_glAccum = GetProcAddress(hDLL, "glAccum");
 # Экспортируемая функция
  - DLLExport void __stdcall glAccum(GLenum op, GLfloat value) {           ptr_glAccum(op, value); }

И конечно же *.def файл

Код
LIBRARY test
EXPORTS
glAccum
...

Благодаря definition файл я избавился от проблемы с точкой входа. Но что еще им нужно от меня? Что я упустил?
Я скажу не то что спасибо, я скажу нереально огромное спасибо за подсказку.

Автор: bsa 25.7.2011, 23:30
Ошибка здесь:
Код
char *GetLibraryDir(char *SysDLLName) {
    char *pBuffer;
    GetSystemDirectoryA(pBuffer, 255); //ты говоришь функции, что у тебя УЖЕ ЕСТЬ буфер на 255 чаров
    lstrcatA(pBuffer, SysDLLName);
    return pBuffer;
}
Убери эту функцию. Вообще.

Автор: MrKernighan 26.7.2011, 00:52
Вот я лось тупорылый... bsa Низкий тебе поклон и огромное тебе спасибо, я уж думал мне решить этой задачи.

#Проблема решена.

Автор: ASMatic 28.7.2011, 14:33
MrKernighan, дабы не парится в будущем с непонятными сепшинами в юм
http://wasm.ru/forum/viewtopic.php?id=32181
полезная вещь от Clerk-а smile 

Автор: Dem_max 29.7.2011, 05:15
Цитата

 HMODULE hDLL = LoadLibraryA("c:\windows\system32\opengl32.dl)

тут тоже не правильно, нужно делать так
Код

 HMODULE hDLL = LoadLibraryA("c:\\windows\\system32\\opengl32.dl)

Автор: Alca 29.7.2011, 09:48
Не, так лучше  smile:
Код

HMODULE hDLL = LoadLibraryA("c:/windows/system32/opengl32.dl)

Автор: GremlinProg 29.7.2011, 13:29
еще лутше так
Цитата(Alca @  29.7.2011,  11:48 Найти цитируемый пост)
HMODULE hDLL = LoadLibraryA("c:/windows/system32/opengl32.dl")

 smile 

Автор: Dik0n 29.7.2011, 17:32
А всех лучше так  smile 
Цитата(GremlinProg @  29.7.2011,  13:29 Найти цитируемый пост)
HMODULE hDLL = LoadLibraryA("c:/windows/system32/opengl32.dll")


Автор: Alca 29.7.2011, 17:39
Не, так:
Цитата

HMODULE hDLL = ::LoadLibraryA("c:/windows/system32/opengl32.dll");

 smile 

Автор: volatile 29.7.2011, 23:33
Вы все что-то добавляете и добавляете, ... зачем?
Цитата
HMODULE hDLL = ::LoadLibraryA("c:/windows/system32/opengl32.dll");


1. Винда может находиться и не в "c:/windows" (и в этом случае код работать не будет)
2. Системная папка винды (system32) полюбому находится в путях поиска dll. (иначе и быть не может)

так что, :
Код

HMODULE hDLL = ::LoadLibraryA("opengl32.dll");

 smile 

Автор: bass 30.7.2011, 09:23
Цитата(volatile @ 29.7.2011,  23:33)
Вы все что-то добавляете и добавляете, ... зачем?
Цитата
HMODULE hDLL = ::LoadLibraryA("c:/windows/system32/opengl32.dll");


1. Винда может находиться и не в "c:/windows" (и в этом случае код работать не будет)
2. Системная папка винды (system32) полюбому находится в путях поиска dll. (иначе и быть не может)

так что, :
Код

HMODULE hDLL = ::LoadLibraryA("opengl32.dll");

 smile

Читай тему с начало..... В нашей папке есть такая длл и подгрузиться она... Дальше при вызове функции все заклиниться...... -))))))) 
GetSystemDirectory Поможет -))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)