![]() |
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:
Beim Aufruf bekomme ich unter Delphi von der dll die Meldung, dass ein ungültiger Parameter übergeben wurde.
function Unlock_Device(net_id: Byte; szPassword: string; Errorcode: Pointer):
integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';
Delphi-Quellcode:
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.
var
n: Integer; y1: byte; s1: string; p1: pointer; begin ... n := Unlock_Device(y1, PChar(s1), p1); |
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'; |
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.
|
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'; |
Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
Zitat:
Delphi-Quellcode:
folgende Funktion läuft bei mir auch:
function Unlock_Device(net_id: Byte; szPassword: PChar; Errorcode: Pointer): integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device';
Delphi-Quellcode:
Der einzige Unterschied ist das Passwort... die Unlock-Funktion kommt einfach nicht mit dem übergebenen PChar klar.
function Lock_Device(net_id: Byte; Errorcode: Pointer): integer; stdcall;external 'EASY_COM.DLL' name 'Lock_Device';
|
Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
Zitat:
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:
Im Prinzip das Gleiche wie der var-Parameter, nur weiss der Compiler jetzt, dass Errorcode nach Aufruf der Funktion
function Unlock_Device(net_id: Byte; szPassword: PChar; out Errorcode: Byte):
integer; stdcall; external 'EASY_COM.DLL' name 'Unlock_Device'; 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 ?). |
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:
Der erste Aufruf müsste auch "No connection open" liefern...
> 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. |
Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier
Zitat:
Zitat:
![]() 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()? |
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 04:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz