![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура прерывания. В Delphi 7 pointer ?
Who_is_you? © (2009-12-25 15:28:00)Подскажите, пожалуйста.
Есть процедура. Описывается она у автора так:
С++: void xDRV_InitInterput(void(*FunAdr)(void* p), void* param);
Delphi: procedure xDRV_InitInterput(F: IntrFun; D: pointer);
Когда я вставляю её у себя, то Delphi 7 ругается
Unsafe type 'Pointer' на след. строки:
IntrFun = procedure(var param: pointer);
procedure xDRV_InitInterput(F: IntrFun; D: pointer); cdecl; external 'xDRV.dll';
procedure MyInterrupt(param: pointer);
А вот начало самой проги:
unit LPT_UnitxDRV;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
IntrFun = procedure(var param: pointer);
function xDRV_OpenDriver():Boolean; cdecl; external 'xDRV.dll';
procedure xDRV_StopDriver(); cdecl; external 'xDRV.dll';
procedure xDRV_Write(PortAdr: LongInt; PortValue: Byte); cdecl; external 'xDRV.dll';
function xDRV_Read(PortAdr: LongInt): Byte; cdecl; external 'xDRV.dll';
procedure xDRV_InitInterput(F: IntrFun; D: pointer); cdecl; external 'xDRV.dll';
type
TForm1 = class(TForm)
StopDriver: TButton;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
procedure StopDriverClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Busy,Strobe0,Strobe1,ACK :Byte;
Bidirection,HostBusy0,HostBusy1,PrtClk,HostClk0,HostClk1 :Byte;
implementation
{$R *.dfm}
procedure MyInterrupt(param: pointer);
begin
ShowMessage('Произошло прерывание');
end;
Who_is_you? (2009-12-28 09:51:00) [1]
> Юрий Зотов © (26.12.09 23:24) [11]
> > Who_is_you? © (26.12.09 23:20) [10]
>
> Просто не обращайте внимания. Или отключите это предупреждение
> в опциях проекта. В данном конкретном случае оно не опасно.
>
Понял. Спасибо за ответ.
Юрий Зотов (2009-12-26 23:24:00) [2]> Who_is_you? © (26.12.09 23:20) [10]
Просто не обращайте внимания. Или отключите это предупреждение в опциях проекта. В данном конкретном случае оно не опасно.
Who_is_you? (2009-12-26 23:20:00) [3]Так кто-нибудь подскажет?
Как правильно написать выделенные жирным строчки:
type
IntrFun = procedure(var param: pointer);
procedure xDRV_InitInterput(F: IntrFun; D: pointer); cdecl; external 'xDRV.dll';
implementation
{$R *.dfm}
procedure MyInterrupt(param: pointer);
begin
ShowMessage('Произошло прерывание');
end;
чтобы Delphi 7 не ругался Unsafe type 'Pointer'
Германн (2009-12-26 02:25:00) [4]
> [Warning] в переводе с буржуйского - это не [Ругаюсь].
Уточню. "Warning" - предупреждение, что сейчас это нормально сработает. Но нет никакой гарантии, что эта сентеция нормально сработает в будущем.
Хотя практика показывает, что эти ворнинги - фигня.
Но... Решать автору.
Сергей М. (2009-12-25 21:30:00) [5]
> Who_is_you? © (25.12.09 20:34) [7]
[Warning] в переводе с буржуйского - это не [Ругаюсь].
Да и цветочки это.
Грабли еще ждут тебя впереди.
С какой стати тип IntrFun у тебя задан с дифолтным [pascal fastcall] соглашением ?
Who_is_you? (2009-12-25 20:34:00) [6]На что ругается компилятор выделенно жирным.
> unit LPT_UnitxDRV;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Variants, Classes, Graphics,
> Controls, Forms,
> Dialogs, StdCtrls;
>
> type
> IntrFun = procedure(var param: pointer);
>
> function xDRV_OpenDriver():Boolean; cdecl; external 'xDRV.
> dll';
> procedure xDRV_StopDriver(); cdecl; external 'xDRV.dll';
>
> procedure xDRV_Write(PortAdr: LongInt; PortValue: Byte);
> cdecl; external 'xDRV.dll';
> function xDRV_Read(PortAdr: LongInt): Byte; cdecl; external
> 'xDRV.dll';
> procedure xDRV_InitInterput(F: IntrFun; D: pointer); cdecl;
> external 'xDRV.dll';
>
> type
> TForm1 = class(TForm)
> StopDriver: TButton;
> Button1: TButton;
> Button2: TButton;
> Label1: TLabel;
> procedure StopDriverClick(Sender: TObject);
> procedure Button1Click(Sender: TObject);
> procedure Button2Click(Sender: TObject);
> procedure FormCreate(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> var
> Form1: TForm1;
> Busy,Strobe0,Strobe1,ACK :Byte;
> Bidirection,HostBusy0,HostBusy1,PrtClk,HostClk0,HostClk1
> :Byte;
>
> implementation
>
> {$R *.dfm}
>
> procedure MyInterrupt(param: pointer);
> begin
> ShowMessage('Произошло прерывание');
> end;
> <Цитата>
Anatoly Podgoretsky (2009-12-25 20:31:00) [7]> Who_is_you? (25.12.2009 20:29:05) [5]
Сделать типизированый указатель.
Who_is_you? (2009-12-25 20:29:00) [8]Так все три опасные и есть, нетипизированый указатель.
Так подскажите, пожалуйста, как правильно сделать?
Anatoly Podgoretsky (2009-12-25 17:53:00) [9]Так все три опасные и есть, нетипизированый указатель.
Who_is_you? (2009-12-25 17:45:00) [10]> Unsafe type 'Pointer' на след. строки: IntrFun = procedure(var
> param: pointer); procedure xDRV_InitInterput(F: IntrFun;
> D: pointer); cdecl; external 'xDRV.dll';procedure MyInterrupt(param:
> pointer);
на все три сразу чтоли?
Да, на все три.
Palladin (2009-12-25 15:45:00) [11]
> Unsafe type 'Pointer' на след. строки: IntrFun = procedure(var
> param: pointer); procedure xDRV_InitInterput(F: IntrFun;
> D: pointer); cdecl; external 'xDRV.dll';procedure MyInterrupt(param:
> pointer);
на все три сразу чтоли?
Сергей М. (2009-12-25 15:41:00) [12]
> вот начало самой проги
И где там те самые строки, на которые "ругается" ?