2009-04-22 6 views
1

J'ai une application de console C++ à laquelle je souhaite utiliser un Windows Form. Je ne veux pas utiliser MFC parce que je ne sais pas comment. Au lieu de cela, j'utilise un C# pour créer la DLL COM (Class Library). Lorsque je distribue l'application et la DLL à l'ordinateur cible, je dois enregistrer la DLL de sorte que l'application puisse voir l'interface COM et utiliser la classe que j'ai créée dans la DLL.Comment enregistrer un assembly COM en mode silencieux sur un ordinateur WinXP

Je sais qu'il ya quelques méthodes pour ce faire:

  1. vérifiions installateur de regasm de ma demande - Je ne veux pas utiliser cela à cause de deux choses: R. Je ne sais pas son emplacement sur le PC cible (et même s'il existe quelque part, je ne veux pas coder le chemin) et B. Je pourrais redistribuer le regasm avec l'installateur mais je ne suis pas sûr que Microsoft le permette librement.

  2. Demandez à l'installateur de mon application d'utiliser gacutil - comme ci-dessus.

  3. Utilisez regasm sur l'ordinateur de développement pour créer un fichier .reg et demandez au programme d'installation de l'application d'exécuter le fichier .reg. Il y a deux problèmes: A. Je ne peux pas désenregistrer la DLL en cas de désinstallation B. exécuter .reg appelle le regedit qui demande à l'utilisateur s'il/elle est sûr (e) s'il veut ajouter l'information au registre - je voudrais que ce soit un "oui" silencieux et ne laisse pas l'utilisateur décider. regedit n'a pas/argument silencieux donc j'ai abandonné l'utilisation de cela.

  4. Utilisez le programme d'installation Inno Setup et enregistrez le fichier .tlb (drapeau regtypelib) de la bibliothèque COM - essayé et l'enregistrement fonctionne mais l'application ne peut toujours pas créer une instance de la classe. Utilisez ClickOnce pour déployer l'application - ce n'est pas une option car je souhaite que mon application réside dans un dossier spécifique sur le disque, et non dans le dossier Documents and Settings de l'utilisateur.

Je dois mentionner que j'utilise des éditions Express pour C++ et C# Visual Studio 9.0. Existe-t-il d'autres moyens d'enregistrer une bibliothèque COM sur un ordinateur Windows XP?

Edition - Mise à jour:

J'ai essayé le COM sans enregistrement me guider à partir de l'exemple d'ici http://msdn.microsoft.com/en-us/library/ms973915.aspx. Laissant de côté les problèmes que j'avais avec le manifeste, j'ai finalement obtenu l'application pour "voir" le COM dll (sans inscription). Manifestes travaillent maintenant. Malheureusement, l'appel à CoCreateInstance() renvoie maintenant E_OUTOFMEMORY (0x8007000E). Pour être mentionné que la DLL COM a deux classes mais seulement pour un je crée une interface COM-visible (l'autre est la classe pour le formulaire et je veux qu'il soit privé). Cela pourrait-il être le problème? Voici un code:

#import "MyGUI_DLL.tlb" raw_interfaces_only named_guids 
[…] 
static MyGUI_DLL::MyGUI * g = NULL; 
r = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
// r is S_OK here 
r = CoCreateInstance(MyGUI_DLL::CLSID_MyGUIClass, NULL, CLSCTX_INPROC_SERVER, MyGUI_DLL::IID_MyGUI, reinterpret_cast<void**>(&g)); 
// r returns E_OUTOFMEMORY 

Merci pour l'aide.

+0

Vous pouvez utiliser GetCORSystemDirectory() pour détecter le chemin d'installation de .NET lors de l'exécution. regasm et gacutil ont toujours le même emplacement relatif à l'installation .NET. – sharptooth

+0

Voir cette réponse pour un exemple de code http://stackoverflow.com/questions/741632/is-there-a-tool-out-there-to-find-out-which-net-framework-is-installed-on- a-pc/741732 # 741732 – sharptooth

Répondre

0

Vous devez utiliser com sans enregistrement à la place. Cela évitera tous les problèmes que vous mentionnez, mais aussi, si vous l'utilisez exclusivement, empêchera votre programme de fonctionner sur des machines pré-winxp ... ce qui ne devrait pas avoir d'importance dans votre cas.

0

Dans vos scénarios où vous gérez l'assembly interop, vous négligez le fait que vous devez toujours installer correctement le composant COM.

Si vous souhaitez effectuer cette opération via le code, vous devez appeler la fonction API LoadTypeLib via la couche P/Invoke.

Cependant, je pense que la meilleure solution serait la COM sans enregistrement. Il y a un bon article sur le sujet ici:

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

Questions connexes