300分求解答!c语言开发的dll中函数转换到delphi,我自己编译通过,运行报错,请帮忙看看(300)

C

cx139

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#1
接口API: ? 打开读写设备HANDLE OpenDevice(WCHAR* sPort, WCHAR* sParam)参数: sPort 读写器的串口号,如COM1 sParam 读写器的串口参数,如”115200,n,8,1”返回: 0 失败 其他 成功,返回的是设备的操作句柄。注:本次提供的dll是unicode 版本的,因此字符串使用WCHAR* 类型? 关闭设备void CloseDevice(HANDLE hHandle)参数:hHandle 打开的设备句柄返回:无? 获取插接到计算机上的信息卡的IDWORD GetConnectUID(HANDLE hHandle)参数: hHandle 打开的设备句柄返回: 0 目前没有信息卡接在计算机上。 其他,连接计算机的信息卡的ID。信息卡ID范围是1-65535? 写数据块BOOL WriteBlock(HANDLE hHandle, WORD wUID, BYTE btBlockIndex, BYTE *pData, WORD wLen)参数: hHandle 读写器设备句柄 wUID 指定信息卡的ID btBlockIndex 块索引。取值1,2,3,4 pData 数据 wLen 数据长度返回: TRUE 成功 FALSE 失败说明: 信息卡射频模块中提供4个存储块,每块存储容量为1K字节,应用软件可以指定使用哪个存储块进行存储数据,对同一个块的两次操作,第二次操作将覆盖第一次操作的数据。如: WriteBlock(h,1,pData1,200); WriteBlock(h,1,pData2,100); 第二次写入的pData2数据将覆盖第一次写入的数据。? 读数据操作BOOL ReadData(HANDLE hHandle, WORD wUID, BYTE btBlockIndex, WORD wOffset, BYTE *pData, WORD wLen))参数: hHandle 设备句柄 wUID 信息卡的ID btBlockIndex 块索引,取值1,2,3,4 btOffset 偏移量,取值范围0-1024 pData[out] 用于接收返回的数据缓存区 wLen 指定读入的数据长度,限制:wLen+btOffset小于1024返回: TRUE 成功 FALSE 失败说明: 读如数据时,应用软件从某个数据块中指定位置进行读取,每次最多可读取1k字节的数据。API使用说明? 应用软件启动后,首先打开读写器。? 应用软件可以定时通过GetConnectUID函数查询是否有信息卡连接到计算机上。? 应用软件获取到连接在计算机上的信息卡ID后,通过读写接口可以读写数据。以下是我自己转换的**********************************delphi接口声明function OpenDevice(sPort:pWChar;
sParam:pWChar):THandle;stdcall;external 'RfidFunc.dll';function CloseDevice(hHandle:pointer):pointer;stdcall;external 'RfidFunc.dll';function GetConnectUID(hHandle:pointer):WordBool;stdcall;external 'RfidFunc.dll';function WriteBlock(hHandle:pointer;
wUID:WordBool;
btBlockIndex:Byte;
pData:Byte;
wLen:WordBool ):Boolean;stdcall;external 'RfidFunc.dll';function ReadData(hHandle:pointer;
wUID:WordBool;
btBlockIndex:Byte;
wOffset:WordBool;
pData:Byte;
wLen:WordBool ):Boolean;stdcall;external 'RfidFunc.dll';编译通过,但是调用时候报内存错
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#2
你不要用 stdcall 方式调用,改为 cdecl 方式,也就是说你的Delphi接口声明改为function OpenDevice(sPort:pWChar;
sParam:pWChar):THandle;cdecl;external 'RfidFunc.dll';试试。
 
C

cx139

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#3
ok。我去测试以下,顺便问一句,stdcall 方式调用,改为 cdecl 方式有什么区别,另外帮忙看看数据类型转换有没有错误,谢谢
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#4
2者调用时,参数压栈顺序不一样,cdecl是函数调用协定的一种, 它规定了从C或C++编写的DLL中调用函数所必须遵守的规则,它可以将C或C++中的数据类型转换为Delphi的。这个句柄型的可能不对,如果结果不对,你就试试如下声明:function CloseDevice(hHandle:Hwnd): Integer;
cdcel;
external 'RfidFunc.dll';
 
C

cx139

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#5
function OpenDevice(sPort:pWChar;
sParam:pWChar):[red]THandle[/red];stdcall;external 'RfidFunc.dll';function CloseDevice(hHandle:Hwnd): Integer;
cdcel;
external 'RfidFunc.dll';是不是上一句句柄也要修改?,我改成POINTER才通过,但是返回值始终为0
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, post messages is not allowed!
#6
看它的说明 CloseDevice 是没有返回值的,OpenDevice 的返回值你可以试试 HWND。你测试一下,看看结果对不对就知道了。其实句柄就是一个正整型,有时用 Integer 也可