AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi DLL funktion wohl nicht ganz korrekt nach Delphi portiert...
Thema durchsuchen
Ansicht
Themen-Optionen

DLL funktion wohl nicht ganz korrekt nach Delphi portiert...

Ein Thema von FriFra · begonnen am 3. Aug 2009 · letzter Beitrag vom 3. Aug 2009
Antwort Antwort
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

DLL funktion wohl nicht ganz korrekt nach Delphi portiert...

  Alt 3. Aug 2009, 03:12
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.DLLname '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.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 03:24
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.DLLname 'Unlock_Device';
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#3

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 03:26
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.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 03:30
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.DLLname 'Unlock_Device';
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#5

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 03:35
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.DLLname 'Unlock_Device';
Doch, der passt schon... Das muss ein Pointer auf einen Byte-Wert sein.
function Unlock_Device(net_id: Byte; szPassword: PChar; Errorcode: Pointer): integer; stdcall; external 'EASY_COM.DLLname 'Unlock_Device'; folgende Funktion läuft bei mir auch:
function Lock_Device(net_id: Byte; Errorcode: Pointer): integer; stdcall;external 'EASY_COM.DLLname 'Lock_Device'; Der einzige Unterschied ist das Passwort... die Unlock-Funktion kommt einfach nicht mit dem übergebenen PChar klar.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 03:53
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.DLLname '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 ?).
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#7

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 04:09
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...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 05:16
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 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()?
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#9

Re: DLL funktion wohl nicht ganz korrekt nach Delphi portier

  Alt 3. Aug 2009, 08:32
Ja, es hat einen gültigen Wert... wobei es völlig egal ist, was ich übergebe
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06: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