JK105Pro.dll是用C写的DLL文件,现在要在DELPHI6中调用int opencard_h(char *sReply)接口函数(整型),其中sReply是DLL调用后的返回字符串值,在DELPHI中应该如何调用啊?该接口函数好象是先在DELPHI中传入一个sReply的String,然后调用接口函数后返回sReply的值。我用DELPHI6做了以下动态调用程序,但是在调用接口函数的时候出现地址冲突的错误,请高手指点迷津,问题解决后马上给分!先谢谢了!拜托各位兄弟了!
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
  type
    TOpenCard_h = function(var sReply:String):Integer;stdcall;
    err1=class(exception);
    err2=class(exception);.......procedure TForm1.Button3Click(Sender: TObject);          //打开卡片
var
  filename:pchar;
  DllHandle1: THandle;
  opencard_h:TOpenCard_h;
  i:Integer;
  sReply:String;
begin
    filename:=pchar(extractfilepath(application.ExeName)+'JK105Pro.dll');
    DllHandle1:=loadlibrary(filename);
    if DllHandle1=0 then
        err2.Create('DLL调用出错')
    else
        @opencard_h:=GetProcAddress(DllHandle1,'opencard_h');
    if not(@opencard_h=nil) then
    begin
        sReply:='';
        i:=opencard_h(sReply);
        ShowMessage(IntToStr(i)); // 
    end
    else RaiseLastWin32Error;
    //freelibrary(DllHandle1);
end;

解决方案 »

  1.   

    更改声明:
      var     sReply:pchar;......
        或:   i:=opencard_h(pchar(sReply);   ......
      

  2.   

    应该是参数调用的规则不同,调用规则包含Stdcall,Cdecl等,如果C的动态库没有声明为__Stdcall,则使用的是默认的Cdecl模式,你则需要在delphi倒出函数后声明添加Cdecl,如果C为__Stdcall,则你在Delphi倒出函数后声明添加 Stdcall;
      

  3.   

    问题已经解决了,如下:
    type
        TOpenCard_h = function(sReply:Pchar):Integer;stdcall;
    ...
    procedure TForm1.Button3Click(Sender: TObject);          //打开卡片
    var
      filename:pchar;
      DllHandle1: THandle;
      opencard_h:TOpenCard_h;
      i:Integer;
      sReply:Array [0..100] of char;
    ....mrcpro(瑞雪) 的方法比较接近,谢谢了对了,怎么给分的啊?
      

  4.   


        if not(@opencard_h=nil) then
        begin
            sReply:='';
            i:=opencard_h(sReply);//改成i:=opencard_h(pchar(sReply);
                                  //加一句setlength(sreplay,strlen(pchar(sreplay)));
            ShowMessage(IntToStr(i)); // 
        end
      

  5.   

    写错了
        if not(@opencard_h=nil) then
        begin
            sReply:='';
            i:=opencard_h(sReply);//改成i:=opencard_h(pchar(sReply));
           setlength(sreplay,strlen(pchar(sreplay)));//加一句
            ShowMessage(IntToStr(i)); // 
        end
      

  6.   

    你的错误在于String,在DELPHI中string是一个自动管理类型,如果想在DLL中使用,则DLL必须使用DELPHI编写,并且使用SHAREMEM或类似的内存管理器,这也是为什么你使用PCHAR后问题解决的原因所在。顺便说一句,PCHAR是WINDOWS的默认调用类型,或者说C的类型.