AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ WideString aus C++ DLL-Methode an Delphi-Host zurückgeben!?
Thema durchsuchen
Ansicht
Themen-Optionen

WideString aus C++ DLL-Methode an Delphi-Host zurückgeben!?

Ein Thema von MacGyver2k · begonnen am 13. Jul 2009 · letzter Beitrag vom 18. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
MacGyver2k

Registriert seit: 21. Mär 2009
5 Beiträge
 
#1

WideString aus C++ DLL-Methode an Delphi-Host zurückgeben!?

  Alt 13. Jul 2009, 20:40
Hallo Leute,

ich habe ein Problem beim Rückgabetyp "WideString" aus einer C bzw. C++ DLL heraus.
Es besteht eine Delphi-Infrastruktur für Plugins, welche allerdings bisher ausschließlich auch mit Delphi-DLLs genutzt wurde.
Nun hab ich vor diese auch mit C/C++-DLLs zu füttern.
Geht so weit auch schonmal bei DLL-Methoden mit numerischen Rückgabe-Typen wie Integer und Bool und so weiter.
Bsp (C++):

Delphi-Quellcode:
bool DECLDIR EXTP_IsPlugIn( LPWSTR name )
{      
    return PlugIn.IsPlugIn( name );   
}
Sobal die in Delphi vorliegende Hostanwendung meine DLL lädt und die eben geschriebene Methode aufruft, geht das alles wunderbar so wie es sein soll.
Im Parameter "name" steht entsprechend die erwartete GUID als String - das konnte ich mit dem VS-Debugger prüfen.
Da ich nun hier und da schon gelesen habe, dass ein Delphi-WideString in C äquivalent mit einem LPWSTR ist, habe ich den Parametertyp auch so gewählt.
Das heißt, in diese Richtung funktioniert die Übergabe. Außerdem Kommt auch das BOOL-True in der Hostanwendung an, da die innere Methode bislang immer True zurückliefert.
Wenn ich nun aber eine Methode habe, die nach Anforderung im Delphi-Code einen WideString zurückliefern muss, so kommt absolut garnichts an - zum mindest sieht es aus wie ein leerer Sting "".
Hier mal noch eine Methode, die einen WideString zurückliefern soll (C++):

Delphi-Quellcode:
LPWSTR DECLDIR EXTP_GetPlugInDescription()
{
    return PlugIn.GetPlugInDescription();
}
Wie dem Code zu entnehmen ist, habe ich hier auch schon den Typ auf LPWSTR gesetzt. DECLDIR entsteht folgendermaßen (C++):
#define DECLDIR __declspec(dllexport) Nun stellt sich mir die Frage, wie ich wohl einen String aus C/C++ in eine für Delphi akzeptable WideString-Konforme Variante überführe.
Hier nochmal die Deklaration der entsprechenden DLL-Methode in Delphi:

GetPlugInName = function : WideString; stdcall; Ich würde mich tierisch freuen, wenn jemand hier einen Wink für mich hätte. Sonst muss ich mich nur weiterhin aufregen, dass der Entwickler dieser Pluginverwaltung unbedingt WideStrings nutzen muss, wo ich doch gelesen habe, dass man die grade in DLLs nicht unbedingt nehmen soll, sondern eher PChar, um eben solchen Problemen aus dem Weg zu gehen.

Vielen Dank an euch schonmal!!!
Grüße, MacGyver2k
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 09:53
Ich denke du wirst hier mit StringToOleStr arbeiten müssen um einen COM-String zu bekommen der nicht mehr unter der Speicherverwaltung von Delphi steht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#3

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 10:36
Eigentlich braucht er in C nur den COM- / OLE-String verwalten
und Delphi macht dieses automatisch, bei Verwendung des WideString

MSDN-Library durchsuchenSysAllocStringLen
MSDN-Library durchsuchenSysReAllocStringLen
MSDN-Library durchsuchenSysFreeString
MSDN-Library durchsuchenSysStringLen

Delphi kapselt diese Befehle im WideString und dort wird alles nur an die WinAPI der oleaut32.dll weitergereicht.


