读书人

C++ BUILDER 怎么调用 Delphi写的接口

发布时间: 2013-01-02 13:08:44 作者: rapoo

C++ BUILDER 如何调用 Delphi写的接口
Delphi接口说明:库文件名称为'HpCardLink.dll'

函数名 :function GetCardNo(out sRyKh,sMsg:PChar):SmallInt;stdcall;external

/////////////////////////////我的做法///////////////////////////////

1.静态做法:
用 implib.exe HpCardLink.lib HpCardLink.dll 生成库文件。
然后在程序中导入库。
头文件中声明 extern "C" int __stdcall GetCardNo(PChar ,PChar );
实现文件中 调用
PChar j;
PChar jj;
int hh= GetCardNo( j, jj); 报错 非法访问

2.动态做法。
头文件中声明 extern "C" int __stdcall GetCardNo(PChar ,PChar );
实现文件中 调用
user_GetCarNO GetCarNO;
if(LoadLibrary("HpCardLink.dll")
if ((user_GetCarNO)GetProcAddress(hInst, "GetCardNo")
{
PChar j;
PChar jj;
int hh= GetCarNO( j, jj); //报错 非法访问

}
请各位高手指教指教一下菜鸟,感谢不尽!!!
[解决办法]
显然, 这个函数的两个参数需要代入两个缓冲的地址. 但是, 缓冲的大小不好确认, 最好能咨询一下原作者.

这样试试:

char szRyKh[256] = { 0 };
char sMsg[256] = { 0 };
int hh = GetCardNo(szRyKh, sMsg);

[解决办法]
delphi DLL中的 PChar..是个坑人的东西。因为不同版本 pchar 指的是不同的东西。
这个得注意 有可能是 char * 也可能是 BSTR
在 CB 中我从不用 PChar 这个宏,因为不确认它是什么东西。另外你可以试试该DLL是否ActiveX,如果是,直接导入类型库就可以得到函数原型,无须去猜。

GetCardNo , 调用前可能需要先调用其他函数设定环境,你需要知道什么情况下调用。 最好是有调用例程。

读书人网 >C++ Builder

热点推荐