Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Benötige Hilfe bei der Nutzung einer DLL (https://www.delphipraxis.net/170195-benoetige-hilfe-bei-der-nutzung-einer-dll.html)

divBy0 4. Sep 2012 23:20

Benötige Hilfe bei der Nutzung einer DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

ich habe eine DLL um Daten mit einem externen Gerät auszutauschen. Eine Beispielanwendung in VB ist dabei, allerdings funktioniert diese nicht. :wall:

Hier mal ein Ausschnitt aus der DLL:

Code:
#pragma once

#ifdef LKIF2_EXPORTS
#define EXP __declspec(dllexport)
#else
#define EXP __declspec(dllimport)
#endif

#include "Winsock2.h"

// Return Code List
typedef enum {   
   RC_OK = 0x0000,            // The operation is completed successfully.
   ///////////////////////////////////////////////
   // Communication error from controller notification
   //
   RC_NAK_COMMAND = 0x1001,   // Command error
   RC_NAK_COMMAND_LENGTH,      // Command length error
   RC_NAK_TIMEOUT,            // Timeout
   RC_NAK_CHECKSUM,         // Check sum error
   RC_NAK_INVALID_STATE,      // Status error
   RC_NAK_OTHER,            // Other error
   RC_NAK_PARAMETER,         // Parameter error
   RC_NAK_OUT_STAGE,         // OUT calculation count limitation error
   RC_NAK_OUT_HEAD_NUM,      // No. of used head/OUT over error
   RC_NAK_OUT_INVALID_CALC,   // OUT which cannot be used for calculation was specified for calculation.
   RC_NAK_OUT_VOID,         // OUT which specified for calculation is not found.
   RC_NAK_INVALID_CYCLE,      // Unavailable sampling cycle
   RC_NAK_CTRL_ERROR,         // Main unit error
   RC_NAK_SRAM_ERROR,         // Setting value error
   ///////////////////////////////////////////////
   // Communication DLL error notification
   //
   RC_ERR_OPEN_DEVICE = 0x2000,// Opening the device failed.
   RC_ERR_NO_DEVICE,         // The device is not open.
   RC_ERR_SEND,            // Command sending error
   RC_ERR_RECEIVE,            // Response receiving error
   RC_ERR_TIMEOUT,            // Timeout
   RC_ERR_NODATA,            // No data
   RC_ERR_NOMEMORY,         // No free memory
   
   RC_ERR_DISCONNECT,         // Cable disconnection suspected
   RC_ERR_UNKNOWN,            // Undefined error
} RC;   

extern "C"
{
///////////////////////////////////////////////
// Other commands
//
// Opens the USB device.
EXP RC WINAPI LKIF2_OpenDeviceUsb();
// Closes the currently open device.
EXP RC WINAPI LKIF2_CloseDevice();
}
Der Datentyp RC sieht bei mir so aus:

Delphi-Quellcode:
TKeyenceRC = (
              // Return Code List
              RC_OK = $0000,            // The operation is completed successfully.
              ///////////////////////////////////////////////
              // Communication error from controller notification
              //
              RC_NAK_COMMAND = $1001,   // Command error
              RC_NAK_COMMAND_LENGTH,      // Command length error
              RC_NAK_TIMEOUT,            // Timeout
              RC_NAK_CHECKSUM,         // Check sum error
              RC_NAK_INVALID_STATE,      // Status error
              RC_NAK_OTHER,            // Other error
              RC_NAK_PARAMETER,         // Parameter error
              RC_NAK_OUT_STAGE,         // OUT calculation count limitation error
              RC_NAK_OUT_HEAD_NUM,      // No. of used head/OUT over error
              RC_NAK_OUT_INVALID_CALC,   // OUT which cannot be used for calculation was specified for calculation.
              RC_NAK_OUT_VOID,         // OUT which specified for calculation is not found.
              RC_NAK_INVALID_CYCLE,      // Unavailable sampling cycle
              RC_NAK_CTRL_ERROR,         // Main unit error
              RC_NAK_SRAM_ERROR,         // Setting value error
              ///////////////////////////////////////////////
              // Communication DLL error notification
              //
              RC_ERR_OPEN_DEVICE = $2000,// Opening the device failed.
              RC_ERR_NO_DEVICE,         // The device is not open.
              RC_ERR_SEND,            // Command sending error
              RC_ERR_RECEIVE,            // Response receiving error
              RC_ERR_TIMEOUT,            // Timeout
              RC_ERR_NODATA,            // No data
              RC_ERR_NOMEMORY,         // No free memory

              RC_ERR_DISCONNECT,         // Cable disconnection suspected
              RC_ERR_UNKNOWN            // Undefined error
             );
Die beiden Funktionen sehen bei mir aktuell so aus:

Delphi-Quellcode:
const
  DLLNAME = 'LKIF2.dll';

function LKIF2_OpenDeviceUsb: TKeyenceRc; stdcall; external DLLNAME;
function LKIF2_CloseDevice: TKeyenceRC; stdcall; external DLLNAME;
Ist das so korrekt? Fehler bekomme ich nämlich keine beim Aufruf, einzig im ProcessMonitor wird mir beim Aufruf der Funktionen "NAME NOT FOUND" angezeigt (siehe ProcessMonitor.png).

Kann mir da vielleicht jemand was zu sagen?

Danke

himitsu 4. Sep 2012 23:37

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Eigentlich sollte Delphi auch sowas, wie "Prozedureinsprungpunkt nicht gefunden" rauswerfen. :gruebel:

Sicher daß diese Funktion genau als "LKIF2_OpenDeviceUsb" in der DLL exportiert werden?
Andere Sprachen hängen gerne mal Prefixe und vorallem Sufixe an den Exportnamen. (meißt wird gerne noch eine Parametersignatur angehängt)


[edit]
Zitat:

einzig im ProcessMonitor wird mir beim Aufruf der Funktionen "NAME NOT FOUND" angezeigt (siehe ProcessMonitor.pn
Deine Beschreibung klang nach was Anderem.

Tja, da scheint wohl irgendein Registryzugriff in dieser Funktion nicht ordentlich laufen.

z.B. Beim Versuch mit Schreibrechten zugreifen zu wollen, obwohl ein "Benutzer" in HKLM nur Leserechte besitzt.


Du kannst ja mal versuchen deine Anwendung mit Adminrechten zu starten.

divBy0 4. Sep 2012 23:53

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Adminrechte bringen keine Veränderung, habe ich auch schon getestet.

Ich gehe davon aus, dass der Hersteller da nochmal ran muss.

soulies 5. Sep 2012 12:58

AW: Benötige Hilfe bei der Nutzung einer DLL
 
hoi,

funktioniert es wenn Du die Aufrufkonvention von "stdcall" nach "cdecl" änderst ?

<OffTopic>
Ist das LKxxx Gerät ein Laser ?

Ich meine der Hersteller hat ja auch ne eigene Software mit dem "Navigator".
Wenn seine Anwendung mit der "LKIF2.dll" läuft - müsste es ja generell klappen oder ?
</OffTopic>

cya

divBy0 5. Sep 2012 22:59

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Ja, es ist ein Laser. Die LK-Navigator Software funktioniert, parametrieren kann ich das Gerät auch.

Die DLL habe ich vom Support bekommen, damit sollte ein Datenaustausch mit dem Auswertegerät möglich sein. Eine Beispielanwendung in VB6 ist auch dabei, nur funktioniert diese genauso wenig. :(

Die LK-Navigator Software nutzt die LKIF2.DLL nicht.

hoika 6. Sep 2012 06:22

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Hallo,

wenn die VB-Anwendung nicht läuft,
sind die Schuld.

Heiko

Bummi 6. Sep 2012 06:45

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Kann es sein dass ein Paket/DLL fehlt/nicht registriert ist?

divBy0 7. Sep 2012 11:27

AW: Benötige Hilfe bei der Nutzung einer DLL
 
Es scheint wirklich an der DLL zu liegen. Am Montag weiß ich mehr, da möchte sich der Keyence-Entwickler bei mir melden. :-D

Alles was ich bekommen habe ist ein Archiv mit 3 DLLs (LKIF2.DLL und 2 weitere, die von der LKIF2.DLL benötigt werden) eine HTML-Hilfe zu den Funktionen der DLL und die Beispielanwendung in VB6.

Bummi 7. Sep 2012 11:39

AW: Benötige Hilfe bei der Nutzung einer DLL
 
mal versuchsweise regsvr32 auf die DLL's losgelassen?


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