C++源代码如下:
class DriverOperation
{
public:
DriverOperation(char* sDevName1,char* sSrvName1,char* sFileName1);
HANDLE GetDeviceHandle();
~DriverOperation()
{
/*
对象析构时自动卸载驱动,
程序退出时,对象自动析构
*/
UnLoadDriver();
CloseHandle(hDevice);
}
private:
char* sDevName;
char* sSrvName;
char* sFileName;
HANDLE hDevice;
private:
int LoadDriver();
int UnLoadDriver();
HANDLE ConnectDriver();
void GetSysPath();
void PrintError(DWORD ErrorCode);
};#define DEVICE_NAME "\\\\.\\DRIVER2_DeviceName_3"
HANDLE hDevice;
DriverOperation DrvOp(DEVICE_NAME,"myDrv","Driver2.sys");
void CommonInit();void CommonInit()
{
hDevice=DrvOp.GetDeviceHandle();
}void SetPortB(WORD wIoPort, BYTE bData)
{
DWORD dwReturn;
BYTE indata[3];
*((WORD*)indata)=wIoPort;
indata[2]=bData;
DeviceIoControl(hDevice,IOCTL_WRITEIO,indata,sizeof(indata),NULL,0,&dwReturn,NULL);
}转成Delphi代码如下:
type
TDriverOperation = class
private
sDevName: PChar;
sSrvName: PChar;
sFileName: PChar;
hDevice: THandle;
function LoadDriver(): Integer;
function UnLoadDriver(): Integer;
function ConnectDriver(): THandle;
procedure GetSysPath();
procedure PrintError(ErrorCode: DWORD);
public
procedure DriverOperation(sDevName1, sSrvName1, sFileName1: PChar);
function GetDeviceHandle(): THandle; end;const
DEVICE_NAME = '\\\\.\\DRIVER2_DeviceName_3';var
hDevice: THandle;
DrvOp: TDriverOperation;
procedure CommonInit();implementationprocedure CommonInit();
begin
DrvOp := TDriverOperation.Create;
DrvOp.DriverOperation(PChar(DEVICE_NAME),PChar('myDrv'),PChar('Driver2.sys'));
hDevice := DrvOp.GetDeviceHandle();
end;procedure SetPortB(wIoPort: WORD; bData: Byte);
var
dwReturn: DWORD;
indata: array[0..2] of Byte;
begin
PWORD(indata[0])^ := wIoPort;
indata[2] := bData;
DeviceIoControl(hDevice, IOCTL_WRITEIO, @indata, sizeof(indata), nil, 0, dwReturn, nil);
end;procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
CommonInit();
Sleep(1000);
SetPortB($64, $D2); //调用SetPortB出错 错误提示:Access violation at address 004568D4 in module 'Project1.exe'. Write of address 000000EA.
SetPortB($60, $1C);
Sleep(100);
SetPortB($64, $D2);
SetPortB($64, $1C or $80);
end;错在哪里?请高手指点 分不够再加! 先谢谢了!
class DriverOperation
{
public:
DriverOperation(char* sDevName1,char* sSrvName1,char* sFileName1);
HANDLE GetDeviceHandle();
~DriverOperation()
{
/*
对象析构时自动卸载驱动,
程序退出时,对象自动析构
*/
UnLoadDriver();
CloseHandle(hDevice);
}
private:
char* sDevName;
char* sSrvName;
char* sFileName;
HANDLE hDevice;
private:
int LoadDriver();
int UnLoadDriver();
HANDLE ConnectDriver();
void GetSysPath();
void PrintError(DWORD ErrorCode);
};#define DEVICE_NAME "\\\\.\\DRIVER2_DeviceName_3"
HANDLE hDevice;
DriverOperation DrvOp(DEVICE_NAME,"myDrv","Driver2.sys");
void CommonInit();void CommonInit()
{
hDevice=DrvOp.GetDeviceHandle();
}void SetPortB(WORD wIoPort, BYTE bData)
{
DWORD dwReturn;
BYTE indata[3];
*((WORD*)indata)=wIoPort;
indata[2]=bData;
DeviceIoControl(hDevice,IOCTL_WRITEIO,indata,sizeof(indata),NULL,0,&dwReturn,NULL);
}转成Delphi代码如下:
type
TDriverOperation = class
private
sDevName: PChar;
sSrvName: PChar;
sFileName: PChar;
hDevice: THandle;
function LoadDriver(): Integer;
function UnLoadDriver(): Integer;
function ConnectDriver(): THandle;
procedure GetSysPath();
procedure PrintError(ErrorCode: DWORD);
public
procedure DriverOperation(sDevName1, sSrvName1, sFileName1: PChar);
function GetDeviceHandle(): THandle; end;const
DEVICE_NAME = '\\\\.\\DRIVER2_DeviceName_3';var
hDevice: THandle;
DrvOp: TDriverOperation;
procedure CommonInit();implementationprocedure CommonInit();
begin
DrvOp := TDriverOperation.Create;
DrvOp.DriverOperation(PChar(DEVICE_NAME),PChar('myDrv'),PChar('Driver2.sys'));
hDevice := DrvOp.GetDeviceHandle();
end;procedure SetPortB(wIoPort: WORD; bData: Byte);
var
dwReturn: DWORD;
indata: array[0..2] of Byte;
begin
PWORD(indata[0])^ := wIoPort;
indata[2] := bData;
DeviceIoControl(hDevice, IOCTL_WRITEIO, @indata, sizeof(indata), nil, 0, dwReturn, nil);
end;procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
CommonInit();
Sleep(1000);
SetPortB($64, $D2); //调用SetPortB出错 错误提示:Access violation at address 004568D4 in module 'Project1.exe'. Write of address 000000EA.
SetPortB($60, $1C);
Sleep(100);
SetPortB($64, $D2);
SetPortB($64, $1C or $80);
end;错在哪里?请高手指点 分不够再加! 先谢谢了!
PWORD(indata[0])^ := wIoPort; 这里错了
PWORD(@indata)^ := wIoPort;
这样试下
按8楼提示 我也已经改了 确实不再有错误提示
procedure TForm1.Button1Click(Sender: TObject);
begin
CommonInit();
Sleep(100);
SetPortB($64, $D2);
Sleep(10);
SetPortB($60, $1C);
Sleep(10);
SetPortB($64, $D2);
Sleep(10);
SetPortB($64, $1C or $80);
end;
但以上代码(模拟按回车键)并没有达到效果
谢谢5楼的朋友
我自己改好了 主要是因为 在C++中 DriverOperation是构造函数 所以要转为Delphi中相应的构造函数我没用过C++ 不了解 原来是点小问题