![]() |
.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 |
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 ![]() 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:
Ein C-Compiler nimmt nich das Delphi "StdCall", sondern "cdecl" als Compiler-Direktive, dass muss im Aufruf der Funktion angegeben werden.
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; ... |
AW: .OBJ-Dateien in Delphi einbinden
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 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