Delphi7 调用 C 的DLL的问题,急!

zhouqf 2011-01-07 02:52:05
DLL的接口函数是这样定义的int ykt_readopencardinfo_local (char *pRegion, char *pDeptid,char *pDeptKey, char *pIssuedeptid,char *pIssuedate, char *pCardtype,char *pCardno,char *pIdtype,char *pId,char *pName, char *pSex,char *pBirthDate,char *pCompany,char *pAddress,char *pTelephone, char *pWarnmsg,char *pErrmsg)。

Delphi程序:

声明:
function ykt_readopencardinfo_local(pRegion: string; pDeptid: string; pDeptKey: string; var pIssuedeptid: PChar; var pIssuedate: PChar; var pCardtype: PChar; var pCardno: PChar;
var pIdtype: PChar; var pId: PChar; var pName: PChar; var pSex: PChar; var pBirthDate: PChar; var pCompany: PChar; var pAddress: PChar; var pTelephone: PChar; var pWarnmsg: PChar; var pErrmsg: PChar): Integer; stdcall; external 'fzyktclient.dll';

调用:

pstr8:=StrAlloc(49);
pstr9:=StrAlloc(17);
pstr10:=StrAlloc(11);
pstr11:=StrAlloc(41);
pstr12:=StrAlloc(11);
pstr13:=StrAlloc(49);
pstr14:=StrAlloc(25);
pstr15:=StrAlloc(11);
pstr16:=StrAlloc(17);
pstr17:=StrAlloc(121);
pstr18:=StrAlloc(49);
pstr19:=StrAlloc(49);
pstr20:=StrAlloc(1051);
pstr21:=StrAlloc(1051);

retCode:=ykt_readopencardinfo_local(ls_Region, ls_DeptID, ls_DeptKey,
pstr8, pstr9, pstr10, pstr11, pstr12, pstr13, pstr14, pstr15, pstr16, pstr17,
pstr18, pstr19,pstr20, pstr21);
Showmessage(strpas(pstr13)); //出错

strCopy(@buf_pId, @pstr13); //其中 var buf_pId: array[0..48] of Char;
Edit4.Text := buf_pId; //字符错位,比如返回结果应该是 pstr8='12345' pstr9='abcde',但返回的结果是 pstr9='12345 abcde' pstr8='5 abcde'比pstr9少前面四个字符。
StrDispose(pstr21); //出错 报地址错误。

另外:还有用动态调用静态调用都不行,stdcall改成dcall也不行,声明中PChar改成PLStr也不行。
已经山穷水尽了,请好心人帮帮忙!
...全文
195 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
szuzsq 2011-01-10
  • 打赏
  • 举报
回复
我写过c/c++ >> delphi之间相互翻译的小工具
主要用于调用时的头文件翻译
zhouqf 2011-01-07
  • 打赏
  • 举报
回复
另外,回hongqi162和bdmh,char * 是DLL中C中定义的,与我没关系,我也改不了

zhouqf 2011-01-07
  • 打赏
  • 举报
回复
首先谢谢各位的热心帮助,问题终于解决了,在此总结一下:
1、对方用的指针类型,在DELPHI里对应Pchar没错,只是如jjwwang所说,不需要var。因为Pchar就是指针,不需要对方再回传内存地址了。
2、因为用到的PChar过大,因此需要在uses中加入ShareMEM
jeanler 2011-01-07
  • 打赏
  • 举报
回复
很久很久以前就有关于 如何改写C++ 声明为delphi的声明的文章 建议先学习下然后在去改这个, 真的有, baidu google皆可
szuzsq 2011-01-07
  • 打赏
  • 举报
回复
对于参数及返回值,跨语言调用,是要有规范的:
类型只能是基本数据类型,结构,玫举,接口(一般指纯虚类)
所以以下都是不行的
void a(std::vector<int> s);

procedure b(s:TObject);



bdmh 2011-01-07
  • 打赏
  • 举报
回复
pstr21,都是什么东西

delphi中的参数 char* 改为pchar,你的声明中还有string类型,改为pchar
szuzsq 2011-01-07
  • 打赏
  • 举报
回复
function ykt_readopencardinfo_local(pRegion: PChar; //全部这样,不要var,不要用string
//... ...
): Integer; stdcall; external 'fzyktclient.dll';

--------------------------
var用于这样
void aa(int &d);

function aa(var d:integer);
-------------
string是delphi特有的数据类型
对应c的char,char*应是Char,PChar
madyak 2011-01-07
  • 打赏
  • 举报
回复
要用PChar。传入函数前需要给PCHAR分配足够的内存。
Netself 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taijiwang80 的回复:]
最好不要用 string类型
[/Quote]
那应该用哪个?
taijiwang80 2011-01-07
  • 打赏
  • 举报
回复
最好不要用 string类型
zhouqf 2011-01-07
  • 打赏
  • 举报
回复
去掉VAR了,函数调用后,用Showmessage(strpas(pstr13));提示“无效的指针操作”。
hongqi162 2011-01-07
  • 打赏
  • 举报
回复
就把char*类型 替换成pchar类型就可以了
CACACACACA 2011-01-07
  • 打赏
  • 举报
回复
大概看了一下, 不需要var关键字.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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