请各位高手帮忙!Delphi调用DLL,所传参数问题!必有重谢!!!!

suqingfly 2012-07-24 09:17:45
Registration( char* PersonAccountInfo,int TransType, char* MedType, char* ReimbFlag, char* InHosNo, char* DeptNo,char* SysDate, char* UserName, char* Prev1, char* Prev2, char* Prev3,char* DataBuffer)

参数 输入/输出 参数名 长度 是否可空
PersonAccountInfo IN 个人及其帐户信息 1024 N
TransType IN 交易类型
-1 退号
1 挂号 2

N
MedType IN 医疗类别 3 N
ReimbFlag IN 结算类别 3 N
InHosNo IN 住院号 20 N
DeptNo IN 科室 20 N
SysDate IN 经办日期 N
UserName IN 操作员 10 N
Prev1 IN 预留 20 Y
Prev2 IN 预留 20 Y
Prev3 IN 预留 20 Y
DataBuffer OUT 返回信息 256

用delphi调用:
implementation
function Registration(PersonAccountInfo:pchar;TransType:integer;MedType:pchar;ReimbFlag:pchar;InHosNo:pchar;DeptNo:pchar;SysDate:pchar;UserName:pchar;Prev1:pchar;Prev2:pchar;Prev3:pchar;DataBuffergh:pchar):integer;stdcall;external 'F:\收费端最新程序\DBLib.dll';
请教各位高手如何传参数?调用?



...全文
256 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
suqingfly 2012-07-26
  • 打赏
  • 举报
回复
谢谢各位的帮助,现在问题解决了。
其实这个问题根本不是cdecl和stdcall的区别,因为这个在测试的过程中根据参数有没有变化,直接就能选择正确的方式。实在不行两个都试试呗。
其实解决方法很简单:就是所有参数都传地址!!!
哈哈,再次感觉各位的帮助!
Seamour 2012-07-26
  • 打赏
  • 举报
回复
因为无知,所以觉得不重要。因为觉得不重要,所以没有在一开始就把原型贴远,漏掉了这个最重要的信息。因为重要,所以又专门问到底是怎么写的。然后你查了一下就成了专家,张口就能说出区别不大的话来,你那么牛逼干嘛还来问啊?
广州佬 2012-07-26
  • 打赏
  • 举报
回复
第一,参数可以这样缩短一点来写:
function Registration(PersonAccountInfo: pchar; TransType: integer; MedType,
ReimbFlag, InHosNo, DeptNo, SysDate, UserName, Prev1, Prev2, Prev3,
DataBuffergh: pchar): integer; stdcall; external 'F:\收费端最新程序\DBLib.dll';

第二,“getmem(databuffergh,1024);//返回信息”是个分配内存的语句,不能放在var与begin之间;

第三,9楼的讲法有欠周全。当函数原型与调用处,在stdcall、cdecl(如果是delphi写的DLL,没注明其中一个,则等同是cdecl)这问题上不一致,刚好就出那个提示。请分别使用stdcall、cdecl形式来调用试试。
kaikai_kk 2012-07-25
  • 打赏
  • 举报
回复
声明可以简写成这样:
function Registration(PersonAccountInfo:pchar;TransType:integer;MedType,ReimbFlag,InHosNo,DeptNo,SysDate,UserName,Prev1,Prev2,Prev3,DataBuffergh:pchar):integer;stdcall;external 'F:\收费端最新程序\DBLib.dll';

调用,这样试试:
var
ghsucc:Integer;
DataBuffergh:PChar;
begin
DataBuffergh:=strAlloc(1024);
ghsucc:=Registration(...,DataBuffergh); {前面的参数,传固定值试试}
ShowMessage(DataBuffergh); {显示结果}
strDispose(DataBuffergh);
end;
suqingfly 2012-07-25
  • 打赏
  • 举报
回复
错误提示如下:
Access violation at address 1000DDFF in module 'DBLIB.dll'.Write of address 0045524C.
您能不能帮我看看哪个参数有问题?
function Registration(PersonAccountInfo:pchar;TransType:integer;MedType:pchar;ReimbFlag:pchar;InHosNo:pchar;DeptNo:pchar;SysDate:pchar;UserName:pchar;Prev1:pchar;Prev2:pchar;Prev3:pchar;DataBuffergh:pchar):integer;stdcall;external 'F:\收费端最新程序\DBLib.dll';
我传的参数:
var
getmem(databuffergh,1024);//返回信息
begin
ghsucc:=Registration(DataBufferdk,1,'11','1','123','89','20120722','sq','','','',DataBuffergh);
JPEXE 2012-07-25
  • 打赏
  • 举报
回复
没有就用 cdecl
taste品味 2012-07-25
  • 打赏
  • 举报
回复
楼上说的是,好像没有看到这个关键字
Seamour 2012-07-25
  • 打赏
  • 举报
回复
人家 c 声明前面有 stdcall 之类的么?
JPEXE 2012-07-25
  • 打赏
  • 举报
回复
区别并不大???用错了类型就会报错。
suqingfly 2012-07-25
  • 打赏
  • 举报
回复
cdecl和stdcall的区别我查了下,就是一个是参数数量可以变化,一个是参数数量固定,好像其他的区别并不大!
suqingfly 2012-07-25
  • 打赏
  • 举报
回复
这样还是不对啊!还是那个提示!
Access violation at address 1000DDFF in module 'DBLIB.dll'.Write of address 0045524C.
suqingfly 2012-07-25
  • 打赏
  • 举报
回复
错误提示如下:
Access violation at address 1000DDFF in module 'DBLIB.dll'.Write of address 0045524C.
JPEXE 2012-07-24
  • 打赏
  • 举报
回复
把报错的信息贴出来看
suqingfly 2012-07-24
  • 打赏
  • 举报
回复
var
getmem(databuffergh,1024);
begin
ghsucc:=Registration(DataBufferdk,1,'11','1','123','89','20120722','sq','','','',DataBuffergh);
这样传提示错误!

5,392

社区成员

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

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