AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mehrere Ergebnisse aus Dll an Programm übergeben, aber wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Ergebnisse aus Dll an Programm übergeben, aber wie?

Ein Thema von Armageddon · begonnen am 29. Dez 2004 · letzter Beitrag vom 30. Dez 2004
Antwort Antwort
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#1

Mehrere Ergebnisse aus Dll an Programm übergeben, aber wie?

  Alt 29. Dez 2004, 20:26
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
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#2

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 20:40
Zwei Möglichkeiten:
1. Record:
Delphi-Quellcode:
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));
2. Implizierte Pointer (aka var-Parameter):
Delphi-Quellcode:
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));
Allerdings solltest du dir überlegen, ob du das wirklich als String übergeben willst, Delphi kennt nämlich auch den Datentyp Real...
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#3

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 21:19
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
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 21:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#5

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 21:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#6

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 22:01
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.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#7

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 29. Dez 2004, 22:46
Zitat von Armageddon:
So hier noch der Code der Dll[...]
Delphi-Quellcode:
library mtrcnc32;

uses
  SysUtils, Classes, Windows;

{$R *.res}

//[...]

procedure Pruefen(Zahl: PChar; var Start, Laenge: Integer); stdcall;
//[...]

exports
  Speichern, Pruefen;

begin
end.
Sieht doch gut aus.
In der Unit, in der das Programm steht, sieht das Ganze dann so aus (irgendwo, z.B. in Button1.Click):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s, l: Integer;
begin
  Pruefen('123.456', s, l);
  ShowMessage(IntToStr(s));
  ShowMessage(IntToStr(l));
end;
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
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
  Mit Zitat antworten Zitat
Benutzerbild von Armageddon
Armageddon

Registriert seit: 30. Mär 2003
Ort: Wilflingen
158 Beiträge
 
#8

Re: Mehrere Ergebnisse aus Dll an Programm übergeben, aber w

  Alt 30. Dez 2004, 00:05
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:27 Uhr.
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