Filemapping

Тема в разделе "Delphi - Система", создана пользователем Nowichok, 7 дек 2006.

  1. Nowichok

    Nowichok Гость

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

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

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

    zubr Гость

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

    Nowichok Гость

    Пробовал - не помогает ;). Вот верно подмечено - вроде бы всё правильно, но почему-то глючит :(
     
  4. Dec

    Dec Гость

    Код (Text):
    procedure DLLEntryPoint(dwReason: DWord); stdcall;
    уберите stdcall
     
  5. Nowichok

    Nowichok Гость

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

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

    Barmutik Гость

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

    Nowichok Гость

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

    Barmutik Гость

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

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

Поделиться этой страницей