Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi C Dll benutzen mit Char* (https://www.delphipraxis.net/154976-c-dll-benutzen-mit-char%2A.html)

moelski 4. Okt 2010 07:03

C Dll benutzen mit Char*
 
Moin !

Ich habe hier eine C DLL die ich benutzen müsste. Darin gibt es diese Funktion:
Code:
int EncryptPassword(char* password, char* crypted_password, int bufsize)
In Delphi habe ich nun einen Funktionsprototypen definiert:
Delphi-Quellcode:
 type
   TDLLFunc = function(pass: PChar; passCry: PChar; lenBuffer: Integer): Integer; stdcall;
var
   DLLFunc: TDLLFunc
Die DLL wird dann dynamisch geladen und DLLFunc erhält den Pointer auf die Funktion in der DLL (@DLLFunc := GetProcAddress(DLLHandle, 'EncryptPassword');). Das klappt auch.

Nun versuche ich die Funktion zu benutzen und ich denke ich habe da noch irgendeinen Bug drin.
Nebenbei ... Die Funktion bekommt einen String und liefert einen verschlüsselten String zurück.

Das ist mein derzeitiger Versuch:
Delphi-Quellcode:
var
     Buffer      : PChar;
     test        : PChar;
begin
        GetMem(Buffer, 20);
        GetMem(test, 4);
        test  := PChar('!!!!');
        len := DLLFunc(@test, @Buffer, 20);
        ShowMessage(PChar(Buffer));
...
Nur leider kommt da nix brauchbares bei raus. Ich denke mal es liegt an meiner Nutzung von PChar.

Kann mir ggf. jemand einen Tip geben was ich hier anpassen/ergänzen muss?

uligerhardt 4. Okt 2010 07:58

AW: C Dll benutzen mit Char*
 
Zitat:

Zitat von moelski (Beitrag 1053582)
Delphi-Quellcode:
var
     Buffer      : PChar;
     test        : PChar;
begin
        GetMem(Buffer, 20);
        GetMem(test, 4);
        test  := PChar('!!!!');
        len := DLLFunc(@test, @Buffer, 20);
        ShowMessage(PChar(Buffer));
...

Die Klammeraffen in der Zeile mit dem DLLFunc-Aufruf scheinen mir zu viel des Guten. Vielleicht solltest du mal mit typisiertem Adress-Operator arbeiten. :-)

Neutral General 4. Okt 2010 08:00

AW: C Dll benutzen mit Char*
 
Hallo,

versuch mal PChar durch PAnsiChar zu ersetzen. Außerdem brauchst du für deine Variable "test" keinen Speicher zu reservieren, wenn du danach

Delphi-Quellcode:
test := PChar('!!!!');
schreibst. Das verschafft dir nur ein Memory-Leak. Und deine Buffer-Variable solltest du mit FreeMem auch wieder freigeben ;)

Edit: Das was uligerhardt geschrieben hat kommt noch dazu.. Hatte ich ganz übersehen.

Gruß
Neutral General

moelski 4. Okt 2010 11:46

AW: C Dll benutzen mit Char*
 
Moin !

Ich habe es nun mit PAnsiChar und auf PWideChar getestet, aber in beiden Fällen klappt es nicht.
Delphi-Quellcode:
       try
         GetMem(Buffer, 20);
         test := PWideChar('!!!!');
         len := DLLFunc(test, Buffer, 20);
         ShowMessage('Len : ' + IntToStr(len) + #13#10 +
                     'Erg : ' + Buffer);
       finally
         FreeMem(Buffer);
       end;
Zitat:

typisiertem Adress-Operator
Das sollte dann wie aussehen?

DeddyH 4. Okt 2010 11:51

AW: C Dll benutzen mit Char*
 
Was heißt "klappt nicht"? Welchen Wert bekommst Du denn zurück?

plusplus 4. Okt 2010 11:52

AW: C Dll benutzen mit Char*
 
benutze pChar und gebrauche cdecl instead of stdcall. (is a c dll right)

this should solve your problem.

DeddyH 4. Okt 2010 11:58

AW: C Dll benutzen mit Char*
 
Mal ein anderer Ansatz:
Delphi-Quellcode:
var
     Buffer, test: {Ansi}string;
begin
        SetLength(Buffer, 20);
        test := '!!!!';
        len := DLLFunc(P{Ansi}Char(test), @Buffer[1], Length(Buffer) * SizeOf(char));
        ShowMessage(Buffer);
Und auch mal mit cdecl versuchen wie bereits erwähnt.

uligerhardt 4. Okt 2010 12:24

AW: C Dll benutzen mit Char*
 
Zitat:

Zitat von moelski (Beitrag 1053623)
Zitat:

typisiertem Adress-Operator
Das sollte dann wie aussehen?

In den Projektoptionen unter Compiler, Gruppe Syntaxoptionen, gibt's ne Checkbox "Typisierter @-Operator". Wenn du die angehakt hast, compiliert er den Code mit den Klammeraffen gar nicht erst.

moelski 4. Okt 2010 13:02

AW: C Dll benutzen mit Char*
 
Moin !

Inzwischen funktioniert es.
Es war noch ein Bug in der DLL.

@uligerhardt:
Danke für den Hinweis.

@DeddyH:
Diese Variante funktioniert genauso wie meine erst genannte.

Ich danke für die zahlreichen Hinweise !! :thumb:


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