AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C-DLL Probleme in Delphi

Ein Thema von Kleiner Delphin · begonnen am 19. Mai 2009 · letzter Beitrag vom 19. Mai 2009
Antwort Antwort
Kleiner Delphin

Registriert seit: 15. Mai 2009
13 Beiträge
 
#1

C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 14:40
Hallo,

ich habe ja nun angefnagen mit der Doku, also wollte ich anfangen zu prüfen, kommt eine Verbindung zu stande, aber ich komme bereits dort auf Probleme

Entweder hab ich etwas falsch gemacht oder verstehe nichts von C im zusammenhang mit Delphi.

Folgedes, die DLL die mit C erstellt ist

Zitat:
NoMangle long DLL_IMPORT_EXPORT csp2Init(long nComPort);
Nun hab ich die DLL im Windows Verzeichniss, da von dort andere dlls wie kernel usw noch geladen werden.

Ich habe unterhalb von public und Private eine Procedure weil mir nichts anderes bewusst ist als externe angegeben sieht so aus

procedure csp2Init(nComPort: LongInt); external 'Csp2.dll' in einer procedure hab ich nun

csp2Init(1); da LongInt ein Integer erwartet laut Doku sollte es so gehen

Zitat:
// try to initialize COM1…
If (csp2Init(COM1) == STATUS_OK)
{
// we can use COM1 to talk to a CSP2 device…
}
else
{
// COM1 is not available
}

nun wenn ich ausführe kommt eine Exception vom Type EConvertError mit dem Inhalt

Zitat:
Format '%p' ungültig oder nicht kompatibel mit Argument.
ich habe long in LongInt gemacht da PLong nich existiert meine Quelle war diese

http://www.herculina.de/dllusage.htm

Bedanke mich schon im Vorraus
Vieles lässt sich an einen Tag erstellen aber Rom bestimmt nicht
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 15:11
Hallo,

Hallo,

schon das

if (csp2Init(COM1) == STATUS_OK) hätte dir doch sagen müssen,
dass es eine Funktion, keine Prozedur ist.

function csp2Init(nComPort: LongInt): Longint;

wobei LongInt oder Integer hier egal ist (32bit).

In Google findet man zum Bsp. zu DLL_IMPORT_EXPORT

#define DLL_IMPORT_EXPORT __declspec(dllexport)


__declspec heisst in Delphi stdcall;

function csp2Init(nComPort: LongInt): Longint; stdcall;

Unter C wird bei Funktionsnamen immer ein _ vorangestellt.

function _csp2Init(nComPort: LongInt): Longint; stdcall;


NoMangle musst du noch rausfinden.


Heiko
Heiko
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 15:15
Zitat von hoika:
__declspec heisst in Delphi stdcall;
Wäre mir neu. Schau mal nach, wie DLL_IMPORT_EXPORT in diesem Header definiert ist, möglicherweise ist dort explizit stdcall oder cdecl angegeben; ansonsten solltest du in Delphi einfach beides mal ausprobieren.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Kleiner Delphin

Registriert seit: 15. Mai 2009
13 Beiträge
 
#4

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 15:19
danke

NoMangle deutet an das es 'extern "C"' heisst, was bedeutet das die Funktion genau mit dem angegebenen Namen exportiert wird.

DLL_IMPORT_EXPORT bedeutet letztlich einfach stdcall

Danke werde es nun versuchen

Nun kam zwischenzeitlich noch ein Post

Zitat:
Code:
#ifdef DLL_IMPORT_EXPORT
    #undef DLL_IMPORT_EXPORT
#endif

#ifdef DLL_SOURCE_CODE
    #define DLL_IMPORT_EXPORT __declspec(dllexport) __stdcall
#else
    #define DLL_IMPORT_EXPORT __declspec(dllimport) __stdcall
#endif
so steht es in den Definitionen