Ich weiß jetzt nicht ob C dafür eventuell eine Klasse oder sowas hat, welches dieses auch schon kapselt, aber er braucht die Funktionen dann in C nur als LPWSTR bzw. BSTR deklarieren, deren Inhalt in C über die oben genannten Funktionen verwalten und in Delphi an gleicher Stelle der Funktionen alles einfach als WideString definieren.

etwa so:
Code:
bool DECLDIR EXTP_IsPlugIn( BSTR name )
Delphi-Quellcode:
function EXTP_IsPlugIn(const name: WideString): LongBool; stdcall;
// oder
function EXTP_IsPlugIn(var name: WideString): LongBool; stdcall;

[add]
war jetzt bool = ByteBool/Boolean und BOOL = LongBool ? wenn ja, dann natürlich anpassen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 10:47
Bei Strings ist doch const nicht gleich var, oder? Const sollte doch nur bewirken, dass keine Kopie angefertigt wird, und nicht die Übergabe beeinflussen.

Die WideString-Rückgabe dürfte übrigens nicht im EAX-Register erfolgen, sondern über einen versteckten Parameter, also ungefähr so:
Code:
void Foo(LPWSTR* result)
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 11:07
Probier doch einfach das:

GetPlugInName : array [0..xxxx] of WChar;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#6

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 12:42
Zitat von Apollonius:
Bei Strings ist doch const nicht gleich var, oder?
jupp ... ich wußte nur grad nicht in welche Richtung der Wert übertragen werden sollte ... muß man sich dann nur das Passende (CONST, VAR, OUT oder nix) auswählen und dann verwenden.

Von Seiten der Schnittstelle ist aber CONST und VAR genau gleich,
nur daß bei CONST der Parameterinhalt nicht geändert wird (werden darf)
und bei VAR darf sich der Inhalt ändern kann.

@hathor: bezüglich der Speicherverwaltung könnte man da auch einfach auf PWideChar/LPWSTR umsteigen und Derjenige, welcher die Daten haben möchte übergibt dort einfach den nötigen Puffer (eventuell noch einen "BufferLen"-Parameter mit übergeben und auf der Füllenden Seite prüfen, ob der Puffer auch groß genug ist)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 12:53
Zitat von himitsu:
Von Seiten der Schnittstelle ist aber CONST und VAR genau gleich,
nur daß bei CONST der Parameterinhalt nicht geändert wird (werden darf)
und bei VAR darf sich der Inhalt ändern kann.
Sicher? Das sollte doch eigentlich nur bei Records so sein. Bei Strings ergibt Call-By-Const-Reference ja keinen Vorteil.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#8

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 13:31
für String/AnsiString/WideString/UnicodeString:

CONST, VAR und OUT ist alles call-by-reference

Ohne Angabe (von CONST VAR OUT) ist es zwar ebenfalls call-by-reference, allerdings wird da der Inhalt kopiert bzw. der Referenzzähler erhöht.

Bei einem WideString wird also ohne Angabe eine neue Kopie angelegt,
wärend VAR und CONST nur die Referenz übernehmen.


Ansonsten geben diese (VAR, CONST, OUT und nix) nur an, wie/ob der Parameterinhalt behandelt wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 13:37
Das kann nicht sein, Himitsu. Ein var Widestring muss ein Zeiger auf einen PWideChar sein, sonst könntest du in der Routine nichts ändern. Const und fehlende Angabe resultieren hingegen in der Übergabe als PWideChar.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#10

Re: WideString aus C++ DLL-Methode an Delphi-Host zurückgebe

  Alt 14. Jul 2009, 14:35
ach menno, das Wetter ist wohl doch zu schlimm

OK, von der Übergabe ist es doch nicht gleich


also CONST und NIX ist gleich (call-by-const-reference),
sowie VAR und OUT (call-by-var-reference)

aber was die Behandlung der Inhalte angeht, bleibt es unverändert

also dann so?
Delphi-Quellcode:
bool DECLDIR EXTP_IsPlugIn( BSTR name )
function EXTP_IsPlugIn(const name: WideString): Boolean; stdcall;

bool DECLDIR EXTP_IsPlugIn( BSTR* name )
function EXTP_IsPlugIn(var name: WideString): Boolean; stdcall;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 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