Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL funktion wohl nicht ganz korrekt nach Delphi portiert... (https://www.delphipraxis.net/138065-dll-funktion-wohl-nicht-ganz-korrekt-nach-delphi-portiert.html)

FriFra 3. Aug 2009 02:12


DLL funktion wohl nicht ganz korrekt nach Delphi portiert...
 
Ich habe die Moeller-Easy-Api anhand der Beispiele für VB und C nach Delphi portiert. Alle Funktionen, bis auf eine funktionieren.

Code:
   Declare Function Unlock_Device Lib "EASY_COM.DLL" _
   (ByVal net_id As Byte, _
    ByVal szPassword As String, _
    ByRef Errorcode As Byte) As Integer
Code:
error = MC_Unlock_Device( Handle_B, 0, (LPCSTR) m_csPasswort_B, &errorcode );
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: string; Errorcode: Pointer):
  integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';
Beim Aufruf bekomme ich unter Delphi von der dll die Meldung, dass ein ungültiger Parameter übergeben wurde.

Delphi-Quellcode:
var
  n: Integer;
  y1: byte;
  s1: string;
  p1: pointer;
begin

...

            n := Unlock_Device(y1, PChar(s1), p1);
Der einzige Unterschied, zu allen anderen Funktionen ist hier die Übergabe des String. Die Parameter: "net_id" und den Pointer auf "errorcode" verwende ich genauso in div. anderen Funktionen der dll und da klappt es.

sx2008 3. Aug 2009 02:24

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Wieso hat der Parameter szPassword den Datentyp "string"?
Der Prefix sz bedeutet "C-string, zero terminated".
Die Entsprechung in Delphi ist PChar:
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: PChar; Errorcode: Pointer):
  integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';

FriFra 3. Aug 2009 02:26

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Ja, ich hatte auch schon PChar dort stehen, da das PW auch lt. Doku Null-Terminiert sein soll... das ändert jedoch nichts daran, dass der Wert "nicht korrekt" ist.

sx2008 3. Aug 2009 02:30

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Der Datentyp für "Errorcode" passt auch nicht ganz:
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: PChar; var Errorcode: Byte):
  integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';

FriFra 3. Aug 2009 02:35

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Zitat:

Zitat von sx2008
Der Datentyp für "Errorcode" passt auch nicht ganz:
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: PChar; var Errorcode: Byte):
  integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';

Doch, der passt schon... Das muss ein Pointer auf einen Byte-Wert sein.
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: PChar; Errorcode: Pointer): integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';
folgende Funktion läuft bei mir auch:
Delphi-Quellcode:
function Lock_Device(net_id: Byte; Errorcode: Pointer): integer; stdcall;external 'EASY_COM.DLL' name 'Lock_Device';
Der einzige Unterschied ist das Passwort... die Unlock-Funktion kommt einfach nicht mit dem übergebenen PChar klar.

sx2008 3. Aug 2009 02:53

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Zitat:

Zitat von FriFra
Doch, der passt schon... Das muss ein Pointer auf den entspr. Rückgabewert sein.

Ein Parameter mit dem Schlüsselwort var wird als Zeiger übergeben.
Der Vorteil dabei ist aber die Typsicherheit.
Ein Pointer kann auf alles Mögliche zeigen; ein var-Parameter hat aber einen festgelegten Datentyp (hier: Byte)
und es ist garantiert, dass der Zeiger der übergeben wird auf eine gültige Speicherstelle zeigt.

Wenn man's ganz genau nimmt, müsste man einen out-Parameter verwenden:
Delphi-Quellcode:
function Unlock_Device(net_id: Byte; szPassword: PChar; out Errorcode: Byte):
  integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';
Im Prinzip das Gleiche wie der var-Parameter, nur weiss der Compiler jetzt, dass Errorcode nach Aufruf der Funktion
einen Wert bekommen hat und gibt keine Warnung aus.
Die Delphi-Deklaration ist genau passend zu der VB-Deklaration.
Schieb doch noch die Deklaration für C nach (steht in irgendeinem *.h File).
Der Fehler muss jetzt wo anderst liegen (falsche net_id, falsches Passwort ?).

FriFra 3. Aug 2009 03:09

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Nein, der Fehler liegt definitiv bem Passwort. Aber nicht daran, dass es evtl. falsch ist, dafür gibts einen eigenen return code.

Wie gesagt, schau Dir lock_device an. Das funktioniert tadellos. Ich sehe da nur einen unterschied zu unlock_device...

Hier kommt der Return-code für einen ungültigen Parameter. Wäre er gültig, bekäme ich im Testsystem eine Meldung, dass keine verbindung zum device besteht (so wie auch bei lock_device)
Code:
> unlock_device 8 "test"
03.08.2009 04:17:17     A parameter contains an invalid value.
> lock_device 8
03.08.2009 04:17:17     No connection open.
Der erste Aufruf müsste auch "No connection open" liefern...

sx2008 3. Aug 2009 04:16

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Zitat:

Zitat von FriFra
Nein, der Fehler liegt definitiv bem Passwort. Aber nicht daran, dass es evtl. falsch ist, dafür gibts einen eigenen return code.

Zitat:

Zitat von DOKU EASY_COM
Hierzu muss das im Gerät hinterlegte Systempasswort im Parameter 'szPassword' als
Dezimalwert-Zeichenkette übergeben werden. Bei easy500 und easy700 besteht das Passwort
aus 4 Dezimalziffern, bei easy800 und MFD-CP8 besteht es aus 6 Dezimalziffern. Das
Passwort wird verschlüsselt an das Gerät übertragen und dort geprüft.

ftp://ftp.moeller.net/EASY/TOOLS/easy_com_v230.zip

Das Passwort wird verschlüsselt; also vorverarbeitet.
Entspricht das Passwort nicht genau 4 oder 6 Ziffern, dann macht es Sinn, dass der Errorcode "1 Ein Parameter enthielt einen ungültigen Wert" geliefert wird.
Hat dein Passwort (bei Dir Variable s1) einen gültigen Inhalt vor dem Aufruf von Unlock_Device()?

FriFra 3. Aug 2009 07:32

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
 
Ja, es hat einen gültigen Wert... wobei es völlig egal ist, was ich übergebe :)


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