Hier mal die Komplette Datei
Zitat:
Code:
/*******************************************************************************
*                     
*  Filename:     K:\keyfob\tony\winfob\Csp2.h
*
*  Copyright(c) Symbol Technologies Inc., 2001

*  Description:    This file provides the user API interface
*                   function prototypes for Symbol's CS1504 Consumer Scanning
*                   Products as Dynamic Link Library. When
*                   compiled into a DLL, the user can access
*                   all of the functions available for the
*                   Symbol CS1504.
*
*  Author:         Tony Russo
*
*  Creation Date:  4/04/2001
*
*  Derived From:   New File
*
*  Edit History:
*   $Log:  U:/keyfob/winfob/include/CSP2.H_V $

*    Rev 1.1   Jan 29 2002 16:29:54   pangr
* Incorporated CWB changes.
* Added #defines for DATA_AVAILABLE and
* DATA_NOT_AVAILABLE. Added prototypes for
* csp2EnablePolling and csp2DisablePolling

*    Rev 1.0   05 Apr 2001 09:24:16   RUSSOA
* Initial revision.
*
*
*   Added Polling headers and helper functions 4/6/01 CWB
*******************************************************************************/
                   
/*******************************************************************************
* Include Files
*******************************************************************************/

/*******************************************************************************
* Defines
*******************************************************************************/ 
#ifdef DLL_IMPORT_EXPORT
    #undef DLL_IMPORT_EXPORT
#endif

#ifdef DLL_SOURCE_CODE
    #define DLL_IMPORT_EXPORT __declspec(dllexport) __stdcall
#else
    #define DLL_IMPORT_EXPORT __declspec(dllimport) __stdcall
#endif

#ifdef __cplusplus
    #define NoMangle extern "C"
#else
    #define NoMangle
#endif

// Returned status values...
#define STATUS_OK                  ((long) 0)
#define COMMUNICATIONS_ERROR       ((long)-1)
#define BAD_PARAM                  ((long)-2)
#define SETUP_ERROR                ((long)-3)
#define INVALID_COMMAND_NUMBER     ((long)-4)
#define COMMAND_LRC_ERROR          ((long)-7)
#define RECEIVED_CHARACTER_ERROR   ((long)-8)
#define GENERAL_ERROR              ((long)-9)
#define FILE_NOT_FOUND             ((long) 2)
#define ACCESS_DENIED              ((long) 5)

// Parameter values...
#define PARAM_OFF                  ((long) 0)
#define PARAM_ON                   ((long) 1)

#define DATA_AVAILABLE             ((long) 1)
#define NO_DATA_AVAILABLE          ((long) 0)

#define DETERMINE_SIZE             ((long) 0)

/*******************************************************************
 *              Communications setup section...                   *
 *******************************************************************/

#ifndef COM1
    #define COM1                    ((long) 0)
    #define COM2                    ((long) 1)
    #define COM3                    ((long) 2)
    #define COM4                    ((long) 3)
    #define COM5                    ((long) 4)
    #define COM6                    ((long) 5)
    #define COM7                    ((long) 6)
    #define COM8                    ((long) 7)
    #define COM9                    ((long) 8)
    #define COM10                   ((long) 9)
    #define COM11                   ((long)10)
    #define COM12                   ((long)11)
    #define COM13                   ((long)12)
    #define COM14                   ((long)13)
    #define COM15                   ((long)14)
    #define COM16                   ((long)15)
#endif

/*******************************************************************************
* Public Variables
*******************************************************************************/ 

/*******************************************************************************
* Local Variables
*******************************************************************************/ 

/*******************************************************************************
* Public Function Prototypes
*******************************************************************************/ 
// Communications
NoMangle long DLL_IMPORT_EXPORT csp2Init(long nComPort);
NoMangle long DLL_IMPORT_EXPORT csp2Restore(void);
NoMangle long DLL_IMPORT_EXPORT csp2WakeUp(void);
NoMangle long DLL_IMPORT_EXPORT csp2DataAvailable(void);

// Basic Functions
NoMangle long DLL_IMPORT_EXPORT csp2ReadData(void);
NoMangle long DLL_IMPORT_EXPORT csp2ClearData(void);
NoMangle long DLL_IMPORT_EXPORT csp2PowerDown(void);
NoMangle long DLL_IMPORT_EXPORT csp2GetTime(unsigned char aTimeBuf[]);
NoMangle long DLL_IMPORT_EXPORT csp2SetTime(unsigned char aTimeBuf[]);
NoMangle long DLL_IMPORT_EXPORT csp2SetDefaults(void);

