我有个用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;
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;
procedure GetCode(s:Pchar);
在外面分配内存再把指针传进去,外面释放内存....
你的函数改个名
然后增加以下这个函数,并导出
//提取机器码。返回字节长度
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;