Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C/C++ - Dll Importe und Procedurezeiger (https://www.delphipraxis.net/10268-c-c-dll-importe-und-procedurezeiger.html)

Motzi 15. Okt 2003 08:14


C/C++ - Dll Importe und Procedurezeiger
 
Hi,

weiß jemand von euch, wie man in C/C++ Funktionen aus Dlls importiert? (was für ne Frage.. natürlich wisst ihr es, aber verratet ihr es mir auch? ;) :mrgreen: )

Und dann wüßte ich noch gerne wie man in C/C++ Prozedurzeiger deklariert, also sowas in der art:
Delphi-Quellcode:
  type
    TMyFunction = function: Boolean;
    TMyProcedure = procedure (x: Integer);
nur halt in C/C++...

Dankeschön! 8)

jbg 15. Okt 2003 08:48

Re: C/C++ - Dll Importe und Procedurezeiger
 
Bei C++ musst du, um die Funktion in Delphi zu importieren all deine Funktionen in ein
Delphi-Quellcode:
extern "C" { ... }
schreiben. Ansonsten benutzt der C++ Compiler das Namemangling, was du dann selbst je nach C++ Compiler austüfteln kannst.

Delphi-Quellcode:
function MyCFunction(MyParam: Integer); cdecl; external 'HierUndDa.dll';
Prozedurzeiger:
Delphi-Quellcode:
// type MYCALLBACK = function(Value: Integer): Char;
typedef char (*MYCALLBACK)(int Value);
MYCALLBACK c = MyCallBackFunction;[/delphi]

Motzi 15. Okt 2003 09:08

Re: C/C++ - Dll Importe und Procedurezeiger
 
Wie ich in Delphi Funktionen importier weiß ich, ich brauchs jetzt aber mal umgekehrt! ;) Ich will in C Funktion aus einer Delphi-Dll importieren!

Aber der 2te Teil hilft mir auch schonmal weiter! Danke! :)

Der Felertoifel 15. Okt 2003 23:16

Re: C/C++ - Dll Importe und Procedurezeiger
 
Soweit ich weiß, gibt es von MS ein Tool, mit welchem sich LIBs erstellen lassen. Und genau die brauchst du ja für statische Importe in C. Ansonsten dynamisch (s.o.)

NicoDE 16. Okt 2003 00:40

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von Der Felertoifel
Soweit ich weiß, gibt es von MS ein Tool, mit welchem sich LIBs erstellen lassen.

Kann man mit den vorhandenen Tools erledigen...

1.) Definitions-Datei anlegen (in diesem Beispiel 'C:\Temp\Test.def' für 'Test.dll' mit den Exporten 'Foo' und 'Bar')
Code:
LIBRARY Test
EXPORTS
    Foo
    Bar
2.) Import-Bibliothek erzeugen
Code:
C:\Temp> LINK -LIB /DEF:Test.def /MACHINE:X86
Microsoft (R) Library Manager Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.

   Bibliothek 'Test.lib' und Objekt 'Test.exp' wird erstellt

C:\Temp> DEL Test.exp
3.) ... (Include-Headerdatei schreiben und .lib + .h ins Projekt aufnehmen)


Gruß Nico

ps: um sich bei vielen Exporten die Arbeit zu erleichtern: LINK -DUMP Test.dll /EXPORTS > Test.def

[edit] habs doch noch gefunden: http://www.microsoft.com/msj/archive/S330.aspx [/edit]

Der Felertoifel 16. Okt 2003 09:30

Re: C/C++ - Dll Importe und Procedurezeiger
 
Hehe ...

"Kann man mit den vorhandenen Tools erledigen..."

Und LINK ist kein Tool von MS?

NicoDE 16. Okt 2003 09:46

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von Der Felertoifel
Und LINK ist kein Tool von MS?

:wiejetzt:
...naja, jedenfalls muss er nicht länger suchen.

Motzi 28. Okt 2003 11:56

Re: C/C++ - Dll Importe und Procedurezeiger
 
Ist zwar schon etwas länger her, aber jetzt hab ein neues Problem mit meinen Procedurezeigern, und ich weiß nicht ob es an meiner Deklaration liegt oder daran, dass ich die Variable global benötige und die Header-Datei daher in mehrere cpp-Files include...

Code:
typedef VNC_Methods* (*TFNLP_vncInitController)();

TFNLP_vncInitController      vncInitController;
(VNC_Methods ist ein Record)
Diese 2 Zeilen stehen in einer Header-Datei, die ich dann in 3 cpp-Files benötige. Beim kompilieren erhalte ich allerdings die Meldung "already defined":
Zitat:

Zitat von MSVC
ControllerWrapper.obj : error LNK2005: "struct VNC_Methods * (__cdecl* vncInitController)(void)" (?vncInitController@@3P6APAUVNC_Methods@@XZA) already defined in ClientConnection.obj
Daemon.obj : error LNK2005: "struct VNC_Methods * (__cdecl* vncInitController)(void)" (?vncInitController@@3P6APAUVNC_Methods@@XZA) already defined in ClientConnection.obj

Der Procedurzeiger wird dazu verwendet eine Funktion einer dyn. geladenen Dll aufzurufen...

Wer weiß worans liegt? :?

NicoDE 29. Okt 2003 12:30

Re: C/C++ - Dll Importe und Procedurezeiger
 
Du mußt dafür sorgen, daß die Deklaration nur einmal verarbeitet wird.
Zum Beispiel mit 'Header-Guards':
Code:
#ifndef _FILENAME_HPP_
#define _FILENAME_HPP_

//...

#endif //_FILENAME_HPP_

Stevie 1. Jul 2004 12:10

Re: C/C++ - Dll Importe und Procedurezeiger
 
Hi,

ich hab's genauso gemacht, wie es von NicoDE beschrieben wurde, aber es kommt immer folgende Fehlermeldung:
Zitat:

--------------------Konfiguration: Konsole - Win32 Debug--------------------
Linker-Vorgang läuft...
Konsole.obj : error LNK2001: Nichtaufgeloestes externes Symbol _CreateWindow
Debug/Konsole.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Konsole.exe - 2 Fehler, 0 Warnung(en)
So sieht meine Dll aus:
Delphi-Quellcode:
library Dll;

uses
  SysUtils,
  Classes,
  frDllForm in 'frDllForm.pas' {DllForm};

{$R *.res}

procedure CreateWindow; stdcall;
begin
  DllForm := TDllForm.Create(nil);
  DllForm.Show;
end;

exports
  CreateWindow;

begin
end.
Und so meine C-Header:
Code:
#ifndef DLL_H
#define DLL_H

extern void CreateWindow();

#endif

neolithos 1. Jul 2004 12:19

Re: C/C++ - Dll Importe und Procedurezeiger
 
Versuch es mal mit __stdcall void CreateWindow();

NicoDE 1. Jul 2004 12:35

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von Stevie
ich hab's genauso gemacht, wie es von NicoDE beschrieben wurde

Folgende Ansätze:
- CreateWindow ist zum Testen sicher kein 'guter' Name (da es eine API gleichen Namens gibt und der Linker vielleicht nicht damit zurecht kommt.
- Du hast die Funktion in C++ mit
Code:
extern "C" __declspec(dllimport) __stdcall
deklariert und die Importe in die DEF-Datei eingetragen (sonst sucht der Linker nach _CreateWindow@0 und nicht CreateWindow).


Gruss Nico

ps: das Schlüsselwort 'extern' hat in C++ eine völlig andere Bedeutung und nichts mit Im-/Exporten zu tun.

Stevie 1. Jul 2004 12:42

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von neolithos
Versuch es mal mit __stdcall void CreateWindow();

Code:
#ifndef DLL_H
#define DLL_H

__stdcall void CreateWindow();

#endif
Zitat:

--------------------Konfiguration: Konsole - Win32 Debug--------------------
Kompilierung läuft...
Konsole.c
e:\programme\visual studio 6\msdev98\myprojects\delphi\konsole\dll.h(4) : error C2059: Syntaxfehler : 'type'
e:\programme\visual studio 6\msdev98\myprojects\delphi\konsole\konsole.c(4) : warning C4013: 'CreateWindow' undefiniert; Annahme: extern mit Rueckgabetyp int
Fehler beim Ausführen von cl.exe.
Browse-Informationsdatei wird erstellt...

Konsole.exe - 1 Fehler, 1 Warnung(en)
@NicoDE Hallooo? :mrgreen:
Zitat:

Zitat von Motzi
Wie ich in Delphi Funktionen importier weiß ich, ich brauchs jetzt aber mal umgekehrt! Ich will in C Funktion aus einer Delphi-Dll importieren!


neolithos 1. Jul 2004 12:46

Re: C/C++ - Dll Importe und Procedurezeiger
 
Und nun bin ich ruhig!
Ich habe es bis jetzt leider nur C-Dll -> Delphi gemacht! :(

Ich weis nur das der andere weg etwas komlizierter ist. Muss man da nicht irgentwelche Datein erzeugen (.LIB).

NicoDE 1. Jul 2004 12:48

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von Stevie
@NicoDE Hallooo? :mrgreen:

Frag mich nach dem ersten Kaffee nochmal :D

Siehe meinen (oft) editierten Beitrag:
Code:
extern "C" {

__declspec( dllimport ) __stdcall void Foo();

}
Und die mittels DEF-Datei generierte LIB nicht vergessen.

Stevie 1. Jul 2004 12:51

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von neolithos
Und nun bin ich ruhig!
Ich habe es bis jetzt leider nur C-Dll -> Delphi gemacht! :(

Das ist ja Pille-Palle. Das bekomm ja sogar ich schon hin! :mrgreen:
Zitat:

Zitat von neolithos
Ich weis nur das der andere weg etwas komlizierter ist. Muss man da nicht irgentwelche Datein erzeugen (.LIB).

Ey, lest ihr heute alle nicht, oder was? :mrgreen: Das hat NicoDE doch oben erklärt! :drunken:

Stevie 1. Jul 2004 12:55

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von NicoDE
Frag mich nach dem ersten Kaffee nochmal :D

Wann trinkst du denn deinen ersten Kaffee? :gruebel:
Zitat:

Zitat von NicoDE
Siehe meinen (oft) editierten Beitrag

Code:
#ifndef DLL_H
#define DLL_H

extern "C" __declspec(dllimport) __stdcall void FensterErstellen();

#endif
Zitat:

--------------------Konfiguration: Konsole - Win32 Debug--------------------
Kompilierung läuft...
Konsole.c
e:\programme\visual studio 6\msdev98\myprojects\delphi\konsole\dll.h(4) : error C2059: Syntaxfehler : 'string'
e:\programme\visual studio 6\msdev98\myprojects\delphi\konsole\konsole.c(4) : warning C4013: 'FensterErstellen' undefiniert; Annahme: extern mit Rueckgabetyp int
Fehler beim Ausführen von cl.exe.
Browse-Informationsdatei wird erstellt...

Konsole.exe - 1 Fehler, 1 Warnung(en)

NicoDE 1. Jul 2004 13:02

Re: C/C++ - Dll Importe und Procedurezeiger
 
off-topic: spät ;)

topic:
- sicher dass die LIB im Projekt vorhanden ist?
- die Endung .c sorgt dafür dass der Code als C und nicht als C++ kompiliert wird (extern "C" gibt es nur für C++)

Stevie 1. Jul 2004 13:09

Re: C/C++ - Dll Importe und Procedurezeiger
 
Ok, ich hab jetzt die Datei in *.cpp umbenannt. (Kann man nur in C++ dlls importieren?)
Außerdem hab ich meine lib unter Objekt-/Bibliothek-Module eingetragen.

Zitat:

Konsole.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__FensterErstellen
Meine *.def-Datei, nach der ich die *.lib erstellt hab, sieht so aus:
Code:
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file Dll.dll

File Type: DLL

  Section contains the following exports for Dll.dll

           0 characteristics
           0 time date stamp Thu Jan 01 01:00:00 1970
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA     name

          1    0 0005436C FensterErstellen

  Summary

        1000 .edata
        3000 .idata
        6000 .reloc
        4000 .rsrc
        1000 BSS
       54000 CODE
        2000 DATA

NicoDE 1. Jul 2004 14:21

Re: C/C++ - Dll Importe und Procedurezeiger
 
Zitat:

Zitat von Stevie
Kann man nur in C++ dlls importieren?

Nope, dann muss man das extern "C" weglassen. Eine allgemeine Lösung für C/C++ sieht etwa so aus:
Code:
/* dll.h */
#ifndef DLL_INCLUDED
#define DLL_INCLUDED

/* #pragma lib "dll.lib" */

#ifdef __cplusplus
extern "C" {
#endif

__declspec(dllimport) __stdcall void FensterErstellen();

#ifdef __cplusplus
}
#endif

#endif /* DLL_INCLUDED */

Stevie 1. Jul 2004 14:28

Re: C/C++ - Dll Importe und Procedurezeiger
 
Ok, ich hab das jetzt so eingebaut (void und __stdcall umgedreht :zwinker:)...
Aber immernoch kommt:
Zitat:

--------------------Konfiguration: Konsole - Win32 Debug--------------------
Linker-Vorgang läuft...
Konsole.obj : error LNK2001: Nichtaufgeloestes externes Symbol __imp__FensterErstellen@0
Debug/Konsole.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Konsole.exe - 2 Fehler, 0 Warnung(en)
Die Lib hab ich sowohl ins Projekt gepackt, als auch in die Bibliotheken...
AAARGH!!! :wall: :wall: :wall:

NicoDE 1. Jul 2004 14:36

Re: C/C++ - Dll Importe und Procedurezeiger
 
Vorschlag - bevor hier noch länger rumgeraten wird: zippen und anhängen :)

Stevie 1. Jul 2004 14:51

Re: C/C++ - Dll Importe und Procedurezeiger
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von NicoDE
Vorschlag - bevor hier noch länger rumgeraten wird: zippen und anhängen :)

Vorschlag angenommen... :wink:

Stevie 1. Jul 2004 16:00

Re: C/C++ - Dll Importe und Procedurezeiger
 
Ich hab den Fehler gefunden!!! :bounce2: :bounce2:
Und zwar muss man in der def-Datei den Parameter DATA hinter der Funktion mitangeben, NicoDE wird mir bestimmt erklären warum!?
Und wie ich mit dem Linker eine solche def-Datei erstelle, weil mit dem Befehl oben hat's nicht geklappt.
Ich hab aber keine Lust bei größeren Dlls alles selber in die def zu klimpern, welcher Paramter sagt denn das???

... Nachtrag nach der Recherche im Internet:

Borland-Dlls sind wohl irgendwie anders von den Aufruf-Konventionen (ich hab's auch nicht ganz verstanden):gruebel:
Also muss man das Tool von Borland nehmen um def-Dateien zu erstellen, und zwar so:
Code:
IMPDEF destname[.def] srcname[.dll]
ICH HASSE DIESES DURCHEINANDER!!! :evil:


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