2013-06-04 3 views
1

J'ai un module A dans C++ managé, cela dépend du module B en C++ natif qui a été encapsulé COM plus. Dans le module B, je lis les octets d'un fichier. Maintenant, j'essaie d'appeler la fonctionnalité de lecture de fichier de A. Mais échoué. Détail des dépendances: J'ai utilisé tlbimp.exe et généré l'interop selon le module B. Un referrs à l'interop.Comment recevoir des octets dans un projet C++ géré à partir du projet COM plus

J'ai essayé de passer un "tableau ^" mais un seul caractère a été reçu, ce qui est compréhensible car le marshaling ne connaît pas la longueur du tableau et ne peut pas gérer tout le tableau.

J'ai recherché quelques recommandations sur la matrice sécurisée, mais je n'ai pas pu l'utiliser avec succès dans mes projets. Quelqu'un pourrait m'aider à ce sujet?

Merci beaucoup.

+0

Vous pouvez utiliser IStream au lieu de passer des octets. –

+0

Donc je dois implémenter IStream dans le module B et l'exporter vers A? Et créer un objet stream dans le module A avec le type exporté de B? – Cesc

+0

Quelque chose comme ça. Vous pouvez même réutiliser le .NET IStream existant construit spécialement pour l'interopérabilité native (http://msdn.microsoft.com/fr-fr/library/system.runtime.interopservices.comtypes.istream.aspx) –

Répondre

0

Si vous allez parler à votre objet natif via COM, vous allez devoir passer le tableau de la façon COM.

SAFEARRAY fonctionnerait certainement, mais vous n'avez pas besoin de l'utiliser. C'est une bonne quantité de travail à mettre en place de toute façon. Si aucun composant n'est un langage de script ou VB6, il est peu utile d'utiliser un SAFEARAY.

COM peut marshal le tableau tout à fait bien, vous devez juste dire combien il est grand. Les deux mécanismes les plus courants dans COM pour passer des tableaux (natifs) sont des "tableaux de taille fixe" et des "tableaux conformes".

Si vous connaissez au moment de la compilation de la taille du tableau, c'est le chemin à parcourir. Déclarez votre méthode COM comme suit dans votre IDL:

... 
const long ARRAY_SIZE = 1024; 
... 
HRESULTS MethodAbc(MyClass array[ARRAY_SIZE]); 

Marshalling prendra soin de passer tout le tableau.

Vous les déclarez comme suit IDL:

HRESULT MethodAbc([size_is(arraySize)] MyClass array[], long arraySize); 

Ceci indique que le paramètre COM arraySize détient le nombre d'éléments.

Mon expérience avec CLI est minime, mais je ne pense pas que vous pouvez simplement passer un handle CLI. Entre autres choses, je crois que vous devez épingler le pointeur de sorte que GC ne déplace pas le tableau pendant l'appel COM. D'autres s'il vous plaît me corriger ici si je me trompe.

+0

Merci pour vos suggestions! J'ai choisi "Conformant Arrays" pour mes tableaux, mais: 1.Votre suggestion fonctionne si A et B s'exécutent dans le même processus; 2. Cela ne fonctionne pas si A et B s'exécutent dans un processus différent; Malheureusement, mon module B est en standard COM + et fonctionne dans un processus différent avec le module A. Que dois-je faire de plus maintenant pour utiliser la fonction "Conformant Arrays"? Ou je dois choisir une nouvelle façon de traiter le cas hors-processus? – Cesc

+0

@ user2451353, de quel type/classe est le tableau? Utilisez-vous le marshaling personnalisé? –

+0

C'est array ^, pas de marshaling personnalisé. – Cesc

Questions connexes