![]() |
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:
Die Anwendung soll nun darauf zugreifen können:
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;
Delphi-Quellcode:
Und in der DLL
function GetLastError: IMyException; stdcall; external 'TestPlugin';
//... ShowMessage(GetLastError.Msg);
Delphi-Quellcode:
Geht das jetzt ohne Sharemem? Die Interfacestrukturen enthalten ja Funktionen die Strings zurückgeben...
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; 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 |
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). |
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:
Grüße phreax |
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.
|
Re: Interfaces, DLLs und Strings: Sharemem benötigt?
Zitat:
|
Re: Interfaces, DLLs und Strings: Sharemem benötigt?
Danke für die schnellen Antworten :thumb:
Doch egal, ob
Delphi-Quellcode:
oder
OleStrToString(PWideChar(GetLastError.Msg));
Delphi-Quellcode:
Das Ergebnis bleibt immer wie oben...
ShowMessage(AnsiString(GetLastError.Msg));
Zugewiesen wurde mit:
Delphi-Quellcode:
Ich hoffe es gibt auch dafür eine Lösung...
constructor TMyException.Create(E: Exception);
begin inherited Create(); fProcName := ''; fMessage := WideString(E.Message); fClassName := WideString(E.ClassName); end; grüße phreax |
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: |
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 |
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?! |
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 10:49 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 by Thomas Breitkreuz