Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WideString als Rückgabe in COM-Klasse (https://www.delphipraxis.net/114501-widestring-als-rueckgabe-com-klasse.html)

almisoft 26. Mai 2008 15:17


WideString als Rückgabe in COM-Klasse
 
Ich habe eine kleine Funktion in einer COM-Klasse, die einen String zurückgeben soll:
Delphi-Quellcode:
function GetLastErrorMessage: WideString; stdcall;
Sobald ich die Methode aber aufrufe, erscheint "Access violation at address ... in module 'RPCRT4.dll'.
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.

Sherlock 26. Mai 2008 15:28

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:
function GetInfo(out RetVal: WideString):HResult; stdcall;
begin
  try
    RetVal := 'Der Text des COM_Objects';
    Result := S_OK;
  except
    Result := E_UNEXPECTED;
  end;
end;
Edit: Um zu diesem Ergebnis zu kommen reicht es auch, wenn Du Deine Deklaration nicht mit stdcall sondern mit safecall deklarierst.
Delphi-Quellcode:
function GetLastErrorMessage: WideString; safecall;
Sherlock

almisoft 26. Mai 2008 15:30

Re: WideString als Rückgabe in COM-Klasse
 
supi, vielen Dank!

almisoft 26. Mai 2008 15:50

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:
function GetLastErrorMessage(const Message: WideString): HResult; stdcall;
Auch habe ich keine Möglichkeit, "safecall" anzugeben.

Sherlock 26. Mai 2008 16:03

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

Jeehaa 5. Aug 2009 13:24

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

sirius 5. Aug 2009 14:26

Re: WideString als Rückgabe in COM-Klasse
 
Delphi benutzt safecall nur bei dualen Schnittstellen (Automatisierungsobjekt).

Jeehaa 5. Aug 2009 14:31

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 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz