![]() |
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:
nur halt in C/C++...
type
TMyFunction = function: Boolean; TMyProcedure = procedure (x: Integer); Dankeschön! 8) |
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:
schreiben. Ansonsten benutzt der C++ Compiler das Namemangling, was du dann selbst je nach C++ Compiler austüfteln kannst.
extern "C" { ... }
Delphi-Quellcode:
Prozedurzeiger:
function MyCFunction(MyParam: Integer); cdecl; external 'HierUndDa.dll';
Delphi-Quellcode:
MYCALLBACK c = MyCallBackFunction;[/delphi]
// type MYCALLBACK = function(Value: Integer): Char;
typedef char (*MYCALLBACK)(int Value); |
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! :) |
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.)
|
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
1.) Definitions-Datei anlegen (in diesem Beispiel 'C:\Temp\Test.def' für 'Test.dll' mit den Exporten 'Foo' und 'Bar')
Code:
2.) Import-Bibliothek erzeugen
LIBRARY Test
EXPORTS Foo Bar
Code:
3.) ... (Include-Headerdatei schreiben und .lib + .h ins Projekt aufnehmen)
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 Gruß Nico ps: um sich bei vielen Exporten die Arbeit zu erleichtern: LINK -DUMP Test.dll /EXPORTS > Test.def [edit] habs doch noch gefunden: ![]() |
Re: C/C++ - Dll Importe und Procedurezeiger
Hehe ...
"Kann man mit den vorhandenen Tools erledigen..." Und LINK ist kein Tool von MS? |
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
...naja, jedenfalls muss er nicht länger suchen. |
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:
(VNC_Methods ist ein Record)
typedef VNC_Methods* (*TFNLP_vncInitController)();
TFNLP_vncInitController vncInitController; 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:
Wer weiß worans liegt? :? |
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_ |
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:
Delphi-Quellcode:
Und so meine C-Header:
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.
Code:
#ifndef DLL_H
#define DLL_H extern void CreateWindow(); #endif |
Re: C/C++ - Dll Importe und Procedurezeiger
Versuch es mal mit __stdcall void CreateWindow();
|
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
- 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:
deklariert und die Importe in die DEF-Datei eingetragen (sonst sucht der Linker nach _CreateWindow@0 und nicht CreateWindow).
extern "C" __declspec(dllimport) __stdcall
Gruss Nico ps: das Schlüsselwort 'extern' hat in C++ eine völlig andere Bedeutung und nichts mit Im-/Exporten zu tun. |
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
Code:
#ifndef DLL_H
#define DLL_H __stdcall void CreateWindow(); #endif Zitat:
Zitat:
|
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). |
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
Siehe meinen (oft) editierten Beitrag:
Code:
Und die mittels DEF-Datei generierte LIB nicht vergessen.
extern "C" {
__declspec( dllimport ) __stdcall void Foo(); } |
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
Zitat:
|
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
Zitat:
Code:
#ifndef DLL_H
#define DLL_H extern "C" __declspec(dllimport) __stdcall void FensterErstellen(); #endif Zitat:
|
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++) |
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:
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 |
Re: C/C++ - Dll Importe und Procedurezeiger
Zitat:
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 */ |
Re: C/C++ - Dll Importe und Procedurezeiger
Ok, ich hab das jetzt so eingebaut (void und __stdcall umgedreht :zwinker:)...
Aber immernoch kommt: Zitat:
AAARGH!!! :wall: :wall: :wall: |
Re: C/C++ - Dll Importe und Procedurezeiger
Vorschlag - bevor hier noch länger rumgeraten wird: zippen und anhängen :)
|
Re: C/C++ - Dll Importe und Procedurezeiger
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
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:
ICH HASSE DIESES DURCHEINANDER!!! :evil:
IMPDEF destname[.def] srcname[.dll]
|
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