Question

Nous aimerions soutenir un peu de matériel qui a été récemment abandonnée. Le pilote pour le matériel est un 32 bits DLL C ordinaire. Nous n'avons pas le code source, et (pour des raisons juridiques) ne sont pas intéressés par la décompilation ou l'ingénierie inverse du pilote.

Le matériel envoie des tonnes de données rapidement, de sorte que le protocole de communication doit être assez efficace.

Notre logiciel est une application 64 bits natif C ++, mais nous aimerions accéder au matériel via un processus 32 bits. Ce qui est un moyen efficace et élégant pour les applications 32 bits et 64 bits pour communiquer entre eux (qui, idéalement, ne comporte pas d'inventer un nouveau protocole)?

La solution doit être en C / C ++.

Mise à jour: plusieurs répondants ont demandé des éclaircissements si cela était un mode utilisateur ou pilote en mode noyau. Heureusement, il est un pilote en mode utilisateur.

Était-ce utile?

La solution

Si cela est un vrai pilote (mode noyau), vous êtes SOL. Vista x64 ne permet pas d'installer des pilotes non signés. Il est ce juste une DLL en mode utilisateur, vous pouvez obtenir une solution en utilisant l'un des standards mécanismes IPC. Pipes, prises, out-of-proc COM, à peu près dans cet ordre. Tout fonctionne sur les vitesses de bus afin que vous pouvez tampon suffisamment de données, les frais généraux de changement de contexte ne devrait pas trop mal.

Autres conseils

Je voudrais simplement utiliser des prises. Il vous permettra de l'utiliser sur IP si vous avez besoin à l'avenir, et vous ne serez pas être lié à une API de messagerie. Si à l'avenir que vous souhaitez mettre en œuvre ce sur un autre système d'exploitation ou de la langue, vous pouvez.

Cet article pourrait intéresser. Il aborde le problème et propose ensuite à l'aide COM comme une solution. Je ne suis pas un grand fan de COM mais étant donné son ubiquité dans l'univers Windows, il est possible que ce pourrait être assez efficace. Vous voudrez probablement architecte votre solution afin que vous puissiez les données par lots (vous ne voulez pas faire un appel COM pour chaque élément de données).

élégant? C ++? DCOM / RPC appelle à vous pourrait travailler, ou vous pouvez créer un tube nommé et l'utiliser pour parler entre les deux processus (peut-être créer une « classe CMessage » ou quelque chose), mais attention à différents alignement de la structure entre x86 et x64.

Si le conducteur ne se révéler un vrai pilote, nobugz est presque droite - vous allez devoir travailler beaucoup plus dur, vous n'êtes pas complètement SOL. Une solution consiste à installer Win32 sur une autre machine (ou machine virtuelle) et en utilisant ensuite une certaine forme de RPC, tels que prises de courant (comme suggéré par Pyrolistical) ou UDP ou MQ ou même Tibco Rendezvous (qui prétend soutenir un débit très élevé dans l'ordre pour gérer les volumes de données générés par les marchés financiers -. au moins ce que je me souviens de l'arrière dans les vieux jours)

Un fichier mappé en mémoire, partagée par les deux parties aurait le même contenu. Le système d'exploitation devra faire des trucs de pointeur intéressant pour y arriver, mais tout sera probablement en mesure de configurer les 2 vues de telle sorte que vous copiez pas physiquement la mémoire autour. Zéro copie est à peu près aussi bon qu'il obtient

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top