![]() |
BSTR* als Parameter für externe DLL?
Hallo allerseits,
ich habe eine exteren DLL die mir folgende Funktion zur Verfügung stellt:
Code:
Ich habe die Funktion folgendermassen in D7 deklariert:
extern "C" int __cdecl GetTemplate(BSTR* bstrTemplate, LONG* lRetCode);
Code:
Verwendet wird das Ganze dann folgendermassen in einer Klasse die von TThread erbt:
function GetTemplate(ATemplate: PWideString; var ARetCode: Longint): Integer; cdecl; external 'Template.dll';
Aufruf des Threads:
Code:
Verwendung der externen DLL:
templateThread := TScanThread.Create(false);
threadResult := templateThread.WaitFor;
Code:
procedure TTemplateThread.Execute;
begin try GetTemplate; ReturnValue := 1; except on ex: Exception do logger.Error(ex.Message); end; end;
Code:
So wie oben beschrieben funktioniert das Ganze auch ohne Fehler. Wenn ich jetzt allerdings in der GetTemplate Methode den Kommentar entferne und per template^ auf den zurückgegebenen Wert zugreife, wird dieser auch wunderbar geloggt. Funktioniert also im Prinzip wie es soll. Allerdings erhalte ich dann eine Access violation wenn auf ReturnValue in der Execute Methode zugegriffen wird.
function TTemplateThread.GetTemplate: String;
var template: PWideString; retCode: Longint; begin New(template); GetTemplate(template, retCode); //logger.Info('Template: ' + template^); Dispose(scanData); Result := ''; end; Warum erhalte ich eine Access Violation in der Execute Methode soblad ich den Zeiger in der GetTemplate Funktion dereferenziere? Gibt es da einen generellen Denkfehler? Steige gerade nicht durch. Jemand eine Idee? Gruss, Daniel |
AW: BSTR* als Parameter für externe DLL?
varsuch mal
Delphi-Quellcode:
function GetTemplate(var ATemplate: WideString; var ARetCode: Longint): Integer; cdecl;
external 'Template.dll';
Delphi-Quellcode:
Und vielleicht noch retCode mit auswerten.
function TTemplateThread.GetTemplate: String;
var template: WideString; retCode: Longint; begin GetTemplate(template, retCode); //logger.Info('Template: ' + template); Result := template; end; |
AW: BSTR* als Parameter für externe DLL?
So habe ich es auch schon getestet. Dann taucht der Fehler nicht auf. Also der Thread läuft zu Ende so wie er soll, mit dem entsprechenden ReturnValue. Allerdings ist template immer leer. retCode ist 0, was laut Dokumentation der DLL bedeutet dass der Aufruf erfolgreich war.
retCode = 0 ist auch der Fall wenn ich es so mache wie zuerst beschrieben. Dann kann ich aber eben zumindest lesen was ich zurückbekomme. Also scheint der PWideString schon die richtige Variante zu sein. |
AW: BSTR* als Parameter für externe DLL?
Das Problem lag wohl daran dass ich einen Thread verwendet habe. Die externe DLL scheint aber schon intern in einem Thread zu arbeiten. Zumindest kann ich die Funktion der DLL aufrufen ohne dass irgendetwas blockiert wird. Die Fenster der DLL werden modal über meiner Anwendung angezeigt, aber meine Anwendung wird trotzdem aktualisiert. Also es wird z.B. alles wird gezeichnet beim Fensterwechsel. Scheint also irgendwo Probleme mit beim Context oder was auch immer gegeben zu haben. Funktioniert jetzt aufjedenfall ohne Thread. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 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