我有一个delphi编译出来的dll文件(DDSReader.dll),并且有它的声明头文件,具体内容如下:unit uDDSReader;interfaceuses
Windows;type
PPByte = ^PByte;const
ReaderDllName = 'DDSReader.DLL';const
ERR_UNKNOW_ERROR = 0;
ERR_NO_IMPLEMENTATION = -1;
ERR_NOT_INIT = -2;
ERR_ALREADY_INITED = -3;
ERR_INVALID_PORT = -4;
ERR_INVALID_BAUDRATE = -5;
ERR_INVALID_PARAM = -6;
ERR_CONFIG_PORT = -7;
ERR_CONFIG_READER = -8;
ERR_NO_READER = -9;
ERR_NO_CARD = -10;
ERR_READ_DETAIL = -11;
ERR_COMMUNICATION = -12;
ERR_NOT_SPEC_CARD = -13;
ERR_ERROR_CHECKSUM = -14;
ERR_AUTHORKEY = -15;
ERR_WRITE_DETAIL = -16;function ErrCodeToStr(code: Integer): string;function InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer;
stdcall; external ReaderDllName;function CloseReader: Integer; stdcall; external ReaderDllName;function LoadKey(Sector: Byte; PSW: Pointer): Integer;
stdcall; external ReaderDllName;function CheckPassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;function CheckPassword2(Sector: Byte): Integer; stdcall;
external ReaderDllName;function RequestCard(var CardNo: DWORD): Integer; stdcall;
external ReaderDllName;function ReadCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;function WriteCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;
function ChangePassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;implementationfunction ErrCodeToStr(code: Integer): string;
begin
case Code of
ERR_UNKNOW_ERROR: Result := '未知错误';
ERR_NO_IMPLEMENTATION: Result := '功能未实现';
ERR_NOT_INIT: Result := '模块未初始化';
ERR_ALREADY_INITED: Result := '模块重复初始化';
ERR_INVALID_PORT: Result := '端口不存在或已经被占用';
ERR_INVALID_BAUDRATE: Result := '无效通讯速率';
ERR_INVALID_PARAM: Result := '无效参数';
ERR_CONFIG_PORT: Result := '配置端口出错';
ERR_CONFIG_READER: Result := '配置出错';
ERR_NO_READER: Result := '未检测到设备';
ERR_NO_CARD: Result := '没有设置';
ERR_READ_DETAIL: Result := '读取数据出错';
ERR_COMMUNICATION: Result := '通讯错误';
ERR_NOT_SPEC_CARD: Result := '不是指定的设置';
ERR_ERROR_CHECKSUM: Result := '未初始化';//'数据块校验和错误';
ERR_AUTHORKEY: Result := '密码验证错误';
ERR_WRITE_DETAIL: Result := '写数据错误';
else
if Code > 0 then
Result := '命令执行成功' else
Result := '未定义的错误代码';
end;
end;end.小弟没有学过delphi,请教我要怎么改成C++形式的声明,然后再程序中调用?谢谢大家!
Windows;type
PPByte = ^PByte;const
ReaderDllName = 'DDSReader.DLL';const
ERR_UNKNOW_ERROR = 0;
ERR_NO_IMPLEMENTATION = -1;
ERR_NOT_INIT = -2;
ERR_ALREADY_INITED = -3;
ERR_INVALID_PORT = -4;
ERR_INVALID_BAUDRATE = -5;
ERR_INVALID_PARAM = -6;
ERR_CONFIG_PORT = -7;
ERR_CONFIG_READER = -8;
ERR_NO_READER = -9;
ERR_NO_CARD = -10;
ERR_READ_DETAIL = -11;
ERR_COMMUNICATION = -12;
ERR_NOT_SPEC_CARD = -13;
ERR_ERROR_CHECKSUM = -14;
ERR_AUTHORKEY = -15;
ERR_WRITE_DETAIL = -16;function ErrCodeToStr(code: Integer): string;function InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer;
stdcall; external ReaderDllName;function CloseReader: Integer; stdcall; external ReaderDllName;function LoadKey(Sector: Byte; PSW: Pointer): Integer;
stdcall; external ReaderDllName;function CheckPassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;function CheckPassword2(Sector: Byte): Integer; stdcall;
external ReaderDllName;function RequestCard(var CardNo: DWORD): Integer; stdcall;
external ReaderDllName;function ReadCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;function WriteCard(Block: Byte; data: Pointer): Integer; stdcall;
external ReaderDllName;
function ChangePassword(Sector: Byte; PSW: Pointer): Integer; stdcall;
external ReaderDllName;implementationfunction ErrCodeToStr(code: Integer): string;
begin
case Code of
ERR_UNKNOW_ERROR: Result := '未知错误';
ERR_NO_IMPLEMENTATION: Result := '功能未实现';
ERR_NOT_INIT: Result := '模块未初始化';
ERR_ALREADY_INITED: Result := '模块重复初始化';
ERR_INVALID_PORT: Result := '端口不存在或已经被占用';
ERR_INVALID_BAUDRATE: Result := '无效通讯速率';
ERR_INVALID_PARAM: Result := '无效参数';
ERR_CONFIG_PORT: Result := '配置端口出错';
ERR_CONFIG_READER: Result := '配置出错';
ERR_NO_READER: Result := '未检测到设备';
ERR_NO_CARD: Result := '没有设置';
ERR_READ_DETAIL: Result := '读取数据出错';
ERR_COMMUNICATION: Result := '通讯错误';
ERR_NOT_SPEC_CARD: Result := '不是指定的设置';
ERR_ERROR_CHECKSUM: Result := '未初始化';//'数据块校验和错误';
ERR_AUTHORKEY: Result := '密码验证错误';
ERR_WRITE_DETAIL: Result := '写数据错误';
else
if Code > 0 then
Result := '命令执行成功' else
Result := '未定义的错误代码';
end;
end;end.小弟没有学过delphi,请教我要怎么改成C++形式的声明,然后再程序中调用?谢谢大家!
function ErrCodeToStr(code: Integer): string;
标准接口中没有string这个类型.所以这个dll只能被delphi使用
虽然我不懂delphi,但我想string对应在VC中就是CString类型,ErrCodeToStr(code: Integer): string这个函数我已经改写为VC的形式了,并没有任何问题!我已经可以在程序中用LoadLibrary取函数地址后可以调用了。
只是在调用RequestCard(var CardNo: DWORD): integer时,会出现无效的访问地址,而调用InitReader(DevPort, BaudRate: Integer; RWTimeOut: DWORD=100): Integer和CloseReader: Integer都没有问题,不清楚var CardNo: DWORD是不是对应VC中的DWORD CardNo?
期待有更好的解决方法。
你这么做一定出问题-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
而VC的CString是class.你觉得会等价么?
=============================================
正好两个我都懂,但我说的他总认为是多余的
delphi 写的dll有问题,不是标准DLL,无法通用.只能用delphi再次封装.
我做过类似的东西,所以才这么说,哎 可惜啊
第二,这个dll库是人家给的,不可能把这个dll库的delphi源代码给我 我根本无法用delphi再次封装,你说我能怎么办?
你可以看看windows核心编程中的DLL部分.讲述很很清楚.那种DLL通用.