我有个用delphi写的DLL文件,里面有些函数,我在EXE里面调用里面的函数时,用FastMM4检测会发生内存泄露。可我把这些函数直接写在程序里,再程序里直接调用,却不会,不知问题在哪里,麻烦有这方面经验的朋友帮忙。谢谢!
Dll 代码:
library isGHDll;uses
  ShareMem,  SysUtils,  Classes,  windows;{$R *.res}type
  TCPUID = array[1..4] of Longint;
  TVendor = array[0..11] of char;function GetCPUID: TCPUID; assembler; register;
asm
  PUSH    EBX         {Save affected register}
  PUSH    EDI
  MOV     EDI,EAX     {@Resukt}
  MOV     EAX,1
  DW      $A20F       {CPUID Command}
  STOSD               {CPUID[1]}
  MOV     EAX,EBX
  STOSD               {CPUID[2]}
  MOV     EAX,ECX
  STOSD               {CPUID[3]}
  MOV     EAX,EDX
  STOSD               {CPUID[4]}
  POP     EDI         {Restore registers}
  POP     EBX
end;
function GetCode(): string; stdcall; //提取机器码。
var
  CPUID: TCPUID;
  i: Integer;
  s1, s2, s3, s4, s5: string;
  RegCode: string;
begin
  for i := Low(CPUID) to High(CPUID) do CPUID[i] := -1;
  CPUID := GetCPUID;
  s1 := IntToHex(CPUID[1], 8);
  s2 := IntToHex(CPUID[2], 8);
  s3 := IntToHex(CPUID[3], 8);
  s4 := IntToHex(CPUID[4], 8);
  s5 := 'abc!@#45d^';
  RegCode := copy(s2, 2, 4) + copy(s5, 1, 4) + copy(s3, 2, 4) + copy(s1, 1, 4) +
    copy(s4, 5, 4) + copy(s5, 3, 4) + copy(s4, 2, 4) + copy(s1, 1, 4) + copy(s3,
    5, 4) + copy(s2, 1, 4);
  GetCode := RegCode;
end;
exports
  GetCode,
  begin
end.
程序调用:
procedure TForm1.Button1Click(Sender: TObject);
var sMcode1:string;
begin
sMcode1:='GHMA-' + UpperCase(GetDES(Getcode));
showmessage(sMcode1);
end;

解决方案 »

  1.   

    不要返回String。返回的函数最好这样(参见windowsAPI的方式,比如GetComputerName):
    procedure GetCode(s:Pchar);
    在外面分配内存再把指针传进去,外面释放内存....
      

  2.   

    动态库请不要传递string。没有必要为这个而发生内存纠结。
      

  3.   

    wzwcn,rainychan2009及各位大侠,那我这个问题怎么解决呢?新手,请多指教。谢谢!
      

  4.   

    function _GetCode(): string; stdcall; //提取机器码。
    你的函数改个名
    然后增加以下这个函数,并导出
    //提取机器码。返回字节长度
    function GetCode(Buf : PAnsiChar; Size : integer): integer; stdcall; 
    var
      S : String;
    begin
      S := _GetCode();
      Result := Length(S);
      if Result > Size then Result := Size;
      if Result>0 then CopyMemory(Buf , Pointer(S) , Result);
    end;
    调用的时候
    procedure TForm1.Button1Click(Sender: TObject);
    var 
      sMcode1: AnsiString;
      n : integer;
    begin
      SetLength(sMcode1 , 100);
      n := GetCode(Pointer(sMcode1) , 100);
      //这里应该加上if n<=0 then ....
      sMcode1 := 'GHMA-' + UpperCase(GetDES(Copy(sMcode1 , 1 , n)));
      showmessage(sMcode1);
    end;
      

  5.   

    问题已经解决了,谢谢大家的帮忙。dll中传String经常会出问题,已用pchar处理。