Filemapping

  • Автор темы Nowichok
  • Дата начала
N

Nowichok

#1
Проблема с FileMapping. Здесь выкладывать код не буду, т.к. будет тяжело читать. Кину ссылку на прогу, чтобы можно было легче понять мою проблему (проблема аналогична, что и в этой программе)

http://www.gamedev.ru/download/?id=4663 (сорри, чо-то файл сюда не загрузился сам... привожу ссылку на него).

Там две АБСОЛЮТНО одинаковые программы, работающие с хуком WH_GETMESSAGE и используют FileMapping. Кому не лень, пробегитесь глазами по КОДУ программ (он короткий). Если пустить обе программы и установить хки, то они работают...до N-го времени...а потом вылазит ошибка (когда приходит сообщение в аську ,агента..пускается игра и т.п.).
Я уже 3-й день бьюсь над этой проблемой, не понимаю, что не так...
Помогите, плз, кто чем может.
 
Z

zubr

#2
Так вроде беглым взглядом все правильно. Попробуй вместо:
Код:
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
сделать:
Код:
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 
N

Nowichok

#3
Пробовал - не помогает ;). Вот верно подмечено - вроде бы всё правильно, но почему-то глючит :(
 
D
#4
Код:
procedure DLLEntryPoint(dwReason: DWord); stdcall;
уберите stdcall
 
N

Nowichok

#5
директива StdCall :
Параметры помещаются в стек слева направо. Очистка стека осуществляется вызываемой процедурой. Этот вызов обеспечивает обработку фиксированного числа параметров

А может кто-нибудь объяснить, в чём будет разница, если я удалю StdCall в
Код:
 procedure DLLEntryPoint(dwReason: DWord); stdcall;
а то я слабо понимаю всё это...
 
B

Barmutik

#6
По умолчанию в Дельфях и так стоит stdcall... но если библиотека откуда Вы дёргаете функцию созданак на другом языке программирования, то у неё может быть другой call convention.. например cdecl... такие ньюансы часто приводят к сбоям и ошибкам при вызовах ...
 
N

Nowichok

#7
Немного не понял, как это отнести к проблеме текущей. Ведь и библиотека, и сам код писаны на Delphi.
Я проверял это не на этоих программах, что прикреплены к теме, я сейчас уже по другому пытасюь делать (не через файлмэппинг, а создаю окно через CreateWindow). Была ошибка при закрытии окна..так вот убрал StfCall - заработало....но почему - так и не понял
 
B

Barmutik

#8
Потому что CreateWindow экспортитяс из библиотеки написанной на C++, соответственно Call convention там cdecl, а Вы ставили stdcall... вот на выходе из процедуры на очищении стэка всё и падало .. Вы портили стэк...

Это никак в первой проблеме не относится .. это объяснение Вашего вопроса насчёт в чём разница...