typedef struct _COM_WAIT_STATUS { 
    ULONG       COMTag; 
    ULONG       COMout; 
    ULONG       COMState; 
 
} COM_WAIT_STATUS, *PCOM_WAIT_STATUS; 
typedef struct _COM_STATUS { 
    ULONG       COMState; 
    ULONG       COMCAP; 
} COM_STATUS, *PCOM_STATUS; COM_WAIT_STATUS bws;
COM_STATUS bs;
DWORD rbytes;
memset(&bws,0,sizeof(bws));
BOOL r = DeviceIoControl(
m_COM,
IOCTL_COM_QUERY_STATUS,
&bws,
sizeof(bws),
&bs,
sizeof(bs),
&rbytes,
NULL);///////////////////////////////
上面DeviceIoControl函数中的m_COM,
IOCTL_COM_QUERY_STATUS,
这两个是const的常量,暂时不用管
以上我在VC中实验是正确的,返回true
//////////////////////////////////我转为delphi如下
typeCOM_STATUS = ^PCOM_STATUS ;
PCOM_STATUS = packed record
 COMState:ulong;
 COMCAP:ulong;end;COM_WAIT_STATUS =  ^PCOM_WAIT_STATUS ;
 PCOM_WAIT_STATUS  = packed record
 COMTag:ulong;
 COMout:ulong; 
 COMState:ulong;end;
var
bws:COM_WAIT_STATUS ;
bs:COM_STATUS;
begin
 bws:= AllocMem(sizeof(@bws));
 DeviceIoControl(m_COM,IOCTL_COM_QUERY_STATUS,@bws,sizeof(bws),bws,sizeof(bs),rbytes,nil);DeviceIoControl总是返回false
结果用GetLastError查询提示--》提供给请求操作的用户缓冲区无效请问我哪里写错了吗?对于Delphi的指针不是太了解

解决方案 »

  1.   

    bws:= AllocMem(sizeof(@bws));
    其中bws是指针吧去掉@或改成
    bws:= AllocMem(sizeof(PCOM_WAIT_STATUS));看看
      

  2.   

    DeviceIoControl(
     hDevice: THandle; 
     dwIoControlCode: DWORD; 
     lpInBuffer: Pointer;
     nInBufferSize: DWORD;
     lpOutBuffer: Pointer; 
     nOutBufferSize: DWORD;
     var lpBytesReturned: DWORD; 
    lpOverlapped: POverlapped): DeviceIoControl(
        HANDLE hDevice,
        DWORD dwIoControlCode,
        LPVOID lpInBuffer,
        DWORD nInBufferSize,
        LPVOID lpOutBuffer,
        DWORD nOutBufferSize,
        LPDWORD lpBytesReturned,
        LPOVERLAPPED lpOverlapped
        );我居然发现vc和Delphi定义这个函数的参数类型不一样,注意倒数第二个参数,VC里是指针,delphi里成了dword,怪不得,不知道是不是这个原因