Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden) (https://www.delphipraxis.net/168486-c-dll-delphi-einbinden-prozedureinsprungspunkt-nicht-gefunden.html)

Pow3rus3r 24. Mai 2012 07:03

c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Hallo zusammen,

ich habe ein Problem mit dem Einbinden einer c DLL in Delphi. Und zwar habe ich eine DLL von einem Hardwarehersteller vorgegeben, die ich nun einbinden möchte und bekomme immer den Fehler, dass die Funktion/Prozedureinsprungspunkt nicht gefunden wurde.

Der Funktionsaufruf ist in der Doku so definiert:
COM_RbsManipulationReq (COM_Handle handle, COM_RbsManipulation manipulation)

Die Typedef von COM_RbsManipulation ist in c wie folgt:
Code:
typedef struct COM_RbsManipulationtag
{
    u08 TriggerType_1;
    u08 TriggerMode_1;
    u32 TriggerSource_1;
    u32 TriggerValue_1;
    u32 TriggerHysterese_1;
 
    u08 TriggerType_2;
    u08 TriggerMode_2;
    u32 TriggerSource_2;
    u32 TriggerValue_2;
    u32 TriggerHysterese_2;
 
    u08 TriggerType_3;
    u08 TriggerMode_3;
    u32 TriggerSource_3;
    u32 TriggerValue_3;
    u32 TriggerHysterese_3;
 
    u08 TriggerType_4;
    u08 TriggerMode_4;
    u32 TriggerSource_4;
    u32 TriggerValue_4;
    u32 TriggerHysterese_4;
 
    u16 DelayValue;
    u08 DelayType;
 
    u08 BusId;
 
    u08 SequenceNumber;
    u08 ManipulationType;
    u16 ManipulationDuration;
    u08 ManipulationDurationType;
    u08 ManipulationMode;
    u32 ManipulationTarget;
    u16 ManipulationTargetValue;
    u32 ManipulationValue1;
    u32 ManipulationValue2;
    u32 ManipulationValue3;
 
    u32 MinValue;
    u32 MaxValue;
    u08 MinMaxMode;
    u08 BaseDataType;
}COM_RbsManipulation;
u08, u16 und u32 sind so definiert:
Code:
typedef unsigned char u08 
typedef unsigned short u16 
typedef unsigned long u32
Ich habe die Typedef nun auf Delphi umgemünzt, jedoch scheint er das so nicht zu fressen:
Delphi-Quellcode:
type
  Manipulationtag = record
    TriggerType_1: byte;
    TriggerMode_1: byte;
    TriggerSource_1: cardinal;
    TriggerValue_1: cardinal;
    TriggerHysterese_1: cardinal;

    TriggerType_2: byte;
    TriggerMode_2: byte;
    TriggerSource_2: cardinal;
    TriggerValue_2: cardinal;
    TriggerHysterese_2: cardinal;

    TriggerType_3: byte;
    TriggerMode_3: byte;
    TriggerSource_3: cardinal;
    TriggerValue_3: cardinal;
    TriggerHysterese_3: cardinal;

    TriggerType_4: byte;
    TriggerMode_4: byte;
    TriggerSource_4: cardinal;
    TriggerValue_4: cardinal;
    TriggerHysterese_4: cardinal;

    DelayValue: word;
    DelayType: byte;

    BusId: byte;

    SequenceNumber: byte;
    ManipulationType: byte;
    ManipulationDuration: word;
    ManipulationDurationType: byte;
    ManipulationMode: byte;
    ManipulationTarget: cardinal;
    ManipulationTargetValue: word;
    ManipulationValue1: cardinal;
    ManipulationValue2: cardinal;
    ManipulationValue3: cardinal;

    MinValue: cardinal;
    MaxValue: cardinal;
    MinMaxMode: byte;                  
    BaseDataType: byte;                  
end;
Ich verzweifele gerade daran und bekomme immer wieder meinen Fehler "Prozedureinsprungspunkt nicht gefunden. Ein DLL Export viewer zeigt mir den Funktionsnamen in der DLL so an: _COM_RbsManipulationReq@112

Ich bin für alle Tipps dankbar!

himitsu 24. Mai 2012 07:31

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
unsigned long = LongWord


Aber wenn die DLL nicht gefunden winrd, dann hat das rein garnichts mit diesem Record zu tun,
denn Delphi beachtet/verbaut keine Parametersignaturen, bei der Generierung des Importnamen.
Der Importname entspricht standardmäßig genau dem Funktionsnamen, wenn man nichts Anderes angibt.

Delphi-Quellcode:
function xyt(...): ...; stdcall;

...

function xyt(...): ...; external ... name '_COM_RbsManipulationReq@112';

Pow3rus3r 24. Mai 2012 08:20

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Danke! Genau das war der entscheidende Hinweis:
Delphi-Quellcode:
name '_COM_RbsManipulationReq@112';
:thumb:

Pow3rus3r 25. Mai 2012 07:22

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Ich hätte da gleich noch eine Frage zu den C Datentypen.
Folge Typedef in C ist noch vorhanden:
Code:
typedef unsigned long long u64
Was wäre der adäquate Ersatz dafür in Delphi? gibts überhaupt einen 64 Bit Datentypen in Delphi?

DeddyH 25. Mai 2012 07:25

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Klappt es mit UINT64?

EWeiss 25. Mai 2012 13:57

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Zitat:

Zitat von himitsu (Beitrag 1167846)
unsigned long = LongWord


Aber wenn die DLL nicht gefunden winrd, dann hat das rein garnichts mit diesem Record zu tun,
denn Delphi beachtet/verbaut keine Parametersignaturen, bei der Generierung des Importnamen.
Der Importname entspricht standardmäßig genau dem Funktionsnamen, wenn man nichts Anderes angibt.

Delphi-Quellcode:
function xyt(...): ...; stdcall;

...

function xyt(...): ...; external ... name '_COM_RbsManipulationReq@112';

Hmm.. :gruebel: warum benötigt er für ein Delphi Programm die angabe der summe an Bytes von der Function aus der c++ DLL?
Würde ich verstehen wenn ich eine DLL in Delphi schreibe um diese mit C++ zu verwenden. aber umgekehrt?

gruss

himitsu 25. Mai 2012 14:12

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Das wurde doch vom C so exportiert.
Und da Delphi sowas nicht macht (abgesehn von den BPLs, welche ja C++Buildercompatibel sind), muß man den Namen angeben, welcher C vorgegeben wurde, um Dieses importieren zu können.

EWeiss 25. Mai 2012 14:18

AW: c DLL in Delphi einbinden (Prozedureinsprungspunkt nicht gefunden)
 
Zitat:

Zitat von himitsu (Beitrag 1168081)
Das wurde doch vom C so exportiert.
Und da Delphi sowas nicht macht (abgesehn von den BPLs, welche ja C++Buildercompatibel sind), muß man den Namen angeben, welcher C vorgegeben wurde, um Dieses importieren zu können.

Ach so .. Na dann ;)

gruss


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