Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL Exportiert ein Interface mit Strings... (https://www.delphipraxis.net/180689-dll-exportiert-ein-interface-mit-strings.html)

Mavarik 9. Jun 2014 11:15

Delphi-Version: XE5

DLL Exportiert ein Interface mit Strings...
 
Hallo!

Wir alle kennen den Kommentar...

Delphi-Quellcode:
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste...

Das gilt wahrscheinlich auch für ein Interface, oder?

Delphi-Quellcode:
type
    IFOO = Interface
     ['{BC0B635C-5296-4316-9559-0E8E9A32D460}']
      Procedure Test(Parameter:String);
    End;

Procedure GetI(out IOUT : IFOO);stdcall;
begin
...
end;

Exports
  GetI;
Mavarik

Sir Rufo 9. Jun 2014 11:20

AW: DLL Exportiert ein Interface mit Strings...
 
Ja, es sein denn du nimmst
Delphi-Quellcode:
WideString
.

Und alle Methoden des Interfaces sollten auch mit
Delphi-Quellcode:
stdcall
oder whatever (Calling Convention) gekennzeichnet werden (sonst geht das nur mit Delphi)

Mavarik 9. Jun 2014 11:23

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1261753)
Ja, es sein denn du nimmst
Delphi-Quellcode:
WideString
.

WideString <> AnsiString... Natürlich, ich meine im Bezug auf die Übergabe...?

Sir Rufo 9. Jun 2014 11:29

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Mavarik (Beitrag 1261754)
Zitat:

Zitat von Sir Rufo (Beitrag 1261753)
Ja, es sein denn du nimmst
Delphi-Quellcode:
WideString
.

WideString <> AnsiString... Natürlich, ich meine im Bezug auf die Übergabe...?

Ähm, welche Übergabe denn jetzt? Und welche Rolle spielt das?

Wenn du einen Typen verwendest, der nur von Delphi gemanaged wird (z.B.
Delphi-Quellcode:
string
) dann musst du
Delphi-Quellcode:
ShareMem
verwenden.

Nimmst du stattdessen einen Typen der nicht von Delphi gemanaged wird (statt
Delphi-Quellcode:
string
eben
Delphi-Quellcode:
WideString
) dann brauchst du eben kein
Delphi-Quellcode:
ShareMem
.

himitsu 9. Jun 2014 11:39

AW: DLL Exportiert ein Interface mit Strings...
 
String, AnsiString und UnicodeString sind Typen, welche über den Speichermanager des Delphi verwaltet werden.
WideString wird über die OleAut32.dll verwaltet.
Und der ShortString ist ein Record und wird von keinem Speichermanager verwaltet, da er meistens direkt auf dem Stack liegt.

Alles was über den Delphi-Speichermanager verwaltet wird, muß z.B. via ShareMem verbunden werden.
Und wenn man z.B. Klassen übergeben will, oder andersweilig Typen teilt, dann muß auch noch die RTTI geshared werden -> BPLs.

Mavarik 9. Jun 2014 11:58

AW: DLL Exportiert ein Interface mit Strings...
 
OK Verstanden...

Habe gerade ein Testprojekt für die DLL geschrieben und habe in meinen Interface eine Funktion die einen String zurück gibt.

Test funktioniert... OHNE SHAREMEM und mit "normalen" String typen.

Zufall? Oder habe ich doch noch etwas nicht verstanden...

Mavarik

himitsu 9. Jun 2014 12:07

AW: DLL Exportiert ein Interface mit Strings...
 
Geplanter Zufall.

Probleme gibt es vorallem dann, wenn die Stringreferenzen auf der "falschen" Seite verändert, kopiert oder längere Zeit gespeichert werden.


Beispiel:

Erzeug dir einen String, z.B. über IntToStr (Achtung, es darf keine Konstante sein),
übergib ihn einer Interface-Methode und speichere ihn auf der anderen Seite in einer globalen Variable
und nun beende dein Programm oder entlade zumindestens die DLL.

Sir Rufo 9. Jun 2014 12:26

AW: DLL Exportiert ein Interface mit Strings...
 
Vor allem zwischen einer Delphi-erzeugten DLL und einer Delphi-Anwendung ticken auch die Uhren "synchroner" und trotz "nicht korrekter" Implementierung der DLL funktioniert es trotzdem irgendwie (mehr durch Zufall).

Sobald aber eine nicht Delphi-Anwendung diese DLL benutzt, dann rappelt es im Karton.

Mavarik 9. Jun 2014 13:04

AW: DLL Exportiert ein Interface mit Strings...
 
Zitat:

Zitat von Sir Rufo (Beitrag 1261762)
Vor allem zwischen einer Delphi-erzeugten DLL und einer Delphi-Anwendung ticken auch die Uhren "synchroner" und trotz "nicht korrekter" Implementierung der DLL funktioniert es trotzdem irgendwie (mehr durch Zufall).

Sobald aber eine nicht Delphi-Anwendung diese DLL benutzt, dann rappelt es im Karton.

OK...
Die Frage ist dann unter welchen Umständen kann man das so machen...

Ich muss eine Unit von einem Dritthertseller (nur DCU vorhanden) in eine DLL Kapseln, damit ich diese auch mit zukünftigen Delphi Version benutzen kann.

Beispiel:
Delphi-Quellcode:
Bla.SavetoFile(Filename); // String übergeben
S := Bla.GetStr(100);            // String zurück erhalten
Also eigentlich immer nur Strings mal eben weiterreichen, verarbeiten und zurück geben.

Kann man das "Riskieren" oder doch lieber auf WideString gehen?

Mavarik

Sir Rufo 9. Jun 2014 13:22

AW: DLL Exportiert ein Interface mit Strings...
 
Hauptproblem wird wohl sein, dass die DCU nicht für Unicode funktioniert.

Wenn du die Definition der Klasse kennst, dann erstelle dir diese Klasse neu (für die neuen Versionen).

Die Klasse selber holt sich eine Interface-Instanz von der DLL und reicht alle Anfragen darüber an die DLL durch und holt auch die Daten darüber zurück.

Am sinnvollsten wäre auch die Verwendung von
Delphi-Quellcode:
PAnsiChar
statt
Delphi-Quellcode:
WideString
und die neue Klasse benutzt als Parameter
Delphi-Quellcode:
AnsiString
statt
Delphi-Quellcode:
string
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

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