Zitat:
Delphi-Quellcode:
aDatabase:= TDatabase.create(String(server), String(database),
String(objecttablename), String(libtablename));
Der harte Cast auf String weist den Compiler an, die Pointer als String zu behandeln. Es findet aber keine Typkonvertierung statt.
Beim Aufrug aus Delphi funktioniert das, da die übergebenen PChar tatsächlich auf existierende Strings verweisen.
Um den Compiler anzuweisen eine Typkonvertierung durchzuführen gibt es verschiedene Wege.
StrPas statt String verwenden, der Compiler erstellt temporäre lokale Variablen selbst:
Delphi-Quellcode:
aDatabase:= TDatabase.create(StrPas(server), StrPas(database),
StrPas(objecttablename), StrPas(libtablename));
Selbst lokale Variablen verwenden:
Delphi-Quellcode:
var
lServer, lDatabase, lObjectTablename, lLibTablename: string;
begin
lServer := server;
lDatabase := database;
lObjectTablename := objecttablename;
lLibTablename := libtablename
Result := TDatabase.Create(lServer, lDatabase, lObjectTablename, lLibTablename);
Die Typekonvertierung der Parameter durch Funktionsaufruf:
Delphi-Quellcode:
function _Database_create (const server, database, objecttablename, libtablename: string; bufsvr, bufdb, bufobj, buflib : Word) : TDatabase;
begin
Result := TDatabase.create(server, database, objecttablename, libtablename);
end;
function Database_create ( server, database, objecttablename, libtablename: PChar; bufsvr, bufdb, bufobj, buflib : Word) : Pointer; stdcall;
begin
Result := _Database_create(server, database,
objecttablename, libtablename);
end;