![]() |
Mehrere Ergebnisse aus Dll an Programm übergeben, aber wie?
Hallo,
habe mal wieder eine Frage zu der ich hier beim Suchen und bei Google nichts gefunden habe was mir irgendwie weiterhelfen könnte. Und wenn dann waren es so schwere Beispiele mit denen ich nicht viel anfangen konnte. :-( Und zwar Versuche ich mich gerade daran immer wiederkehrende Funktionen die ich in verschiedenen Programmen benötige in eine Dll auszulagern. Bisher klappt es auch vorzüglich. Nur stehe ich jetzt vor nem Problem. Ich rufe meine Funktion im Programm auf. Ein Zahlenwert wird als PChar an die Dll übergeben z.B. 1234.5678 In der Dll wird nun die Zeichenfolge zerlegt in Vor dem Komma und Nach dem Komma. Nun möchte ich diese zwei Ergebnisse, nennen wir sie mal Text1 und Text2 wieder in meinem Programm verwenden. Aber in einer Funktion kann ich mit Result ja nur einen Wert übergeben oder mach ich nen Denkfehler. Könnt mir jemand mal ein kleines EINFACHES Beispiel posten? Wie es am besten geht mit dem übergeben mehrere Werte in das Hauptprogramm. Achja mit GetMem oder wie das heisst ( hab ich auch schon gelesen ) möchte ich nicht arbeiten. Will die Anzahl der Dateien die ich weitergeben will klein halten. Nur mein Hauptprogramm und meine Dll mehr nicht. Please help me Arma :duck: |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Zwei Möglichkeiten:
1. Record:
Delphi-Quellcode:
2. Implizierte Pointer (aka var-Parameter):
TMyResult = record
Ergebnis1: TSomeType; Ergebnis2: TSomeType; end; function meinefunktion(Zahl: PChar): TMyResult; begin Result.Ergebnis1 := uvw; Result.Ergebnis2 := xyz; end; // Aufruf: var daten: TMyResult; daten := meinefunktion('123.456'); ShowMessage(ConvertToString(daten.Ergebnis1)); ShowMessage(ConvertToString(daten.Ergebnis2));
Delphi-Quellcode:
Allerdings solltest du dir überlegen, ob du das wirklich als String übergeben willst, Delphi kennt nämlich auch den Datentyp Real...
procedure meinefunktion(Zahl: PChar; var Ergebnis1: TSomeType; var Ergebnis2: TSomeType);
begin Ergebnis1 := uvw; Ergebnis2 := xyz; end; // Aufruf: var e1, e2: TSomeType; meinefunktion('123.456', e1, e2); ShowMessage(ConvertToString(e1)); ShowMessage(ConvertToString(e2)); |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Das sieht schon recht gut aus. Könntest Du mir da vielleicht noch zeigen welchen Code ich in die Dll und welchen ich im Hauptprogramm eingeben muss. Bohr da shcon seit Stunden rum und sollt wohl mal ne Pause einlegen :-(
Oder vielleicht Beispieldateien, wär echt nett. Gruß Arma |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Naja, bei der ersten Variante muss die Deklaration des Records in beiden Units vorhanden sein, die Funktion nur in der DLL und der Aufruf in der Unit, in der du die Funktion der DLL aufrufen willst. Bei der zweiten Methode muss die Funktion in der DLL sein und der Aufruf in der Unit, die die Funktion der DLL aufrufen muss.
"Aufruf" bezieht sich dabei immer auf den Aufruf selber und auf die dazugehörigen Variablen, beim ersten Fall gehört also die Deklaration der Variable "daten" mit in die aufrufende Unit, genauso wie die beiden Variablen "e1" und "e2" bei der zweiten Methode. |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Hmm ich kriegs nicht hin. Würde gern die zweite Methode nehmen die Du angeboten hast. Sieht nach weniger Code aus. Aber hab da noch Probs das ich nicht genau weiss was wohin. :-(
|
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
So hier noch der Code der Dll, im Hauptprogramm hätte ich gern die Werte von Start und Laenge bzw. noch mehr man kann ja nie genug kriegen:
Delphi-Quellcode:
library mtrcnc32;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } uses SysUtils, Classes, Windows; {$R *.res} function GetTempFolder: AnsiString; var Buf: array[0..MAX_PATH] of AnsiChar; begin GetTempPath(SizeOf(Buf), @Buf); Result := Buf; if Result <> '' then if AnsiLastChar(Result)^ <> '\' then Result := Result + '\'; end; function Speichern(GCode: PChar):Boolean; stdcall; var Datei: Integer; Buffer: PChar; F, Fehler, Text: String; begin Result := True; Text := GCode; F := GetTempFolder + 'paddydat'; Datei := FileCreate(F, fmCreate); if Datei > 0 then begin Buffer := PChar(Text); FileSeek(Datei, 0, 0); FileWrite(Datei, Buffer^, Length(Text)); FileClose(Datei); end else begin Fehler := 'Eine andere Anwendung hält die Datei "paddydat" geöffnet!' + #13; Fehler := Fehler + 'Aus diesem Grund wird beim Beenden dieses Tools' + #13; Fehler := Fehler + 'nicht der angezeigte Text aus diesem Tool eingefügt' + #13; Fehler := Fehler + 'Schliessen Sie die Anwendung welche die "paddydat"' + #13; Fehler := Fehler + 'geöffnet hält und somit den Schreibzugriff sperrt und' + #13; Fehler := Fehler + 'versuchen Sie es erneut.'; MessageBox(0, PChar(Fehler), 'Problem', MB_OK); Result := False; end; end; procedure Pruefen(Zahl: PChar; var Start, Laenge: Integer); stdcall; var Puffer1, Puffer2: String; KommaPos, MinusPos: Integer; begin Puffer1 := Zahl; KommaPos := Pos('.', Puffer1); MinusPos := Pos('-', Puffer1); if MinusPos > 0 then Puffer2 := Copy(Puffer1, MinusPos + 1, KommaPos - 2) else Puffer2 := Copy(Puffer1, MinusPos, KommaPos - 1); if Length(Puffer2) > 3 then begin Start := MinusPos; if MinusPos > 0 then Laenge := KommaPos - 2 else Laenge := KommaPos - 1; end; Puffer2 := Copy(Puffer1, KommaPos + 1, Length(Puffer1) - KommaPos + 1); if Length(Puffer2) > 3 then begin Start := KommaPos; Laenge := Length(Puffer1) - KommaPos; end; end; exports Speichern, Pruefen; begin end. |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Zitat:
In der Unit, in der das Programm steht, sieht das Ganze dann so aus (irgendwo, z.B. in Button1.Click):
Delphi-Quellcode:
Funktioniert zwar nur wenn die beiden Teile vor und nach dem Komma mehr als drei Stellen haben, aber deinem Code zufolge scheint das so beabsichtigt zu sein ;-)
procedure TForm1.Button1Click(Sender: TObject);
var s, l: Integer; begin Pruefen('123.456', s, l); ShowMessage(IntToStr(s)); ShowMessage(IntToStr(l)); end; Auch daß der erste Wert von Start überschrieben wird, scheint beabsichtigt zu sein. Wie dem auch sei, der Aufruf funktioniert, ob die Ergebnisse sinnvoll sind, liegt an dir :zwinker: |
Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w
Ich werds morgen mal Versuchen hab jetzt keinen Nerv mehr dazu. Mal schauen ob ich das mit dem dynamisch laden dort auch hinkrieg. Mach das beim Speichern so:
Delphi-Quellcode:
type
TPaddySpeichern = function(Code: PChar):Boolean; stdcall;
Delphi-Quellcode:
function PaddySpeichern(GCode: PChar):Boolean;
var PaddySpeichern: TPaddySpeichern; DllHandle: THandle; begin Result := False; DllHandle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'mtrcnc32.dll')); if DllHandle <> 0 then begin @PaddySpeichern := GetProcAddress(DllHandle, 'Speichern'); if @PaddySpeichern <> nil then begin Result := PaddySpeichern(GCode); end; FreeLibrary(DllHandle); end; end;
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var GCode: String; begin Vorschau(); GCode := ''; GCode := GCode + '*1' + #13#10; GCode := GCode + Form1.RichEdit1.Text + #13#10; GCode := GCode + '*2' + #13#10; GCode := GCode + Form1.RichEdit2.Text; if (PaddySpeichern(PChar(GCode))) = False then Exit; Close; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 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