2009-04-02 8 views
2

Nous avons plusieurs grandes applications MFC qui appellent actuellement un objet COM pour faire apparaître un dialogue complexe. Nous aimerions intégrer le dialogue dans les applications - nous ne voulons pas continuer à utiliser un objet COM. J'étudie la possibilité de construire le dialogue dans .NET en tant que projet séparé (en utilisant Windows Forms, pas WPF) et en fournissant un second projet C++/CLI qui l'appelle et qui peut être appelé à partir du code C++ ordinaire. Cette structure est telle que les différentes applications qui doivent intégrer le dialogue peuvent simplement prendre en charge les projets dans leurs solutions. (Les applications sont des applications héritées, et les réécrire de manière intensive n'est pas possible - nous les déplaçons lentement vers .NET, mais il s'agit d'un projet pluriannuel.Convertir les applications en C++/CLI n'est pas une option.)Comment puis-je appeler un formulaire .NET à partir d'une application MFC?

Je l'ai construit et testé à partir d'une application modèle, mais jusqu'à présent, je suis incapable de le faire fonctionner dans la plus simple des grandes applications, et en fonction de certaines choses que j'ai lues, je commence à doute que c'est possible. (Voir this link, particulièrement.Je suis au courant de this Stackoverflow question, mais il ne semble pas être pertinent.)

Donc. Est-ce seulement possible? Des suggestions sur la façon de procéder?

Répondre

0

J'ai finalement résolu ce problème avec l'aide d'un très bon spécialiste du support Microsoft. Il y avait deux problèmes, l'un était que le threading de la bibliothèque Boost est incompatible avec C++/CLI dans son état par défaut. Une solution consiste à compiler avec un ensemble différent de drapeaux, puis à le lier statiquement. L'autre est de l'utiliser comme une DLL liée dynamiquement, ce que j'ai fini par faire.

La deuxième partie de la solution consiste à définir l'enfilage CLR dans la propriété de liaison sur STA, car les initialisations OLE échouent avec un message non utile si vous ne le faites pas.

1

Avez-vous réussi à faire appel au projet C++/CLI dans votre composant .NET? J'essaierais d'affiner entre les deux couches qu'elle n'arrive pas à franchir.

Comme le code C++ peut appeler des composants COM, vous pouvez simplement compiler la DLL .NET avec le support COM. Je n'ai pas fait COM en C++ bien que moi-même, donc je ne peux pas vous dire les détails. Mais j'ai fait beaucoup de COM .NET DLL exposées et ce côté est assez facile. Normalement, quelques cases à cocher dans les propriétés du projet (je pense sous un bouton avancé dans l'onglet Assemblée).

+0

Nous avons déjà un composant COM basé sur C++. Le but de ce projet est d'éliminer le besoin de COM. – mlo

+0

Je reçois des échecs dans l'initialisation OLE avant que l'exécution n'atteigne le code en question. Googling cette erreur m'a conduit au premier lien. – mlo

0

Pourquoi avez-vous besoin de l'intermédiaire? Pourquoi ne pas simplement

Native C++ app --> C++/CLI class library 

La bibliothèque C++/CLI fournit un wrapper natif autour d'un CWinFormsView ou CWinFormsDialog.

Mais, pourquoi devez-vous éliminer COM? C'est beaucoup rapide et une fois que vous êtes bon à la mise en œuvre des interfaces, la cérémonie n'est pas trop mauvaise.

+0

Il y a beaucoup de code C++ dans l'objet COM existant que je préférerais ne pas porter sur .NET. La structure que j'utilise a deux boîtes de dialogue compliquées en tant que projets C# distincts appelés à partir de la majeure partie du code qui est l'ancien code C++.Cela s'appelle de l'application principale tout comme maintenant. – mlo

+0

OK alors je suis confus quant à la question. Avez-vous ce travail ou pas? –

Questions connexes