Frage

Wir möchten einige Hardware unterstützen, die kürzlich eingestellt wurde.Der Treiber für die Hardware ist eine einfache 32-Bit-C-DLL.Wir verfügen nicht über den Quellcode und sind (aus rechtlichen Gründen) nicht daran interessiert, den Treiber zu dekompilieren oder zurückzuentwickeln.

Die Hardware sendet Unmengen an Daten schnell, daher muss das Kommunikationsprotokoll ziemlich effizient sein.

Unsere Software ist eine native 64-Bit-C++-App, wir möchten jedoch über einen 32-Bit-Prozess auf die Hardware zugreifen.Was ist eine effiziente und elegante Möglichkeit für 32-Bit- und 64-Bit-Anwendungen, miteinander zu kommunizieren (was im Idealfall nicht die Erfindung eines neuen Protokolls erfordert)?

Die Lösung sollte in C/C++ sein.

Aktualisieren:Mehrere Befragte baten um Klarstellung, ob es sich um einen Benutzermodus- oder Kernelmodus-Treiber handelte.Glücklicherweise handelt es sich um einen Benutzermodus-Treiber.

War es hilfreich?

Lösung

Wenn dies ein echter Treiber (Kernel-Modus) ist, sind Sie SOL. Vista x64 nicht erlaubt nicht signierte Treiber installieren. Es ist dies nur ein User-Mode-DLL, können Sie ein Update erhalten, indem eine der Standard-IPC-Mechanismen. Rohre, die Stutzen, out-of-proc COM, ungefähr in dieser Reihenfolge. Alles arbeitet auf Bus-Geschwindigkeiten so lange, wie Sie das Kontextwechsel Overhead genügend Daten puffern kann, sollte nicht zu viel schaden.

Andere Tipps

Ich möchte nur Sockets verwenden. Es würde dir erlaubt es over IP zu verwenden, wenn Sie es in der Zukunft brauchen, und Sie werden nicht bis zu einem Messaging-API gebunden werden. Wenn in der Zukunft wünschen Sie diese auf einem anderen Betriebssystem oder die Sprache zu implementieren, können Sie.

dieser Artikel von Interesse sein könnte. Es behandelt das Problem und schlägt dann COM als Lösung verwendet wird. Ich bin kein großer Fan von COM aber seine Allgegenwart in dem Windows-Universum gegeben, es ist möglich, dass es effizient genug sein könnte. Sie werden wahrscheinlich Ihre Lösung Architekten wollen, so dass Sie Chargendaten können (Sie wollen nicht für jedes Element von Daten einen COM-Aufruf zu tun).

Elegant? C ++? DCOM / RPC-Aufrufe an sich selbst arbeiten könnte, oder Sie können eine Named Pipe erstellen und verwenden, um zwischen den beiden Prozessen (vielleicht schaffen eine „CMessage Klasse“ oder so), obwohl achten Sie auf andere Struktur Ausrichtung zwischen x86 und x64 zu sprechen.

Wenn der Fahrer tut dich als ein echter Fahrer zu sein, ist nobugz fast richtig - Sie werden viel härter arbeiten müssen, sind Sie nicht vollständig SOL. Eine Lösung ist Win32 auf einer anderen Maschine (oder virtuelle Maschine) zu installieren und verwenden Sie dann eine Form von RPC, wie Steckdosen (wie durch Pyrolistical vorgeschlagen) oder UDP oder MQ oder sogar Tibco Rendezvous (die einen sehr hohen Durchsatz zu unterstützen, um behauptet die Datenmengen von den Finanzmärkten erzeugt zu behandeln -. zumindest das ist, was ich von hinten in den alten Tagen erinnern)

Eine speicherzugeordnete Datei, die von beiden Seiten gemeinsam genutzt wird, hätte denselben Inhalt.Das Betriebssystem muss einige interessante Zeigerfunktionen ausführen, um dies zu ermöglichen, wird aber höchstwahrscheinlich in der Lage sein, die beiden Ansichten so einzurichten, dass Sie den Speicher nicht physisch kopieren.Null Kopien sind so gut wie nie zuvor

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top