Verwendung einer Borland-DLL im MS-DeveloperStudio

Ich muss eine Borland-DLL (OMF-Format), welche Klassen enthält in einer Anwendung einbinden, welche mit dem Microsoft DeveloperStudio 5.0 (verwendet COFF-Format) erstellt wurde. Inzwischen habe ich erfahren, dass die Verwendung von Klassen, welche mit einem anderen Compiler erstellt wurden, wegen unterschiedlicher Formate nicht möglich ist. Deshalb habe ich eine Borland-DLL, welche einfache Funktionen exportiert und intern die Klassen wieder aus einer anderen DLL importiert und verwendet.
Um das Borland-Format (OMF) in das Microsoft-Format umzuwandeln habe ich dann die folgenden Möglichkeiten, welche auch von Microsoft angegeben werden, ohne Erfolg ausprobiert:

  1. EDITBIN mit der DLL ohne Optionen aufgerufen (konvertiert angeblich von OMF nach COFF). Meldete keinen Fehler, brachte nur eine Meldung, dass es ohne Optionen aufgerufen wurde und änderte auch das Datum der DLL.
  2. LIB aufgerufen, um zu der DLL eine Importlib zu erstellen, was jedoch immer zu der folgenden Fehlermeldung führte

_Microsoft ® 32-Bit Library Manager Version 5.10.7303
Copyright © Microsoft Corp 1992-1997. All rights reserved.

copaex.dll : fatal error LNK1136: invalid or corrupt file_
3. Ich habe auch das Object erhalten, durch dessen linken das Problem nur verschoben wird, da eas ja wieder auf die Klassen zugreift, welche in der Borland-DLL sind.

Da ich auch im Internet keine passenden Informationen zu den Schlagworten OMF, COFF und DLL gefunden habe, wende ich mich an Euch, in der Hoffnung, dass mir einer einen Tip geben kann, wie das Problem zu lösen ist oder eine sehr gute Informationsquelle nennen kann.
Vielen Dank

Michael Kühnle

Hallo Michael,

>>Inzwischen habe ich erfahren, dass die Verwendung von Klassen,
>>welche mit einem anderen Compiler erstellt wurden, wegen
>>unterschiedlicher Formate nicht möglich ist.

Es geht hier nicht um das Format, sondern um die Dekoration der Bezeichner. Jeder C++ Compiler ändert die Bezeichner von Klasssen, Funktionen, usw. anders, so daß ein anderer Linker(!) diese in der *.lib nicht finden kann, das gilt aber so viel ich weiß für C nicht.

>>Deshalb habe ich eine Borland-DLL, welche einfache Funktionen >>exportiert und intern die Klassen wieder aus einer anderen DLL >>importiert und verwendet.

Verstehe ich das richtig, Du hast eine zweite DLL mit Borland erstellt, die nur C Funktionen exportiert und intern aber die Klassen in der zweiten DLL verwendet? Wenn ja, dürfte das kein Problem sein, die beiden DLLs mit der exe zu verwenden. Allerdings solltest Du dann die Funktionen in der zweiten DLL
als extern „C“ kennzeichnen.

Gruß Patrick

folgende Idee - hab sie aber nicht ausprobiert, wuesste aber nicht, wieso das nicht funktionieren sollte:

Eine Methode ist im Prinzip nix anderes, als eine Funktion mit einem zusaetzlichen Argument, naemlich dem Self. Die Idee ist jetzt, dass Du einfach die Methoden exportierst wie ganz „normale“ Funktionen.

Ich weiss nich, ob das Delphi das zulaesst und wills auch gar nicht ausprobieren, aber sonst wirst Du schon irgendwie drum herum kommen, indem Du einfach so etwas machst:
TFoo = class(blah)
public:
function getBar(a, b:Integer):Integer;
.
.
end;

function c_getBar(Self:TFoo; a, b:Integer):Integer; export;
begin
Result:=Self.getBar(a, b);
end;

Jedenfalls brauchst Du jetzt noch sowas:

function c_new:TFoo;
begin
Result:=TFoo.Create;
end;

function c_free(s:TFoo):Integer;
begin
s.Free;
Result:=1;
end;

eventuell halt mit Argumenten.

Dann musst Du das ganze nur noch in einer C+±Wrapper-Klasse kapseln und von dort einfach die DLL-Funktionen importieren und aufrufen. Im constructor rufst Du einfach das c_new auf und merkst es Dir:

class Foo {
void *delphiobj;
Foo() {
delphiobj = c_new();
}

~Foo() {
c_free(delphiobj);
}

int getFoo(int a, int b) {
return c_getFoo(delphiobj, a, b);
}

.
.
.
}

(keine Gewaehr fuer Korrektheit).

Noch 2 Dinge sind zu beachten: Die Aufrufkonventionen von Delphi und C++ sind verschieden. Das musst Du einfach angeben, je nachdem in C++ oder Delphi (zB stdcall oder sowas). Es muss halt uebereinstimmen. Wenns abstuerzt ist was faul :smile: .
Weiters kann so natuerlich nicht direkt auf die Eigenschaften der Klassen zugegriffen werden. Da brauchts dann immer ein getFoo und/oder ein setFoo. Aber das sollte man wegen dem OO-Konzept sowieso immer machen, eigentlich.

cu
Michael