Hallo,
ich habe folgenden Code:
Delphi-Quellcode:
{$APPTYPE CONSOLE}
program fpcqt;
uses Windows, SysUtils;
var
DLLHandle: HMODULE;
type
TMyFunction =
procedure(s: PChar; v: DWORD);
cdecl;
TCTOR_QChar =
function(s: PChar): uint64;
cdecl;
TDTOR_QChar =
procedure(v: uint64);
cdecl;
var
MyFunction: TMyFunction;
CTOR_QChar: TCTOR_QChar;
DTOR_QChar: TDTOR_QChar;
type
QChar =
class
private
ptr_cc: uint64;
public
constructor Create;
destructor Destroy;
end;
var
myQChar: QChar;
constructor QChar.Create;
begin
ptr_cc := CTOR_QChar(PChar('
ctor_QChar'));
WriteLn(Format('
ctor1 ptr: %x',[ptr_cc]));
end;
destructor QChar.Destroy;
begin
WriteLn('
ende');
WriteLn(Format('
dtor1 ptr: %x',[ptr_cc]));
DTOR_QChar(ptr_cc);
WriteLn(Format('
dtor2 ptr: %x',[ptr_cc]));
end;
function check_dllfun(
name:
String): Pointer;
var p: Pointer;
begin
p := GetProcAddress(DLLHandle, PChar(
name));
if p =
nil then
begin
MessageBox(0,
PChar('
Error: Function not found in DLL.' + #13 +
name),
PChar('
Error'),
MB_OK);
ExitProcess(1);
end else
begin
result := p;
end;
end;
begin
DLLHandle := LoadLibrary('
fpc-qt.dll');
if DLLHandle = 0
then
begin
MessageBox(0,'
Error: DLL could not be loaded.','
Error',0);
ExitProcess(1);
end;
try
@MyFunction := GetProcAddress(DLLHandle, '
addsymbol');
@CTOR_QChar := check_dllfun('
ctor_QChar');
@DTOR_QChar := check_dllfun('
dtor_QChar');
MyFunction(PChar('
jukel'), 2);
WriteLn('
ooo');
myQChar := QChar.Create;
myQChar.Free;
// hier
WriteLn('
oooo');
finally
FreeLibrary(DLLHandle);
ExitProcess(0);
end;
end.
- wenn ich den constructor QChar.Create aufrufe, dann wird der Delphi CTOR aufgerufen.
- wenn ich aber den destructor durch die Anweisung myQChar.Free; aufrufen möchte, wird der DTOR nicht aufgerufen.
- wenn ich aber den destructor direkt aufrufe, mittels: myQChar.Destroy; wird der DTOR von Delphi aufgerufen.
Hat sich da was geändert, an der Programmierreihenfolge ?
Also, das Free nicht mehr für das "aufräumen" verwendet werden kann ?
wo liegt mein Fehler ?