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的指针不是太了解
其中bws是指针吧去掉@或改成
bws:= AllocMem(sizeof(PCOM_WAIT_STATUS));看看
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,怪不得,不知道是不是这个原因