Utilisation de COM Exe Server sans Registre dans Win7

J’ai un serveur COM Exe existant et un code VBA ou .NET qui l’appelle. Nous aimerions que cela fonctionne sans avoir besoin d’installer ou de modifier le registre pour que d’autres utilisateurs qui ne sont pas administrateurs sur leurs machines puissent l’utiliser.

Supposons que modifier / modifier le serveur COM Exe n’est pas possible (cher).

Question 1: D’après ce que je sais de l’ enregistrement d’un serveur EXE en cours d’exécution , le serveur EXE peut appeler CoRegisterClassObject pour enregistrer le CLSID dans la table de classes. Cela signifie-t-il que les clients devraient pouvoir co-ordonnerClassObject à partir de là? (même sans entrées de registre pour ce type / classe?)

Question 2: Si ce qui précède est correct, mon serveur EXE utilise CComModule (obsolète, oui) et je vois qu’il appelle en effet CoRegisterClassObject. Y a-t-il un moyen de vérifier la table de classes afin de voir que c’est fait correctement?

Question 3:
Ceci est l’extrait que j’utilise. clsid et iid se réfèrent aux identifiants clsid et iid correspondants. Il échoue avec l’ interface non enregistrée (exception de HRESULT: 0x80040155) dans l’appel à CreateInstance. Cela me rend sortingste, une idée de ce qui pourrait être faux?

var factory = UnsafeNativeMethods.CoGetClassObject( clsid, RegistrationClassContext.LocalServer, IntPtr.Zero, typeof(UnsafeNativeMethods.IClassFactory).GUID) as UnsafeNativeMethods.IClassFactory; factory.CreateInstance(null, ref iid, out obj); 

Question 1: D’après ce que je sais de l’enregistrement d’un serveur EXE en cours d’exécution, le serveur EXE peut appeler CoRegisterClassObject pour enregistrer le CLSID dans la table de classes. Cela signifie-t-il que les clients devraient pouvoir co-ordonnerClassObject à partir de là? (même sans entrées de registre pour ce type / classe?)

Oui. CoRegisterClassObject sera suffisant (sans registre) pour rendre votre object out-of-proc disponible pour tout client qui appelle CoCreateInstance avec CLSCTX_LOCAL_SERVER . Toutefois, vous pouvez rencontrer des problèmes avec les appels de marshaling, car la DLL du proxy / stub COM et / ou la bibliothèque de types ne sont pas enregistrées. Ainsi, une interface bien connue comme IDispatch , IOleCommandTarget etc. sera organisée sans problème, mais toutes les interfaces personnalisées échoueront.

Cependant, il existe d’autres moyens de mettre votre serveur EXE à la disposition des clients. Pour en nommer quelques-uns: RegisterActiveObject , IRunningObjectTable .

Question 2: Si ce qui précède est correct, mon serveur EXE utilise CComModule (obsolète, oui) et je vois qu’il appelle en effet CoRegisterClassObject. Y a-t-il un moyen de vérifier la table de classes afin de voir que c’est fait correctement?

Je ne peux que penser à appeler CoGetClassObject ou CoCreateInstance (un indicateur CLSCTX_LOCAL_SERVER doit être CLSCTX_LOCAL_SERVER ) pour le vérifier.

Question 3: Ceci est l’extrait que j’utilise. clsid et iid se réfèrent aux identifiants clsid et iid correspondants. Il échoue avec l’interface non enregistrée (exception de HRESULT: 0x80040155) dans l’appel à CreateInstance. Cela me rend sortingste, une idée de ce qui pourrait être faux?

C’est bizarre. Le marshaler standard COM renvoie 0x80040155 (REGDB_E_IIDNOTREG) s’il ne peut pas trouver une fabrique de proxy / stub pour une interface, mais IClassFactory ne nécessite pas de proxy personnalisé. Êtes-vous sûr d’avoir un GUID correct dans votre définition C # d’ IClassFactory ? Cela devrait être Guid("00000001-0000-0000-C000-000000000046") .