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';
请教各位高手如何传参数?调用?

解决方案 »

  1.   

    var
    getmem(databuffergh,1024);
    begin
    ghsucc:=Registration(DataBufferdk,1,'11','1','123','89','20120722','sq','','','',DataBuffergh);
    这样传提示错误!
      

  2.   

    声明可以简写成这样:
    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;
      

  3.   

    错误提示如下:
    Access violation at address 1000DDFF in module 'DBLIB.dll'.Write of address 0045524C.
      

  4.   

    这样还是不对啊!还是那个提示!
    Access violation at address 1000DDFF in module 'DBLIB.dll'.Write of address 0045524C.
      

  5.   

    人家 c 声明前面有 stdcall 之类的么?
      

  6.   

    没有就用 cdecl
      

  7.   

    cdecl和stdcall的区别我查了下,就是一个是参数数量可以变化,一个是参数数量固定,好像其他的区别并不大!
      

  8.   

    错误提示如下:
    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);
      

  9.   

    第一,参数可以这样缩短一点来写:
    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形式来调用试试。
      

  10.   

    谢谢各位的帮助,现在问题解决了。
    其实这个问题根本不是cdecl和stdcall的区别,因为这个在测试的过程中根据参数有没有变化,直接就能选择正确的方式。实在不行两个都试试呗。
    其实解决方法很简单:就是所有参数都传地址!!!
    哈哈,再次感觉各位的帮助!