AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi DLL Exportiert ein Interface mit Strings...
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Exportiert ein Interface mit Strings...

Ein Thema von Mavarik · begonnen am 9. Jun 2014 · letzter Beitrag vom 9. Apr 2017
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#1

DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:15
Delphi-Version: XE5
Hallo!

Wir alle kennen den Kommentar...

{ 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

Geändert von Mavarik ( 9. Jun 2014 um 11:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:20
Ja, es sein denn du nimmst WideString .

Und alle Methoden des Interfaces sollten auch mit stdcall oder whatever (Calling Convention) gekennzeichnet werden (sonst geht das nur mit Delphi)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:23
Ja, es sein denn du nimmst WideString .
WideString <> AnsiString... Natürlich, ich meine im Bezug auf die Übergabe...?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:29
Ja, es sein denn du nimmst 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. string ) dann musst du ShareMem verwenden.

Nimmst du stattdessen einen Typen der nicht von Delphi gemanaged wird (statt string eben WideString ) dann brauchst du eben kein ShareMem .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:39
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Jun 2014 um 11:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Jun 2014, 11:58
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
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
456 Beiträge
 
#7

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Apr 2017, 18:22
HI,
ähnlichesn PROBLEM mit dll call von delphi aus: Bekomme nur Schrott in meiner Rückgabevariablen:
Kann mir wer helfen was ich falsch mache? Calcsum ist ok, aber der String-Rückgabewert ist Schrott.

Delphi-Quellcode:
unit QMC_Unit;

interface

uses
  ShareMem, Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function calcsum(a: double; b: double):integer ; cdecl; external 'qmc_dll_Project1.dll';
procedure calcmain( var loesung: Pansichar) ; cdecl; external 'qmc_dll_Project1.dll';
procedure calcmaindummy( var loesung: PansiChar) ; cdecl; external 'qmc_dll_Project1.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
    loesung: PAnsiChar;

begin
    ShowMessage(inttostr(calcsum(1,2)));
    calcmaindummy(loesung);

    ShowMessage(String(loesung));
end;

end.
Delphi-Quellcode:
// Wichtiger Hinweis zur DLL-Speicherverwaltung, wenn Ihre DLL die statische
// Version der Laufzeitbibliothek verwendet:
//
// Wenn Ihre DLL Funktionen exportiert, die String-Objekte (oder Strukturen/Klassen
// mit verschachtelten Strings) als Parameter oder Funktionsergebnisse übergeben,
// müssen Sie die Bibliothek MEMMGR.LIB dem DLL-Projekt und allen anderen Projekten,
// die die DLL verwenden, hinzufügen. Außerdem müssen Sie die MEMMGR.LIB verwenden,
// wenn andere Projekte, die die DLL einsetzen, Neu- oder Löschen-Operationen für nicht
// von TObject abgeleitete Klassen durchführen, die aus der DLL exportiert
// wurden. Das Hinzufügen von MEMMGR.LIB zu Ihrem Projekt ändert die DLL und ihre aufrufenden
// EXE-Dateien, damit diese BORLNDMM.DLL als Speicherverwaltung verwenden. In diesen Fällen
// muss die Datei BORLNDMM.DLL zusammen mit Ihrer DLL weitergegeben werden.
//
// Übergeben Sie String-Informationen mit "char *" oder ShortString-Parametern,
// um die Verwendung von BORLNDMM.DLL zu vermeiden.
//
// Wenn Ihre DLL die dynamische Version der RTL verwendet, müssen Sie MEMMGR.LIB
// nicht explizit hinzufügen, weil dies implizit ausgeführt wird.

#pragma argsused


extern int __declspec(dllexport) __stdcall calcsum(double a, double b){
   return a + b;
}


extern void __declspec(dllexport) __stdcall calcmaindummy(char* loesungdummy)
{
loesungdummy = "TESTENDE:2ndLine"; //resultbuff;

}


int _libmain(unsigned long reason)
{
  return 1;
}
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
981 Beiträge
 
Delphi 6 Professional
 
#8

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Apr 2017, 18:26
Hmm..

Schaue Dir mal die Deklarationen von deiner App und der DLL an:


function calcsum(a: double; b: double):integer ; cdecl; external 'qmc_dll_Project1.dll';
procedure calcmain( var loesung: Pansichar) ; cdecl; external 'qmc_dll_Project1.dll';
procedure calcmaindummy( var loesung: PansiChar) ; cdecl; external 'qmc_dll_Project1.dll';

...


extern int __declspec(dllexport) __stdcall calcsum(double a, double b){
return a + b;
}

extern void __declspec(dllexport) __stdcall calcmaindummy(char* loesungdummy)
{
loesungdummy = "TESTENDE:2ndLine"; //resultbuff;

}
[/DELPHI]

Ich tippe auf das 'cdecl' statt des 'stdcall' in der DLL
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.917 Beiträge
 
Delphi 12 Athens
 
#9

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Apr 2017, 18:56
Außerdem wäre es sauberer, wenn die DLL den Speicher nicht selbst reservieren würde, sondern die Hauptanwendung den Speicher reserviert und den Pointer plus die Größe des Bereiches an die DLL übergibt.

Dazu gegebenenfalls vorher noch die Anfrage an die DLL wie viel Speicher benötigt wird. Also analog zur API von Windows.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
wschrabi

Registriert seit: 16. Jan 2005
456 Beiträge
 
#10

AW: DLL Exportiert ein Interface mit Strings...

  Alt 9. Apr 2017, 19:10
Zitat:
Ich tippe auf das 'cdecl' statt des 'stdcall' in der DLL
Nein hab ich schon alles probiert.
Hab gelesen dass man da memmgr.lib dazu linken muss.
WIe muss ich das machen? Hab schon Bei den Programmoptionen "Mit Laufzeitbibliothek linken" auf true gesetzt.

Kann mir einfach ein Bsp geben wie man einen String zurückgibt?
Ich sitz jetzt schon Stunden hier und komm nicht weiter....

DANKE
WS
  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 18:37 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