haijie1223 发表于 2017-2-24 20:53:09

回复 15# nmgwddj
果然如此,又学到了。以前只知道是ptr*是直接到地址取值。原来*是引用。
那么上面的函数又可以精简了。

#NoTrayIcon
#RequireAdmin
#pre_usex64=n
#include <array.au3>
Local $array = ReadIDCardComm()
ConsoleWrite(@error & @CRLF)
_ArrayDisplay($array, @error)

Func ReadIDCardComm($iPort = 1001, $nTimeOut = 10000)
        Local $aRet = DllCall("IdReaderApiComm.dll", _
                        'int', 'ReadIDCardComm', _
                        'int', $iPort, _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'wstr', '', 'int*', '', _
                        'int', $nTimeOut)
        If Not @error Then Return $aRet
        Return SetError(@error, 0, 0)
EndFunc   ;==>ReadIDCardComm

仙乃日 发表于 2017-2-25 09:42:59

回复 16# haijie1223


    代码可以运行了,但读取出来全是乱码。
暂时使用控件对象可以正确读取了。#PRE_UseX64=n
$IdCard = ObjCreate("IDCARDREADER.IdCardReaderCtrl.1")
$IdCard.SetTimeout(5000); //设置读取超时时间
$IdCard.SetPort(1001); //设置 com 口号或 usb 后号
$IdCard.SetPicPath(@ScriptDir & "\ZP.bmp")
$iRet=$IdCard.ReadIDCard(); //开始读取
If $iRet<>0 Then
MsgBox(0,0,$IdCard.GetErrMsg())
Else
Local $Name=$IdCard.GetName(); //姓名
Local $Nation=$IdCard.GetNation(); //民族
Local $Address=$IdCard.GetAddress()
Local $IDNo=$IdCard.GetIDNo()
Local $Sex=$IdCard.GetSex()
Local $Birthday=$IdCard.GetBirthday()
MsgBox(0,"身份证信息", $Name & @CRLF & $Nation & @CRLF & $Address & @CRLF & $IDNo & @CRLF & $Sex & @CRLF & $Birthday)
EndIf
页: 1 [2]
查看完整版本: 请教一个dllcall的写法?[已解决]