Delphi-PRAXiS
Seite 1 von 3  1 23      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 Uhr.
Seite 1 von 3  1 23      

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