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;错在哪里?请高手指点  分不够再加! 先谢谢了!

解决方案 »

  1.   

    先把c++的代码调通了,在来试delphi的
      

  2.   

    c++的代码调通过了  但转delphi的不成功啊
      

  3.   

    楼主留个邮箱,我有Delphi版驱动IO的代码,给你发过去
      

  4.   

    c/cpp的字符串中\是转义符,"\\\\.\\"翻delphi是'\\.\',不知道有没有可能这儿出了问题
      

  5.   


    PWORD(indata[0])^ := wIoPort; 这里错了 
      

  6.   


    PWORD(@indata)^ := wIoPort;
    这样试下 
      

  7.   

    按6楼提示 我已经更改为 DEVICE_NAME = '\\.\DRIVER2_DeviceName_3';
    按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楼的朋友 
      

  8.   

    收到了  是WinIO的  我已经有了  但还是谢谢你有个问题  WinIO好像不能模拟组合键  有人会吗?
      

  9.   

    没人看出来吗?还是没人愿意看  代码并不多啊
    我自己改好了 主要是因为 在C++中 DriverOperation是构造函数  所以要转为Delphi中相应的构造函数我没用过C++ 不了解 原来是点小问题