Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi .OBJ-Dateien in Delphi einbinden (https://www.delphipraxis.net/41658-obj-dateien-delphi-einbinden.html)

jwinkl 6. Mär 2005 18:34


.OBJ-Dateien in Delphi einbinden
 
Ich möchte in C oder C++ einige Routinen schreiben, diese mit bcc32 kompilieren und die OBJ-Dateien dann in Delphi einbinden und aufrufen. Dieses Feature ist in der Delphi-Hilfe erwähnt (bei den external-Deklarationen), aber nicht gut dokumentiert; insbesondere fehlt mir ein einfaches, instruktives Beispiel. Für ein solches oder einen Tipp wäre ich sehr dankbar.

Gruß Johann

mschaefer 11. Jun 2011 14:41

AW: .OBJ-Dateien in Delphi einbinden
 
um mal eine Lösung hier in die Bibliothek zu legen, gibt es jetzt noch eine Antwort zu dem Thema.



LIB - OBJ
LIB-Files sind Sammlungen OBJ-Files in einer Datei plus Headerinformation. Beim CBuilder kann man mit tlib32.exe mehrere .obj-Files in ein .lib-File einbinden, was dann mittels #pragma comment( lib, "mylib.lib" ) im Quelltextheader eingebunden wird.

Woher kommen OBJ-Files
Sie werden generiert vom Compiler und dann dem Linker zur Verfügung gestellt. Beim Compilieren eines obj.c Files mit dem Borland C++ Compiler (bcc32 -c obj.c) bekommt man ein OMF.OBJ-File. Auch Delphi bis aktuell XE-1 kann diese generieren (siehe Einstellungen des Compilers), hat aber keinen Linker dafür onboard.

OMF- COFF
OBJ-Files gibt es in verschiedenen Formaten. Hier wären das Intel Object Module Format, OMF und das Common Object File Format (COFF). MS-COFF ist entstanden, als MS NT für Alpha-Prozessoren entwickelte. Microsoft Visual C++-Compiler erstellt COFF-OBJ-Dateien. Delphi erstellt bis XE-1 OMF-OBJ-Dateien.

OMF -> COFF - Wandlung
Bis Delphi 7 mit OMF2D. Delphi OBJ-Files bis D2007 kann man mit in VS-2003 C++-Projekte konvertieren (link -edit omffile.obj oder EDITBIN omffile.obj) und einbinden. Mit VS2005 ist das nicht mehr machbar und bei 64-Bit trennen sich die Wege vollkommen.

COFF -> OMF - Wandlung
Geht mit Tools wie coff2omf von Digital Mars Wobei man dabei auch maximal von VS2005 ausgehen kann. Hier braucht man schon einen Zwischenschritt (link /lib /convert file.lib) um ein älteres COFF-Format zu generieren, was dann mit (coff2omf user32.lib) in das OMF-Format konvertiert werden kann. Hier werden also LIB-Files konvertiert (z.B.: coff2omf user32.lib). So ein Konverter für ein älteres COFF-Format liegt auch CBuilder bei, sogar für dll´s mit den Tools "implib" und "impdef".



OMF-OBJ-Files in Unit einbinden
Um die Routinen einer compilierten OBJ-Datei aufrufen, muss zunächst die die OBJ-Datei mit der Compiler-Direktive $L (oder $LINK) gelinkt werden. Das sieht folgend aus: {$L ROUTINES.OBJ} Diese Anweisung linkt die Datei ROUTINES.OBJ zur akutellen Unit und damit ins eingene Programm. Leider werden die enthaltenen Routinen in Ihr nicht automatisch für Delphi verfügbar, sondern diese müssen, wie bei einer dll, deklariert werden, um sie anschließend aufrufen zu können.

Delphi-Quellcode:
unit zlib;
interface

 {$L deflate.obj}
 {$L inflate.obj}
 {$L inftrees.obj}
 {$L trees.obj}
 {$L adler32.obj}
 {$L infblock.obj}
 {$L infcodes.obj}
 {$L infutil.obj}
 {$L inffast.obj}
   ...
 
 procedure _tr_init;                   external;
 procedure _tr_tally;                  external;
 procedure _tr_flush_block;            external;
 procedure _tr_align;                  external;
 procedure _tr_stored_block;           external;
 procedure adler32;                    external;
 procedure inflate_blocks_new;         external;
 ...
 
implementation

 procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl;
 begin
 FillChar(P^, count, B);
 end;

 procedure _memcpy(dest, source: Pointer; count: Integer);cdecl;
 begin
 Move(source^, dest^, count);
 end;
 ...
Ein C-Compiler nimmt nich das Delphi "StdCall", sondern "cdecl" als Compiler-Direktive, dass muss im Aufruf der Funktion angegeben werden.

chaosben 11. Jun 2011 15:03

AW: .OBJ-Dateien in Delphi einbinden
 
Hier gibt es einen sehr guten Artikel dazu.


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