Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interfaces, DLLs und Strings: Sharemem benötigt? (https://www.delphipraxis.net/102303-interfaces-dlls-und-strings-sharemem-benoetigt.html)

phreax 26. Okt 2007 13:23


Interfaces, DLLs und Strings: Sharemem benötigt?
 
Hallo zusammen,
Ich hoffe ich habe die richtige Sparte erwischt.

Ich möchte Mittels eines Interfaces Datenstrukturen zwischen meiner Anwendung und einer Dll tauschen.

folgendes Interface:
Delphi-Quellcode:
type IMyException = interface
  ['{682DE719-6008-404D-8921-D648F35FC1D7}']
  function Msg: String; stdcall;
  function ErrorClassName: String; stdcall;
  function GetProcName: String;
  procedure SetProcName(Value: String);
  property ProcName: String read GetProcName write SetProcName;
end;
Die Anwendung soll nun darauf zugreifen können:
Delphi-Quellcode:
function GetLastError: IMyException; stdcall; external 'TestPlugin';
//...
ShowMessage(GetLastError.Msg);
Und in der DLL
Delphi-Quellcode:
var fLastError: IMyException;
//...
function GetLastError: IMyException; stdcall;
begin
  Result := fLastError;
end;
//...
  except
    on E: Exception do
      begin
        Result := False;
        fLastError := TMyException.Create(E);
      end;
  end;
Geht das jetzt ohne Sharemem? Die Interfacestrukturen enthalten ja Funktionen die Strings zurückgeben...
Oder ist das ganze durch die Interfaces so gekapselt, das die Memorymanager von DLL und Anwendung nicht ins Gehege kommen?
Bei Tests hat es jedenfalls funktioniert, aber es kann ja sein das ich mit dem Feuer spiele ;)

Grüße phreax

Elvis 26. Okt 2007 13:26

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Du kannst auf WideString ausweichen, um das Speichermanagement auf Windows abzuschieben. Dadurch wäre ShareMem nicht mehr notwendig und auch die Bindung an Delphi wäre nicht mehr vorhanden.
Du kannst natürlich auch weiterhin ShareMem nehmen (oder in Echse & DLL FastMM4 als erste Unit benutzen).

phreax 26. Okt 2007 13:42

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Das mit Widestring hört sich gut an, denn ich will es vermeiden eine weitere DLL mit der Exe ausliefern zu müssen...

Aber wenn ich einfach alle Strings einfach durch WideStrings ersetze, bekomme ich interessante Strings zurück:
Eine Test-Fehlermeldung:
Zitat:

---------------------------
Pluginmain
---------------------------
Datei C:\Dokumente und Einstellungen\Eigene Dateien\???????????????????????????????? kann nicht geöffnet werden. Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch
---------------------------
OK
---------------------------
Woher kann denn soetwas kommen?

Grüße phreax

Luckie 26. Okt 2007 13:46

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
entweder gibst du den WideString mit WideString-Komponenten aus oder du castest ihn vor der Ausgabe nach String.

Elvis 26. Okt 2007 13:49

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Zitat:

Zitat von Luckie
entweder gibst du den WideString mit WideString-Komponenten aus oder du castest ihn vor der Ausgabe nach String.

Genau, man kann den UCS2-String aus einem WideString nicht immer einfach so indirekt als AnsiString nehmen. ein expliziter Cast ist oft genug, ansonsten gibt es die OleStr-blabla-Konvertierungen. (wirklich immer auf Unicode zu setzen macht aber IMO mehr Sinn.)

phreax 26. Okt 2007 14:04

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Danke für die schnellen Antworten :thumb:
Doch egal, ob
Delphi-Quellcode:
OleStrToString(PWideChar(GetLastError.Msg));
oder
Delphi-Quellcode:
ShowMessage(AnsiString(GetLastError.Msg));
Das Ergebnis bleibt immer wie oben...
Zugewiesen wurde mit:
Delphi-Quellcode:
constructor TMyException.Create(E: Exception);
begin
  inherited Create();
  fProcName := '';
  fMessage := WideString(E.Message);
  fClassName := WideString(E.ClassName);
end;
Ich hoffe es gibt auch dafür eine Lösung...

grüße phreax

Elvis 26. Okt 2007 15:08

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Öhm, kannst du mal bitte das Ganze mal so vereinfachen, dass wir es hier in unseren Delphis reproduzieren können?
Ich selbst bin schon ein "wenig" raus aus Delphi, es "klingelt"also gerade nicht bei mir... :oops:

phreax 26. Okt 2007 15:58

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Fehler scheint nur im Zusammenhang meiner Anwendung aufzutreten...
Ich kann es also leider nicht aus dem Zusammenhang nehmen.
Daher die ganze "Proof of Concept" Anwendung im Anhang.
Einfach eine Datei öffnen, die nicht existiert und es kommt eine Fehlermeldung :)

Grüße phreax

generic 26. Okt 2007 16:09

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
phreax nutzt turbodelphi!
ich meine der fastmm ist dort der speichermanager, somit müsste das doch ohne sharemem bzw borlandmm gehen?!

Luckie 26. Okt 2007 16:10

Re: Interfaces, DLLs und Strings: Sharemem benötigt?
 
Bei SavePerson kommt überhaupt kein gültiger Dateiname an, sondern nur Fragezeichen. Da stimmt schon was nicht. Die Ausgabe ist wahrscheinlich korrekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 Uhr.
Seite 1 von 2  1 2      

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