![]() |
WideString als Rückgabe in COM-Klasse
Ich habe eine kleine Funktion in einer COM-Klasse, die einen String zurückgeben soll:
Delphi-Quellcode:
Sobald ich die Methode aber aufrufe, erscheint "Access violation at address ... in module 'RPCRT4.dll'.
function GetLastErrorMessage: WideString; stdcall;
Alle anderen Funktionen der COM-Klasse geben HRESULT oder WORDBOOL zurück, da gibt es keine Probleme. Ich bin nicht so der RPC-Guru, wie kann ich über COM einen String zurückgeben? Wo liegt mein Denkfehler. Vielen Dank. |
Re: WideString als Rückgabe in COM-Klasse
In COM sollten Funktionen immer ein HResult zurückgeben. Strings oder so gibt man als Rückgabeparameter zurück.
Zitat aus Andreas Kosch COM-Buch:
Delphi-Quellcode:
Edit: Um zu diesem Ergebnis zu kommen reicht es auch, wenn Du Deine Deklaration nicht mit stdcall sondern mit safecall deklarierst.
function GetInfo(out RetVal: WideString):HResult; stdcall;
begin try RetVal := 'Der Text des COM_Objects'; Result := S_OK; except Result := E_UNEXPECTED; end; end;
Delphi-Quellcode:
Sherlock
function GetLastErrorMessage: WideString; safecall;
|
Re: WideString als Rückgabe in COM-Klasse
supi, vielen Dank!
|
Re: WideString als Rückgabe in COM-Klasse
Hmm, ich arbeite mit dem TLB-Editor. Dort kann ich zwar einen Parameter auf [out] umstellen, das schlägt sich aber nicht im TLB-Quelltext nieder (der ja automatisch erstellt wird):
Delphi-Quellcode:
Auch habe ich keine Möglichkeit, "safecall" anzugeben.
function GetLastErrorMessage(const Message: WideString): HResult; stdcall;
|
Re: WideString als Rückgabe in COM-Klasse
Das ist seltsam.
Im TLB-Editor musst Du aber schon HResult als Rückgabewert angeben. Den String gibst Du als Out-Paramter (noch besser out und Retval) an. Der muss dann noch einen Stern (*) bekommen, damit er als Zeiger gekennzeichnet ist. Das müsste dann eine Function mit WideString als Rückgabewert und safecall in der TLB ergeben. Sherlock |
Re: WideString als Rückgabe in COM-Klasse
Ich weiß der Thread ist schon uralt, aber es passt einfach thematisch.
Ich hab das gleiche Problem wie zuletzte erwähnt. In dem TLB-Editor mache ich alles richtig, aber meine funktion in der Tlb.pas ist später einfahc nicht als safecall deklariert. was kann man da falsch machen. ich verwende turbo delphi2006 |
Re: WideString als Rückgabe in COM-Klasse
Delphi benutzt safecall nur bei dualen Schnittstellen (Automatisierungsobjekt).
|
Re: WideString als Rückgabe in COM-Klasse
ja, hatte ich eingestellt. hat trotzdem nicht geklappt.
jetzt habe ich dein com+ objekt erstellt, da geht es. zuvor habe ich ein normale com-obnjekt verwendet, da ging es nicht. komisch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz