Entwickler-Ecke

Dateizugriff - Problem mit DLL einbindung


Henry - Fr 09.05.03 22:54
Titel: Problem mit DLL einbindung
Hallo,

ich habe da ein kleines Problem mit der einbindung einer DLL.

Ich möchte eine DLL in Mein Programm einbinden und weiß auch die Funtions-/Procedurenamen
und den .
Was ich aber nicht weiß, sind Die Parameter die übergeben werden müssen.

Wenn ich eine DLL einbinden möchte, ist mir das Folgendermaßen bekannt:

Quelltext
1:
2:
3:
...
Procedure test(text:String) : Boolean; StdCall; external 'test.dll';
...


Dazu ist es aber notwendig zu wissen welche Werte ich übergeben muß.
Kann man eine Function oder Procedure auch einbinden ohne die Übergabeparameter zu kennen?


Habe soetwas als Beispiel zum Einbinden, kann mir daraus aber nicht die Variablentypen
ableiten die in Delphi verwendet werden (string...)

Hier eines der Beispiele das ich zur DLL habe (ich glaube C++)

Parameter:

1. int:

Laufwerk 0 => A, 1 => B

2. USERDATA:
Struktur für die Benutzerdaten

Beispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
  
  #include "copyp32.h"
  int main()
  {
    USERDATA ud;

    if (GetUserData(0,ud)==true)
    {
      printf("Product:%s\n",ud.Product);
      printf("Company:%s\n",ud.Company);
      printf("Version:%s\n",ud.Version);
      printf("Comment:%s\n",ud.Comment);
    }
  }

Die USERDATA Struktur hat folgenden Aufbau:

  struct USERDATA
  {
     char Company[STRINGLEN_USERDATA+1];

     char Version[STRINGLEN_USERDATA+1];
     char Product[STRINGLEN_USERDATA+1];
     char Comment[STRINGLEN_USERDATA+1];
  }
  
  Company:    Firmenname
  Version:    Version des Produktes (=geschütztes Programm)
  Product:    Name des Produktes  (=geschütztes Programm)
  Comment:    Kommentar, Seriennummer etc...

Kann mir jemand helfen?

Danke im voraus


Henry - Fr 09.05.03 23:20

Habe da noch Beispiele in VB gefunden.
Damit kann ich schon mehr anfangen.

Da wäre allerdings noch folgendes Problem:

Wie kann ich folgendes in Delphi realisieren?



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//VB Code
//USERDATA Struktur zur Aufnahme der Benutzerdaten von der Dongle Diskette
 Private Type USERDATA
    Company As String *STRINGLEN_USERDATA+1
    Version As String *STRINGLEN_USERDATA+1
    Product As String *STRINGLEN_USERDATA+1
    Comment As String *STRINGLEN_USERDATA+1
 End Type


Kann mir da jemand Helfen? Dann wäre ich schon einen großen Schritt weiter.


Delete - Sa 10.05.03 09:19

Du solltest in Erfahrung bringen, welche Länge "STRINGLEN_USERDATA" hat. Dieser Wert ist für die PChars wichtig. In Delphi sähe die Deklaration von USERDATA dann so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
const
  STRINGLEN_USERDATA = ???; // Größenangabe in Bytes (= Chars)
type
  USERDATA = record
    Company,
    Version,
    Product,
    Comment : array[0..STRINGLEN_USERDATA]of char;
  end;


Henry - Sa 10.05.03 13:04

Hallo Matthias,

Danke erstmal für Deine Hilfe, hat mich einen Schritt weiter gebracht.
Die Konstanten habe ich auch noch bei den VB Beispielen gefunden.

Nun habe ich aber festgestellt, das ich doch noch ein paar Probleme Habe mir den VB Code in Delphi zu übertragen.

Hier noch einmal zwei der Beipiele zur Einbindung der DLL in VB:

Quelltext
1:
2:
 Private Declare Function GetUserData Lib "copyp32.dll" (ByVal x As Long, data As USERDATA) As Boolean
 Private Declare Function GetDongleData Lib "copyp32.dll" (ByVal drive As Long, data As DONGLEDATA, ByVal Code As String) As Boolean


Hier meine daraus abgeleiten Funktion in Delphi:

Quelltext
1:
2:
 Function GetUserData(Laufwerk:Integer;daten: USERDATA):Boolean; StdCall; external DLL;
 Function GetDongleData(Laufwerk:Integer;daten:DONGLEDATA;Code:String):Boolean; StdCall; external DLL;


Nun ist ja in einer der Funktion z.B. der Parameter "data as Userdata" bzw. in meiner "daten:Dongledata" angegeben. Das würde für mich heißen, das ich diesen mit übergeben müßte.

In einem Beispiel zum aufruf geht aber (meines Erachtens) hervor, das diese Daten von der DLL zurückgegeben werden.

Hier das dazugehörige Beispel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
    ...  
    Dim data As DONGLEDATA
    Dim Code As String
    
    Code =...   //Hier wird die Codierung eingetragen
    If GetDongleData(0, data, Code) Then
        textLizenz.Text    = data.LicenceKey
        textSystemID.Text  = data.SystemID
        textCPVersion.Text = data.CP_Version
        textSerialNumber   = data.SerialNumber
    End If
   ...


Hier meine Einbindung:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    ...  
    procedure TForm1.Button1Click(Sender: TObject);
     Daten : DONGLEDATA;
     begin
       If GetDongleData(0,daten,'Code') = True then
         Begin
          Memo1.Text := Daten.LicenceKey;

     End;
   end;


Mache ich da einen Denkfehler?


Delete - Sa 10.05.03 18:05

Für verwertbare Ergebnisse musst du IMO die beiden Variablen namens "daten" als VAR deklarieren:

Quelltext
1:
2:
3:
4:
5:
function GetUserData(Laufwerk: integer; var daten: USERDATA): boolean;
  stdcall; external DLL;

function GetDongleData(Laufwerk: integer; var daten: DONGLEDATA;
  Code: string): boolean; stdcall; external DLL;


Henry - Sa 10.05.03 18:50

Super, das werde ich gleich mal probieren.
Melde mich dann wieder :D


AndyB - Sa 10.05.03 19:21
Titel: Re: Problem mit DLL einbindung
Hab die anderen Postings nicht gesehen.


Henry - Sa 10.05.03 20:46

So,

ich habe die wichtigsetn Funktionen eingebunden bekommen. Die anderen funktionieren aus irgendeinem Grunde nicht, das muß aber an der DLL liegen.

Schönen Dank nochmal.

@AndyB: welche anderen Postings :?:


AndyB - Sa 10.05.03 21:48

Mein Text bezog sich auf das 1. Posting. Die anderen hatten im Browserfenster keinen Platz und somit war mein Posting überfüssig.