AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

.OBJ-Dateien in Delphi einbinden

Offene Frage von "chaosben"
Ein Thema von jwinkl · begonnen am 6. Mär 2005 · letzter Beitrag vom 11. Jun 2011
Antwort Antwort
jwinkl

Registriert seit: 6. Mär 2005
2 Beiträge
 
Delphi 5 Professional
 
#1

.OBJ-Dateien in Delphi einbinden

  Alt 6. Mär 2005, 18:34
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: .OBJ-Dateien in Delphi einbinden

  Alt 11. Jun 2011, 14:41
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.
Martin Schaefer

Geändert von mschaefer (11. Jun 2011 um 19:51 Uhr) Grund: ergänzt
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

AW: .OBJ-Dateien in Delphi einbinden

  Alt 11. Jun 2011, 15:03
Hier gibt es einen sehr guten Artikel dazu.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 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