;
_ltext ends
end
delphi 会为单元的 initialization/finalization 建立代码调用外部过程 handlefinaly 和 initialization ,即使 initialization/finalization 在单元中不存在。因此我们在汇编的启动文件中建立空的外部过程入口。
主 delphi
程序单元(vxdprocs.pas)
procedure shellmessage(handle, flags : integer; const message, caption : pchar;
callback, referencedata : pointer); stdcall; assembler;
asm
mov ebx, handle // virtual machine handle
mov eax, flags // message box flags
mov ecx, message // address of message text
mov edi, caption // address of caption text
mov esi, callback // address of callback
mov edx, referencedata // reference data for callback
int 20h // vxdcall
dd 170004h // shell_message
end;
function sysdynamicdeviceinit : integer;
begin
shellmessage(0, $10, copyright, ’sysdyninit: hello from delphi vxd !!!’, nil, nil);
result := vxd_success;
end;
function sysdynamicdeviceexit : integer;
begin
shellmessage(0, $10, copyright, ’sysdyndevexit: bye from delphi vxd !!!’, nil, nil);
result := vxd_success;
end;
function w32deviceiocontrol(dwservice : integer;
dwddb : integer;
hdevice : integer;
lpdiocparms : pointer) : integer;
begin
shellmessage(0, $10, copyright, ’w32devioctl’, nil, nil);
if (dwservice = dioc_open) then
begin
result := no_error;
end
else if (dwservice = dioc_closehandle) then
begin
result := vxd_success;
end
else if (dwservice > max_pasvxd_w32_api) then
begin
result := error_not_supported;
end
else
begin
result := vxd_success;
end;
end;
[译者:好了,简单的 vxd 设备驱动程序编写完毕了。你可以将它当作一个写 vxd 设备驱动
程序的
模板。]
附一:make.bat
d:\visual~1\98ddk\bin\win98\ml -coff -dbld_coff -dis_32 -w2 -c -cx -zm -dmasm6 vxdmain.asm
call dcc3.bat -j vxdprocs.pas
d:\visual~1\98ddk\bin\link /def:vxddef.def /vxd vxdmain.obj vxdprocs /out:delphiio.vxd
附二:
现在让我们来编写对该 vxd 的测试
程序,两个按钮:一个打开 vxd;一个关闭 vxd。
const
vxdname = ’\\.\delphiio.vxd’;
function tvxdtestform.openvxddriver: boolean;
begin
hvxdhandle := createfile(vxdname,0,0,nil,0,file_flag_delete_on_close,0);&