Domanda

Vorremmo sostenere alcuni componenti hardware che è stato recentemente interrotto. Il driver per l'hardware è una semplice DLL 32 bit C. Non abbiamo il codice sorgente, e (per motivi legali) non siamo interessati a decompilazione o reverse engineering del driver.

L'hardware invia tonnellate di dati in modo rapido, in modo che il protocollo di comunicazione ha bisogno di essere abbastanza efficiente.

Il nostro software è un C applicazione nativa a 64-bit ++, ma vorremmo accedere all'hardware tramite un processo a 32 bit. Che cosa è un modo elegante efficiente per applicazioni a 32-bit e 64-bit per comunicare con l'altro (che, idealmente, non implica inventare un nuovo protocollo)?

La soluzione deve essere in C / C ++.

Aggiornamento: diversi intervistati hanno chiesto chiarimenti se questa era una modalità utente o driver in modalità kernel. Per fortuna, è un driver in modalità utente.

È stato utile?

Soluzione

Se questo è un vero e proprio driver (modalità kernel), sei SOL. Vista x64 non consente l'installazione di driver non firmati. E questa è solo una DLL in modalità utente, è possibile ottenere una correzione utilizzando uno qualsiasi dei meccanismi di IPC standard. Bocchetta, out-of-process COM, più o meno in questo ordine. Tutto funziona con velocità del bus in modo fino a quando si può tamponare dati sufficienti, l'overhead context switch non dovrebbe troppo male.

Altri suggerimenti

Vorrei solo utilizzare i socket. Essa permetterebbe di utilizzarlo su IP in caso di necessità, in futuro, e non sarà legato ad un'API di messaggistica. Se in futuro si desidera implementare questo su un altro sistema operativo o linguaggio, è possibile.

Questo articolo potrebbe essere di interesse. Discute il problema e poi suggerisce di utilizzare COM come soluzione. Io non sono un grande fan di COM ma data la sua ubiquità nell'universo di Windows, è possibile che potrebbe essere abbastanza efficace. Probabilmente si desidera all'architetto la soluzione in modo da poter dati batch (non si vuole fare una chiamata COM per ogni elemento dei dati).

Elegante? C ++? DCOM / chiamate RPC a te stesso potrebbe funzionare oppure si potrebbe creare una named pipe e l'uso che per parlare tra i due processi (forse creare una "classe CMessage" o qualcosa del genere), ma guardare fuori per l'allineamento struttura diversa tra x86 e x64.

Se il conducente non rivelarsi un vero e proprio driver, nobugz è quasi giusto - si sta andando ad avere per lavorare molto più difficile, non siete completamente SOL. Una soluzione è quella di installare Win32 su qualche altra macchina (o macchina virtuale) e quindi utilizzare una qualche forma di RPC, come prese (come suggerito dal Pyrolistical) o UDP o MQ o anche Tibco Rendezvous (che afferma di sostenere molto elevata produttività in ordine per gestire i volumi di dati generati dai mercati finanziari -. almeno questo è quello che mi ricordo da indietro ai vecchi tempi)

Un file mappato in memoria, condivisa da entrambe le parti avrebbe lo stesso contenuto. Il sistema operativo dovrà fare alcune cose interessanti puntatore per farlo accadere, ma molto probabilmente sarà in grado di impostare i 2 viste in modo tale che non si sta copiando fisicamente la memoria intorno. Zero copie è quanto di meglio si possa

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top