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 2 von 2     12   
MacGyver2k

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

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

  Alt 14. Jul 2009, 21:04
Hi Leute,

schon mal vielen Dank für die zahlreiche Teilnahme an meinem Problem. Ich muss jetzt erstmal alle Posts durchlesen und dann handeln!
Aber wie das so im Überfliegen aussieht, ist bestimmt geiles dabei! Ich melde mich später wieder!

Grüße MacGyver2k
  Mit Zitat antworten Zitat
MacGyver2k

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

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

  Alt 14. Jul 2009, 22:43
So nun hab ich alles gelesen und habe auch einiges davon ausprobiert. Leider funktioniert es immernoch nicht.
Zunächst muss ich leider sagen, dass die meisten Vorschläge auf Änderungen am Delphi Code hinauslaufen.
Ich habe leider nicht extra erwähnt, dass ich den Delphi Code zwar habe, ihn aber nicht abändern kann. Würde wohl auch mit bestehenden Plugins ins Gehege kommen.
Es geht auch wirklich ausschließlich daraum, wie ich den String aus C/C++ an Delphi zurückgebe. Denn Stringparameter von Delphi nach C kommen ohne probleme an.

Ich hab nun mal alles möglich eingebaut, was nur irgendwie sinnvoll scheint.
Dabei haben mich die Hinweise von himitsu am meisten inspiriert.
Außerdem habe ich auch wie Apollonius schrieb, mal das mit dem versteckten Parameter probiert.
Es kommt wie gesagt immernoch nichts raus.

Code:
DECLDIR LPCWSTR EXTP_GetPlugInName( LPCWSTR result )
{         
LPWSTR buffer = NULL;
int size = MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, NULL, 0 );
buffer = (WCHAR*) malloc( sizeof( WCHAR ) * size );
MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, buffer, size );
result = SysAllocStringLen( buffer, size );
return result;
//return PlugIn.GetPlugInName();
}
ich bin echt so langsam am verzweifeln
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 15. Jul 2009, 18:15
Ich sprach von einem Zeiger auf einen LPWSTR. Ohne die zusätzliche Inidrektion kann kein Wert zurück übertragen werden.
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
MacGyver2k

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

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

  Alt 16. Jul 2009, 01:33
hi Apollonius,

danke für den Wink. Ich hab nun so wie ich es mir am plausibelsten denken konnte, das mit dem Zeiger auf LPWSTR probiert.
So wie ich es hier implementiert habe, funktioniert es leider nach wie vor nicht habe ich immernoch einen logik-fehler bei der ganzen Sache?

Code:
DECLDIR LPWSTR* EXTP_GetPlugInName( WCHAR** result )
{         
    int size = MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, NULL, 0 );
    result = new WCHAR*;
    *result = new WCHAR[size];
    MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, *result, size );
    return result;
}
LPWSTR entspricht dabei ja WCHAR*

Ich hoffe, dass ich wirklich noch irgendwo einen Hänger in meinem Kopf habe, den mir vieleicht irgendjemand aufzeigen kann.
Weiterhin Danke alle Helfer - auch im Voraus!
  Mit Zitat antworten Zitat
Apollonius

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

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

  Alt 16. Jul 2009, 13:32
Dein Code aus #12 war schon fast richtig. Die Zuweisung in der vorletzten Zeile wird nur nicht an den Aufrufer durchgereicht, daher sollte das so aussehen:
Code:
DECLDIR void /*!*/ EXTP_GetPlugInName( LPCWSTR* /*!*/ result )
{         
LPWSTR buffer = NULL;
int size = MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, NULL, 0 );
buffer = (WCHAR*) malloc( sizeof( WCHAR ) * size );
MultiByteToWideChar( CP_ACP, 0, "MyPluginName", -1, buffer, size );
*result /*!*/ = SysAllocStringLen( buffer, size );
free(buffer); //!
}
Der Rückgabetyp der Funktion sollte void sein. Außerdem solltest du buffer wieder freigeben.
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
MacGyver2k

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

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

  Alt 18. Jul 2009, 17:28
Hi Apollonius,

ich krieg nen Knall - es geht!!! Du hast mir damit wirklich extremst geholfen!
Das ganze öffnet mir nun den Weg, um über C++/CLI eine Bräsche zu .NET Code zu schlagen, und in meinen Plugins .NET Code einzusetzen.

Nochmals vielen Dank an Apollonius und natürlich auch alle anderen die hier ihre Zeit geopfert haben! THX!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 12:56 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