Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 536

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Незнаю почему, но компилятор выдаёт ошибку... Процедуру RunStopHook я объявил как экспортную, она пока что пустая, т.е.

begin
end;

Помогите плиз! Работаю без формы, через VievSourse.

ЗЫ Ругается именно на вызов процедуры, по закрытии программы. Если убрать вызов процедуры, то всё будет без проблем.

ЗЫЫ Ошибка: Project E:\... failed with message^ 'access violation at 0x0040361b: read of address 0x00000000'. ...

Приложение:
  1. program myprogram;
  2.  
  3. uses
  4. Windows,
  5. SysUtils;
  6.  
  7. {$R *.res}
  8.  
  9. var
  10.  
  11. text_f : textfile;
  12. windir : array [0..255] of char;
  13. dir : string;
  14.  
  15. procedure RunStop(State : Boolean) stdcall;
  16. external 'hack.dll' index 1;
  17.  
  18. begin
  19.  
  20. GetWindowsDirectory(windir, 255);
  21. dir := windir + 'log_padonak.log';
  22. assignfile(text_f, dir);
  23.  
  24. if not FileExists(dir) then
  25. begin
  26. Rewrite(text_f);
  27. CloseFile(text_f);
  28. end;
  29.  
  30. RunStop(true);
  31.  
  32. While GetKeyState(27) > -120 do
  33.  
  34. begin
  35.  
  36.  
  37.  
  38. end;
  39.  
  40. RunStop(false);
  41.  
  42. end.


padonak Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: padonak (статус: Посетитель)
Вопрос отправлен: 25 августа 2010, 15:33
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, padonak!
в коде есть одна явная ошибка, и одна потенциальная.
явная заключается в том, что если мы экспортируем функцию как stdcall, то нужно так ее в dll и отдавать. Поэтому либо в dll при объявлении функции пишем так

procedure RunStopHook(State : Boolean); stdcall;
 
begin
 
end;
 
exports RunStopHook index 1;
Либо убираем stdcall в обоих местах.

Неявная ошибка заключается в типе boolean. Вообще то с ним проблем не должно быть, но это не windows тип. Правильный тип выглядит так LongBool,тогда и другие языки программирования точно смогут использовать эту библиотеку.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 25 августа 2010, 15:52
Оценка за ответ: 5

Комментарий к оценке: помогло... спс...

Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 25 августа 2010, 15:45; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 25 августа 2010, 15:44 [#1]:

Недостаточно информации.
в исходниках приведено ссылку на RunStop, а в вопросе звучит RunStopHook, библиотека hack.dll своя с пустой процедурой или это чужая. если своя, то нужно ее тоже приводить.
Галочка "подтверждения прочтения" - вселенское зло.
padonak

padonak (статус: Посетитель), 25 августа 2010, 15:45 [#2]:

dll:

library hack;

uses
Windows, SysUtils, Classes;

procedure RunStopHook(State : Boolean);

begin

end;

exports RunStopHook index 1;
begin
end.




exe:

program padonak;

uses
Windows,
SysUtils;

{$R *.res}

var

text_f : textfile;
windir : array [0..255] of char;
dir : string;

procedure RunStopHook(State : Boolean) stdcall;
external 'hack.dll' index 1;

begin

GetWindowsDirectory(windir, 255);
dir := windir + '\log_padonak.log';
assignfile(text_f, dir);

if not FileExists(dir) then
begin
Rewrite(text_f);
CloseFile(text_f);
end;

RunStopHook(true);

While GetKeyState(27) > -120 do

begin



end;

RunStopHook(false);

end.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.02 сек.