Hallo,
ich habe ein Problem mit der Rückgabe eines Strings über eine
Com-Schnittstelle.
Der
Com-Server ist ein Out-Of-Process Server (also eine eigene Anwendung). Die Client instantiert den Server und verdendet die Funktionen der Schnittstelle. Funktioniert alles prima - bis auf...
Ich habe eine Methode im Type Library Editor deklariert, die als einen IN Parameter einen String (LPSTR, übersetzt in PChar) übergibt. Einen weiteren Parameter als OUT der einen String (*LPSTR, übersetzt var PChar) zurück geben soll.
Also in etwa Methode
function MyComServer.GetVorname(Nachname : PChar; var Vorname : PChar) : HRESULT;safecall;
begin
Vorname := PChar(AObjectGlobalStr);
Result := S_OK;
end;
AObjectGlobalStr ist ein normaler String der in der private section der Klasse deklariert ist und einen geeigneten Wert enthält.
Wenn ich die Funktion aufrufe wird alles ausgeführt, es kommt aber *nach* dem Verlassen der Funktion offensichtlich zu einer
exception, da der Debugger das CPU/Disassembler Fenster öffnet. Der Client bekommt das richtige Ergebnis zu sehen, bemerkt also von der
Exception nichts.
Während der Laufzeit (ohne Debugger) sieht alles ganz normal aus, außer das mit jedem Aufruf etwas Speicher verwendet wird der nicht wieder freigegeben wird, d.h. nach einer Nacht intensiven Rennens sind einige hundert MB verbraucht.
Ich habe die Variante mit PChar verwenden wollen um das gehample mit den SafeArrays zu umgehen, oder darf man das so einfach nicht machen?
Gruß Ekkehard