Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit DLL / Übergabe (https://www.delphipraxis.net/122107-problem-mit-dll-uebergabe.html)

Infamous 9. Okt 2008 14:26


Problem mit DLL / Übergabe
 
Hi!

Also, ich habe eine DLL geschrieben, in der unter anderem in einer Prozedur eine StringList verarbeitet wird und wieder zurückgegeben werden soll (var). Um die DLL aufzurufen, habe ich eine extra Unit, in der die DLL immer aufgerufen wird (mit mehreren Funktionen und Prozeduren). Im Hauptprogramm rufe ich dann die Schnittstelle auf, übergebe dabei einen Parameter StringList. In der schnittstelle ist dieser Parameter als "var" deklariert. Wenn die StringList dann verarbeitet wurde von der DLL und ich wieder im Hauptprogramm bin, bekomme ich aber immer eine Zugriffsverletzung. Hab es auch schon mit Strings versucht, klappt auch nicht. Vorher hatte ich einen extra Type, wobei es da auch nicht anders war mit der Zugriffsverletzung.

Hab in Google geguckt und gesehen dass viele so einen Fehler hatten. Aber hab nirgends eine brauchbare Lösung gefunden.


Scheint so, als wäre die zurück gegebene StringList immer leer. Liegt es am "var"?
Wie muss ich das machen??

Danke schonmal...

DeddyH 9. Okt 2008 14:49

Re: Problem mit DLL / Übergabe
 
Wenn Du über den Experten das Gerüst einer DLL erstellen lässt, schreibt Delphi da einen ziemlich langen Kommentar rein. Den sollte man vielleicht auch mal lesen.

sirius 9. Okt 2008 14:52

Re: Problem mit DLL / Übergabe
 
Entweder du benutzt einen anderen Speichermanager oder du versuchst es mal mit IStrings.

Infamous 9. Okt 2008 14:57

Re: Problem mit DLL / Übergabe
 
Zitat:

Zitat von DeddyH
Wenn Du über den Experten das Gerüst einer DLL erstellen lässt, schreibt Delphi da einen ziemlich langen Kommentar rein. Den sollte man vielleicht auch mal lesen.

Mit einem String würde es dann klappen, mit einer StringList trotzdem nicht.

Zitat:

Entweder du benutzt einen anderen Speichermanager oder du versuchst es mal mit IStrings.
Wie würde ich einen anderen Speichermanager benutzen!? Ich guck mir mal den Link an.

sirius 9. Okt 2008 15:17

Re: Problem mit DLL / Übergabe
 
Zitat:

Zitat von Infamous
Wie würde ich einen anderen Speichermanager benutzen!?

Möglichkeit 1: "Sharemem" ist das, was in der DLL steht, und was Deddy gemeint hat. Das ist der SM von Borland.
Möglichkeit 2: Einen fremden Speichermanager nehmen (fastmemorymanager)


Edit:
IStrings wäre die bessere Methode. Denn die unterstreicht den Sinn einer DLL. Dadurch wird deine DLL unabhängig von der Entwicklungsumgebung / PS in der sie programmiert wurde.

Mit den Speichermanagern bindest du dich an Delphi. Genauer gesagt, du bindest dich an ein Projekt. Denn du musst ja immer denselben Speichermanager verwenden. Dieses Konzept konterkariert ein wenig den Sinn einer DLL.

Mr_G 9. Okt 2008 16:09

Re: Problem mit DLL / Übergabe
 
Wenn es nur um die Daten der StringList geht könntest du afaik auch auf die Eigenschaft Text zurückgreifen. Die liefert den Inhalt als String und denn könntest du dann als PChar in die DLL geben und verarbeiten.

sirius 9. Okt 2008 16:30

Re: Problem mit DLL / Übergabe
 
Mit IStrings geht das viel einfacher/schöner:

Delphi-Quellcode:
uses StdVCL, AxCtrls;

var myStrings:IStrings;
    myStringList:TStringList;

//mystringList erstellen und füllen

//transfer TStrings to IStrings
GetOleStrings(myStringList,myStrings);

//hier kann man jetzt myStrings.add oder mystrings.count oder mystrings.Item in der EXE und in der DLL benutzen
//es wird dadurch immer die myStringList verändert.
Und will man aus dem IStrings-Interface eine eigene Klasse kopieren gibt es "SetOleStrings".


Edit:
Ein konkretes Beispiel mit einer Stringliste eines Memos. Ich habe also ein Formular mit einem Button und ein Memo und folgendem Click-Event des Buttons:
Delphi-Quellcode:
uses StdVCL, AxCtrls;

procedure TForm1.Button1Click(Sender: TObject);
var x:IStrings;
begin
  getolestrings(memo1.lines,x);
  x.Add('Text');
end;
Die Zeile mit dem x.Add kann ich eben auch problemlos in einer DLL machen. Das x kann ich einfach übergeben.

Infamous 10. Okt 2008 08:35

Re: Problem mit DLL / Übergabe
 
Danke für das Beispiel, ich probiers gleich aus!

Infamous 10. Okt 2008 09:14

Re: Problem mit DLL / Übergabe
 
Wollte grad schon den nächsten Fehler beschreiben, aber habs gerade doch noch hingekriegt. Danke! Gut zu wissen, das mit den IStrings. Einfach und sinnvoll!

sirius 10. Okt 2008 09:26

Re: Problem mit DLL / Übergabe
 
Wobei mir grad auffällt, dass IStrings ja auch von Borland sind. Also anscheinend doch nicht so gut :(

Denn du brauchst anscheinend jetzt auf dem System, wo das Proramm läuft die registrierte Bibliothek stdvcl32.dll. Ist zwar auch nicht das Problem, aber dann kannst du auch die DLL für einen Speichermanager mitliefern.

DeddyH 10. Okt 2008 09:34

Re: Problem mit DLL / Übergabe
 
Blieb noch die bereits angesprochene Möglichkeit.

Infamous 15. Okt 2008 10:02

Re: Problem mit DLL / Übergabe
 
Hab ich gerade gemerkt... auf einem anderem PC läufts nicht, es kommt eine Fehlermeldung -> "Bibliothek nicht registriert" (mit den IStrings).


Dann probier ich es jetzt mal mit der anderen Möglichkeit.

Infamous 15. Okt 2008 10:29

Re: Problem mit DLL / Übergabe
 
Auch wenn ich einen ganz normalen PChar übergeben will (was doch auch ohne extra Bibl. gehen sollte??), gibt es eine Zugriffsverletzung.

In der EXE:

Delphi-Quellcode:
uses Schnittstelle;

variable_PChar := Funktion_in_der_Schnittstelle(var1, var2);

In der Schnittstelle:

Delphi-Quellcode:
function Funktion_in_der_Schnittstelle(var1, var2: Double): PChar;

type
    TBerechnung = function (var1, var2: Double): PChar;stdcall;
 
[...DLLladen...]
[...Zeiger auf die Function in der DLL...]

Result := Variable_mit_Zeiger_auf_die_Funktion(var1, var2);
In der DLL:

Delphi-Quellcode:
function Funktion_in_der_DLL(var1, var2: Double): PChar;
begin
    Result := '...';
end;
Es geht, bis ich in der EXe wieder auf die variable_PChar zugreifen will, dann kommt der Zugriffsfehler. Bis dahin wurde die Variable aber nicht gefüllt. Result in der DLL hat gestimmt, wurde aber dann nicht richtig übergeben. Also ist die Variable in der EXE leer. Wie mach ich das dann, dass es richtig übergeben wird?
PChar kann man doch auch so verarbeiten mit DLLs, ohne ShareMem von Borland...?

mirage228 15. Okt 2008 10:37

Re: Problem mit DLL / Übergabe
 
Entweder machst du in DLL und Hauptprogramm "stdcall" hin oder in keinem von beiden. Gemischt geht nicht ;)

Viele Grüße

P.S.: Du kannst auch "WideString" anstatt PChar verwenden... das klappt problemlos über DLLs.

Infamous 15. Okt 2008 10:41

Re: Problem mit DLL / Übergabe
 
Ja habs oben vergessen, in der DLL steht auch stdcall.

Ok, WideString... ich probiere es... es klappt :) Mit IStrings wäre es zwar komfortabler, aber dass es auf anderen System auch funktioniert ist wohl wichtiger.

sirius 15. Okt 2008 11:54

Re: Problem mit DLL / Übergabe
 
Zitat:

Zitat von Infamous
Mit IStrings wäre es zwar komfortabler, aber dass es auf anderen System auch funktioniert ist wohl wichtiger.

Du kannst ja die StdVCLxx.DLL mit ausliefern und bei der Installation registrieren. GEnausogut kannst du aber, wie gesagt, auch die DLL zum speichermanager mitnehmen und einfach die Stringliste normal verwenden. Oder eben, wie jetzt, über widestring mit entsprechendem Comfortverlust.

Infamous 21. Okt 2008 15:37

Re: Problem mit DLL / Übergabe
 
Ja habe es jetzt mit WideStrings gemacht. Da gibt es aber keine Probleme, wenn man die DLL mit einer anderen programmiersprache aufrufen muss, oder? Also WideStrings sind Delphi-unabhänig?

sirius 21. Okt 2008 15:53

Re: Problem mit DLL / Übergabe
 
Ja, Widestring ist eine Windowssache. Und die ist ziemlich nett gekapselt von Delphi. Die Funktionen dazu (die man bei Delphi nicht wissen muss) sind hier beschrieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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