pb调外部dll问题

soar_angel 2013-04-01 11:05:08
我想调用kernel32.dll下的DeviceIoControl方法:声明如下
FUNCTION ulong DeviceIoControl(ulong hDevice,ulong dwIoControlCode,tsendcmdinparams lpInBuffer,ulong nInBufferSize,ref char lpOutBuffer[528],ulong nOutBufferSize,ref ulong lpBytesReturned,ulong lpOverlapped) LIBRARY "kernel32.dll"
在pb9中是可以的,但是到pb12中就报错,请问各位大侠,tsendcmdinparams 是个什么,有没有解决方案?
...全文
1023 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
soar_angel 2013-04-03
  • 打赏
  • 举报
回复
问题已解决,在此谢过。
soar_angel 2013-04-02
  • 打赏
  • 举报
回复
引用 11 楼 ekin751284 的回复:
引用 9 楼 soar_angel 的回复: 我的程序跑到调用DeviceIoControl的地方,返回值是0,用pb9同样的代码,返回值是1,并且能取出我想要的硬盘id。pb12就不行! 你用GetLastError() 获取下错误代码 FUNCTION ulong GetLastError() LIBRARY "kernel32.dll" ALIAS FOR "GetLastError……
ll_ref = DeviceIoControl(ulDevice,DFP_RECEIVE_DRIVE_DATA, SCIP, 32,REF aIdOutCmd, 528, ulBytesReturned, ulNull) ll_flag = GetLastError()我这样调用之后,ll_flag值为0,ll_ref返回值也是0
soar_angel 2013-04-01
  • 打赏
  • 举报
回复
引用 1 楼 ribut9225 的回复:
tsendcmdinparams是结构体?
是的,后来我editsource看到是结构体了,大侠我还有个问题请教,请问CreateFile,也是kernel32.dll里的,怎么调用,为什么我的返回值总是4294967295??解决后,会继续追加分数的。
ribut9225 2013-04-01
  • 打赏
  • 举报
回复
tsendcmdinparams是结构体?
Eetze 2013-04-01
  • 打赏
  • 举报
回复
引用 9 楼 soar_angel 的回复:
我的程序跑到调用DeviceIoControl的地方,返回值是0,用pb9同样的代码,返回值是1,并且能取出我想要的硬盘id。pb12就不行!
你用GetLastError() 获取下错误代码 FUNCTION ulong GetLastError() LIBRARY "kernel32.dll" ALIAS FOR "GetLastError" 然后根据错误代码看一下是什么地方出错了 http://baike.baidu.com/view/1730168.htm
薛123 2013-04-01
  • 打赏
  • 举报
回复
引用 8 楼 soar_angel 的回复:
引用 7 楼 afu1972715000 的回复:你又想发个表情来蹭积分是不?
对呀对呀,这都被你发现了啊
soar_angel 2013-04-01
  • 打赏
  • 举报
回复
我的程序跑到调用DeviceIoControl的地方,返回值是0,用pb9同样的代码,返回值是1,并且能取出我想要的硬盘id。pb12就不行!
soar_angel 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 afu1972715000 的回复:
你又想发个表情来蹭积分是不?
薛123 2013-04-01
  • 打赏
  • 举报
回复
soar_angel 2013-04-01
  • 打赏
  • 举报
回复
FUNCTION ulong CreateFile(string lpFileName,ulong dwDesiredAccess,ulong dwShareMode,ulong lpSecurityAttributes,ulong dwCreationDisposition,ulong dwFlagsAndAttributes,ulong hTemplateFile) LIBRARY "kernel32.dll" alias for "CreateFileA;Ansi" FUNCTION ulong CloseHandle(ulong hObject) LIBRARY "kernel32.dll" FUNCTION ulong DeviceIoControl(ulong hDevice,ulong dwIoControlCode, tsendcmdinparams lpInBuffer,ulong nInBufferSize,ref char lpOutBuffer[528],ulong nOutBufferSize,ref ulong lpBytesReturned,ulong lpOverlapped) LIBRARY "kernel32.dll" 以上是外部函数的定义 ---------------------------------------------------------- 以下是代码调用 if env.ostype = windowsnt! then ulDevice = CreateFile('\\.\PHYSICALDRIVE0', GENERIC_READ + GENERIC_WRITE,FILE_SHARE_READ + FILE_SHARE_WRITE, ulNull, OPEN_EXISTING, 0, 0) elseif env.ostype = windows! then //98下需要写vxd文件支持,一般使用smartvsd.vxd,所以发布的时候最好带上这个文件 //安装到 WINDOWS\SYSTEM\IOSUBSYS 目录下,然后重新启动,找不到这个文件就google一下 ulDevice = CreateFile('\\.\SMARTVSD', 0, 0, ulNull,CREATE_NEW , 0, 0) else return '' end if if ulDevice <> INVALID_HANDLE_VALUE then SCIP.cbuffersize = 512 SCIP.irdriveregs.bSectorCountReg = char(1) SCIP.irdriveregs.bSectorNumberReg = char(1) SCIP.irDriveRegs.bDriveHeadReg = char(160) SCIP.irDriveRegs.bCommandReg = char(236) DeviceIoControl(ulDevice,DFP_RECEIVE_DRIVE_DATA, SCIP, 32,aIdOutCmd, 528, ulBytesReturned, ulNull) integer i for i = 37 to 56 step 2 strRet = strRet + aIdOutCmd[i+1] + aIdOutCmd[i] next else messagebox('','error file handle') end if if ulDevice > 0 then closehandle(ulDevice) end if return strRet ------------------------------------------------------------ 我想得到的是硬盘序列号
Eetze 2013-04-01
  • 打赏
  • 举报
回复
引用 2 楼 soar_angel 的回复:
引用 1 楼 ribut9225 的回复:tsendcmdinparams是结构体?是的,后来我editsource看到是结构体了,大侠我还有个问题请教,请问CreateFile,也是kernel32.dll里的,怎么调用,为什么我的返回值总是4294967295??解决后,会继续追加分数的。
你的返回值是 4294967295 那是因为你定义了 INVALID_HANDLE_VALUE 值为 4294967295 ,说明无效的返回值,你函数调用不成功,最好是把你调用的代码发上来看一下
Eetze 2013-04-01
  • 打赏
  • 举报
回复
引用 2 楼 soar_angel 的回复:
引用 1 楼 ribut9225 的回复:tsendcmdinparams是结构体?是的,后来我editsource看到是结构体了,大侠我还有个问题请教,请问CreateFile,也是kernel32.dll里的,怎么调用,为什么我的返回值总是4294967295??解决后,会继续追加分数的。
关于 CreateFile 的返回值 Return Value An open handle to the specified file indicates success. If the specified file exists before the function call and dwCreationDisposition is set to CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even though the function has succeeded. If the file does not exist before the call, GetLastError returns zero. INVALID_HANDLE_VALUE indicates failure. To get extended error information, call GetLastError.

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