// CSP Data Get
NoMangle long DLL_IMPORT_EXPORT csp2GetPacket(char szBarData[], long nBarcodeNumber, long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2GetDeviceId(char szDeviceId[8], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2GetProtocol(void);
NoMangle long DLL_IMPORT_EXPORT csp2GetSystemStatus(void);
NoMangle long DLL_IMPORT_EXPORT csp2GetSwVersion(char szSwVersion[9], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2GetASCIIMode(void);
NoMangle long DLL_IMPORT_EXPORT csp2GetRTCMode(void);

// DLL Configuration
NoMangle long DLL_IMPORT_EXPORT csp2SetRetryCount(long nRetryCount);
NoMangle long DLL_IMPORT_EXPORT csp2GetRetryCount(void);

// Miscellaneous
NoMangle long DLL_IMPORT_EXPORT csp2GetDllVersion(char szDllVersion[], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2TimeStamp2Str(unsigned char *Stamp, char *value, long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2GetCodeType(unsigned long CodeID, char *CodeType, long nMaxLength);

// Advanced functions
NoMangle long DLL_IMPORT_EXPORT csp2ReadRawData(char aBuffer[], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2SetParam(long nParam, char szString[], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2GetParam(long nParam, char szString[], long nMaxLength);
NoMangle long DLL_IMPORT_EXPORT csp2Interrogate(void);
NoMangle long DLL_IMPORT_EXPORT csp2GetCTS(void);
NoMangle long DLL_IMPORT_EXPORT csp2SetDTR(long nOnOff);
NoMangle long DLL_IMPORT_EXPORT csp2SetDebugMode(long nOnOff);
NoMangle long DLL_IMPORT_EXPORT csp2StartPolling(FARPROC csp2CallBack);
NoMangle long DLL_IMPORT_EXPORT csp2StopPolling(void);
NoMangle long DLL_IMPORT_EXPORT csp2EnablePolling(void);
NoMangle long DLL_IMPORT_EXPORT csp2DisablePolling(void);


/*******************************************************************************
* Local Functions Prototypes
*******************************************************************************/ 

/*******************************************************************
 *                       End of file                              *
 *******************************************************************/
[edit=mkinzler]C-Tags eingefügt Mfg, mkinzler[/edit]
Vieles lässt sich an einen Tag erstellen aber Rom bestimmt nicht
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 15:52
Hallo,

Zitat:
NoMangle deutet an das es 'extern "C"' heisst, was bedeutet das die Funktion genau mit dem angegebenen Namen exportiert wird.
Falsch.
Es bedeutet, dass kein C++-Name-Mangling gemacht wird

Bsp:
int foo -> wird zu int _foo@0

extern C heisst, dass nur der Unterstrich als Prefix drankommt.

schau dir die DLL doch mal mit einem Hex-Editor an.
Im Header stehen die exportierten Namen.

Es gab doch mal ein Tool für die exportierten Funktionen
(Schnellansicht im Explorer ?)


Heiko
Heiko
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 16:06
tdump.

Ansonsten musst du deine eine Aussage invertieren: extern "C" bedeutet, dass kein Name mangling durchgeführt wird, es also extra kein "@0" Suffix bekommt (bzw. Signatursuffix im allgemeinen).
  Mit Zitat antworten Zitat
Kleiner Delphin

Registriert seit: 15. Mai 2009
13 Beiträge
 
#7

Re: C-DLL Probleme in Delphi

  Alt 19. Mai 2009, 16:42
function csp2Init(nComPort: Integer) : Integer; stdcall; external 'Csp2.dll' in einer Procedure

Delphi-Quellcode:
error := csp2Init(0); //COM1
GetErrorMessage(error);
Die Procdeure GetErrorMessage gibt eine Fehlermeldung falls kein 0 ist aus, es ist momentan erstmal nur der Test um Daten auszulesen klar ist das das nicht sondlich schön aber es funktioniert

Wenn ich -1 angebe kommt Ungültige Parameter BAD PARAMS wenn ich eine nicht vohranden Schnittstelle anvisiere kommt BAD CONNECTIOn

Wenn ich 0 nehme für COM1 kommt auch wenn ich das abfragen würde ALLES STATUS_OK

Also funktionert es ohne error := _csp2Init(0)

Werd aber weiter machen und schauen, im prinzip wird die DLL ja verarbeitet deswegen die rückmeldungen also scheint es doch nun gelöst zu sein.

Für meine Sicht bin ich zufrieden
Vieles lässt sich an einen Tag erstellen aber Rom bestimmt nicht
  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 13:20 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