2010-02-18 5 views
1

J'essaie d'accéder à une instance en cours d'exécution d'une application, Rational Rhapsody, via COM. J'essaie d'utiliser les appels COM C++/CLI.
De C++ appelant:Marshal.GetActiveObject renvoie une erreur de C++/CLI mais pas C#

rhapsody::RPApplication^ App = safe_cast<rhapsody::RPApplication^>(Marshal::GetActiveObject("Rhapsody.Application")); 

provoque une exception COM: 800401E3 (opération non disponible)

Mais, en utilisant Marshal::GetActiveObject("Word.Application") fonctionne très bien. L'utilisation gcnew rhapsody::RPApplication() fonctionne très bien pour faire une nouvelle instance et le même code en C#:

rhapsody.RPApplication App = (rhapsody.RPApplication) Marshal.GetActiveObject("Rhapsody.Application") 

fonctionne très bien. Des idées pour lesquelles cela ne fonctionne pas à partir de C++/CLI?

Répondre

2

Votre routine main() en C++/CLI est-elle marquée [STAThread]? C'est généralement nécessaire, en particulier lorsqu'il s'agit d'objets COM.

[STAThread] 
int main(array<System::String^>^args) 
{ 
    // code here... 
} 
+0

J'ai essayé d'ajouter que, comme un autre post ici l'a corrigé pour la même erreur, mais cela n'a rien changé. – Zanson

+0

Ok, je l'ai encore essayé juste pour m'amuser et pour une raison quelconque cela fonctionne maintenant. Wierd. – Zanson

+0

Yay. J'avais besoin de ceci à faire: [Qt ComApp Exemple] (http://doc.qt.nokia.com/4.7-snapshot/activeqt-comapp.html) avec un wrapper C++/CLI au lieu de VB.NET. – jetimms