int Dacsp_StrEnc(int hanle, unsigned char *inData, int
inDataLen,     unsigned char *outData, unsigned char *pubkey);
   说明:错误返回小于0;int  Dacsp_StrDec(int  handle,  unsigned  char  *inData, 
int   inDataLen,   unsigned char *outData, int keyNo);
   说明: 错误返回小于0;以上是dll中的函数定义。
-----------------------------------------------------------------------------------------
Delphi中的调用代码如下:
Function Dacsp_StrEnc(Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';
Function Dacsp_StrDec(Context:Longint;indata:String;indatalen:Integer;outdata:String;keyno:Integer):Integer;stdcall;external 'dacsplib.dll';
我将上面的String类型替换成Pchar类型后,仍然抱错,替换前是"不能写入0000000",替换后报错"某某内存地址在dacsplib模块中访问错误"请问 unsigned  char *  类型对应Delphi中应该如何定义啊?
我的dll调用就是玩不转~~

解决方案 »

  1.   

    Pchar我用了,还是抱错啊。
    我把函数定义里加上var.Function Dacsp_StrEnc(var Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';结果不抱内存错误了,但是程序执行后返回的是空值~~
    郁闷。
      

  2.   

    声明应该改为:
    function Dacsp_StrEnc(Context:Longint;
                indata: PChar;
                indatalen: integer;
                outdata, pubkey: PChar):Integer;stdcall;
    external 'dacsplib.dll';还要注意的是:indata, outdata, pubkey是指针参数,所以你要先分配足够的内存:
    如:
      GetMem(indata, 100);
      GetMem(outdata, 100);
      GetMem(pubkey, 100);
      Dacsp_StrEnc(Context, indata, indatalen, outdata, pubkey);
      //使用indata, outdata, pubkey中的数据
      FreeMem(pubkey, 100);
      FreeMem(outdata, 100);
      FreeMem(indata, 100);
      

  3.   

    不行啊。用了 zwjchina(蒲石)  的方法后还是抱内存错误
    Function Dacsp_StrEnc(var Context:Longint;indata:String;indatalen:Integer;outdata,pubkey:String):Integer;stdcall;external 'dacsplib.dll';
    其中,outdata为传出参数,其他均为传入参数
      

  4.   

    找了一天,一个delphi调用c++ dll的方法没有一个成功的~
      

  5.   

    迷糊:
    你说得没错,只有outdata一个参数是传出的。那还要不要在outdata前面加上var ??
    其他的传入参数是不是就不用getmem和freemem了?
    我刚才把函数里的所有参数都getmem和freemem了,结果程序执行时不报错,但是一调用完
    就报错:"Invalid Pointer Operation"  
    代码如下:
    Function 
    Dacsp_StrEnc(Context:Longint;indata:Pchar;indatalen:Integer;var
    outdata:Pchar;pubkey:Pchar):Integer;stdcall;external 'dacsplib.dll';
    Function 
    Dacsp_StrDec(Context:Longint;indata:Pchar;indatalen:Integer;var
    outdata:Pchar;keyno:Integer):Integer;stdcall;external 'dacsplib.dll';
    procedure TFrm_Main.Button2Click(Sender: TObject);
    var pubkeyFile:Textfile;
        pubkeydir:String;
        pubkey,str,str2:String;
        ret:Integer;
        Context:Longint;
        indata,outdata,pubk:Pchar;
    begin
     GetMem(indata, 100);
      GetMem(outdata, 100);
      GetMem(pubk, 100);
    pubkeydir:=ExtractFilePath(Application.ExeName);
     AssignFile(pubkeyFile,pubkeydir+'encrypt\server\encsvr.dat');
      reset(pubkeyFile);
      Readln(pubkeyFile,pubkey);
      closeFile(pubkeyFile);
      Context := Dacsp_init();
      edit1.text:=intToStr(Context);
      ret := Dacsp_login(Context);
      if ret < 0 Then
         Messagedlg('操作失败!',mtError,[mbok],0);
      str:='abcd';
      indata:=Pchar(str);
      pubk:=Pchar(pubkey);
      ret:=Dacsp_StrEnc(Context,indata, 4, outdata, pubk);
      edit2.text:=inttostr(ret);
      edit3.text:=outdata;
      FreeMem(pubk, 100);
      FreeMem(outdata, 100);
      FreeMem(indata, 100);
    end;
      
    Error : :"Invalid Pointer Operation"
      

  6.   

    那很可能是你分配的内存不够,GetMem(xxx, 100),这个100可以改成更大1或者 你把dll和相关.h文件发到我信箱,改好我发给你! [email protected]
      

  7.   

    楼主解决了没有?
    这里给个提醒:C的DLL默认调用方式是_cdecl,DELPHI的默认调用方式是_stdcall.