Einzelnen Beitrag anzeigen

wschrabi

Registriert seit: 16. Jan 2005
437 Beiträge
 
#30

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