2012-06-18 16 views
9

¿Es posible usar el objeto COM desde DLL sin registro en C++ código no administrado?Usar el objeto COM desde DLL sin registro

+0

@NahumLitvin, ¿puedes decir en qué biblioteca estás interesado específicamente? – acelent

+0

Desafortunadamente no puedo. la información no es mía para dar. Tengo un com dll. y un ejemplo de trabajo con registro. pero no puedo usar el registro. – Nahum

+0

¿Por qué no hiciste una nueva pregunta? ¿Por qué no puedes usar COM libre de registro (ver una de las respuestas)? ¿Has probado el método explicado en la otra respuesta? Si no funcionó, ¿en qué paso obtuviste un error? Realmente, esto no reserva una recompensa en una pregunta ya respondida, esta debería ser su propia pregunta. Debe proporcionar muchos más detalles si realmente desea ayuda, en lugar de solo arrojar puntos de reputación. – acelent

Respuesta

8

Sí, si no se basa internamente en otros objetos registrados.

  1. Usted LoadLibrary la DLL
  2. Usted GetProcAddress su DllGetClassObject
  3. Usted llama DllGetClassObject obtener IClassFactory puntero para CLSID de interés
  4. Eres bueno para ir con IClassFactory::CreateInstance y una instancia del coclase
+4

2 ½. Asegúrate de estar en el apartamento correcto antes de llamar a 'DllGetClassObject'. Aun así, no obtendrá referencias para las interfaces de modelos de objetos específicos. Incluso si los objetos COM C++ implementan 'IMarshal' o' IProvideClassInfo' ellos mismos, tendrá que hacer lo mismo si usted es el que proporciona objetos que implementan cualquiera de esas interfaces (por ejemplo, interfaces de eventos). Por estas y muchas otras razones, esta es una mala práctica. En su lugar, debe usar COM libre de registro. – acelent

2

Digamos que la DLL COM debe registrarse, pero la aplicación no tiene derechos de acceso de administrador. He aquí un truco fácil de registrar la DLL bajo HKEY_CURRENT_USER, que no requiere derechos de administrador:

  1. Uso LoadLibrary para cargar la DLL COM.
  2. Llame al GetGetProcAddress para obtener la dirección de DllRegisterServer.
  3. Llame al RegOverridePredefKey para realizar las redirecciones de registro temporales: HKEY_LOCAL_MACHINE a HKEY_CURRENT_USER y HKEY_CLASSES_ROOT a HKEY_CURRENT_USER\Software\Classes.
  4. Llamada DllRegisterServer obtenida en el paso 2.
  5. Invierta los redireccionamientos de registro.
  6. Utilice el servidor COM como de costumbre, ahora está registrado en HKEY_CURRENT_USER.
+1

"fácil" hackear. Inteligente sin embargo. – Dmitry

Cuestiones relacionadas