2008-12-17 5 views
16

Wir müssen eine Schnittstelle zu Drittanbieter-App, aber Unternehmen hinter der App nicht Nachrichtsprotokoll offen legen und bietet nur Windows-DLL zu Schnittstelle zu.Verwenden von Windows DLL von Linux

Unsere Anwendung ist Linux-basiert, so dass ich nicht direkt mit DLL kommunizieren kann. Ich konnte keine existierende Lösung finden, deshalb überlege ich, Socket-basierte Bridge zwischen Linux und Windows zu schreiben, aber ich bin mir sicher, dass es kein so einzigartiges Problem ist und jemand hätte es schon mal machen sollen.

Kennen Sie eine Lösung, mit der Windows DDL-Funktionen von der C-App unter Linux aufgerufen werden können? Es kann Wine oder separaten Windows PC verwenden - spielt keine Rolle.

Vielen Dank im Voraus.

Antwort

8

Jede Lösung benötigt eine TCP/IP-basierte "Remoting" -Schicht zwischen der DLL, die in einer "Windows-ähnlichen" Umgebung ausgeführt wird, und Ihrer Linux-App.

Sie müssen eine einfache PC-Anwendung schreiben, um die DLL-Funktionen verfügbar zu machen, entweder mit einem Homebrew-Protokoll oder vielleicht mit XML-RPC-, SOAP- oder JSON-Protokollen. Die RemObjects SDK könnte Ihnen helfen - aber könnte Overkill sein.

Ich würde mit einem "echten" oder virtualisierten PC bleiben. Wenn Sie Wine verwenden, bieten die DLL-Entwickler wahrscheinlich keinen Support an.

MONO ist auch wahrscheinlich keine Hilfe, weil Ihre DLL wahrscheinlich keine .NET-Assembly ist.

1

Der Aufruf der DLL-Funktionen selbst ist natürlich nur die Spitze des Eisbergs. Was, wenn die DLL Win32 aufruft, dann hätten Sie ein ziemlich großes Verbindungsproblem. Ich denke, Wine könnte dir da draußen helfen, nicht sicher, ob sie eine Lösung bieten.

+0

Bei der letzten Überprüfung konnte WINE nur dazu verwendet werden, Prozesse und nicht einzelne DLLs innerhalb eines Nicht-WINE-Prozesses zu hosten. –

-1

Ich habe es nicht getan, aber Sie können möglicherweise einen Wrapper dafür mit MONO erstellen.

0

IMO, die beste Wette ist die Verwendung von Sockets. Ich habe das vorher gemacht und es funktioniert wie ein Zauber.

+0

Das war meine ursprüngliche Idee. Es scheint so zu sein, dass ich gehen muss. – qrdl

2

Manchmal ist es besser, einen kleinen Anbieter über einen großen Anbieter auszuwählen, da die Größe Ihres Unternehmens Ihnen mehr Gewicht verleiht. Wir haben das sicherlich bei AV-Engine-Anbietern gefunden.

Wenn Sie für sie ausreichend wichtig sind, sollten sie entweder ein dokumentiertes, unterstütztes Protokoll, einen Linux-Build der Bibliothek oder den Quellcode für die Bibliothek bereitstellen.

Andernfalls müssen Sie eine Windows-Box in der Schleife mit RPC ausführen, wie andere bemerkt haben, was wahrscheinlich sehr unbequem ist, besonders wenn der gesamte Rest Ihrer Infrastruktur Linux ausführt.

Unterstützt der Anbieter die Verwendung seiner Bibliothek in einer Windows VM? Wenn die Leistung nicht kritisch ist, können Sie dies möglicherweise tun.

6

Holen Sie sich einen Sniffer und lernen Sie das Protokoll. Das ist was ich tue.

0

Es ist ein paar Jahre her, seit die Frage gestellt wurde, aber hier ist ein anderer Ansatz. Verwenden Sie objdump -d, um die DLL zu demontieren. Sie erhalten möglicherweise reinen, nicht qualifizierten Müll oder Code voller Windows-Anrufe oder beides. Funktionen werden oft durch eine Reihe von push Anweisungen begrenzt und enden mit einer ret Anweisung.

3

Obwohl diese Frage eher alt ist, hat das Thema scheinbar nicht an Relevanz verloren. Wenn Sie Python benutzen können oder benutzen ...Hier ist meine Lösung.

Ich schrieb ein kleines Python-Modul zum Aufruf von Windows-DLLs von Python unter Linux. Es basiert auf IPC zwischen einem normalen Linux/Unix Python-Prozess und einem Wine-basierten Python-Prozess. Da ich es in zu vielen verschiedenen Anwendungsfällen/Szenarien selbst benötigt habe, habe ich es als "generischen" ctypes module Drop-in-Ersatz entworfen, der die meisten erforderlichen Rohrleitungen automatisch im Hintergrund erledigt.

Beispiel: Angenommen, Sie befinden sich in Python unter Linux, Sie haben Wine installiert und möchten die msvcrt.dll (die Microsoft C-Laufzeitbibliothek) aufrufen. Sie können wie folgt vorgehen:

import zugbruecke as ctypes 
dll_pow = ctypes.cdll.msvcrt.pow 
dll_pow.argtypes = (ctypes.c_double, ctypes.c_double) 
dll_pow.restype = ctypes.c_double 
print('You should expect "1024.0" to show up here: "%.1f".' % dll_pow(2.0, 10.0)) 

Source code (LGPL), PyPI package & documentation.

Es ist immer noch ein bisschen rau an den Rändern (d. H. Alpha und unsicher), aber es behandelt die meisten Arten von Parametern (einschließlich Zeigern).