2012-06-18 8 views
9

È possibile utilizzare l'oggetto COM dalla DLL senza registrarsi nel codice C++ non gestito?Utilizzare l'oggetto COM dalla DLL senza registro

+0

@NahumLitvin, puoi dire quale libreria ti interessa in particolare? – acelent

+0

Purtroppo non posso. l'informazione non è mia da dare. Ho una risposta. e un esempio funzionante con registrazione. ma non posso usare la registrazione. – Nahum

+0

Perché non hai fatto una nuova domanda? Perché non puoi usare la registrazione senza COM (vedi una delle risposte)? Hai provato il metodo spiegato nell'altra risposta? Se non ha funzionato, in quale fase hai ricevuto un errore? In realtà, questo non riserva una taglia su una domanda già risposta, questa dovrebbe essere la sua domanda. È necessario fornire molti più dettagli se si vuole veramente aiuto, invece di lanciare semplicemente dei punti reputazione. – acelent

risposta

8

Sì, se non si basa internamente su altri oggetti registrati.

  1. È LoadLibrary la DLL
  2. È GetProcAddress sua DllGetClassObject
  3. Si chiama DllGetClassObject di ottenere IClassFactory puntatore per CLSID di interesse
  4. Tu sei buono per andare con IClassFactory::CreateInstance e istanziare coclasse
+4

2 ½. Assicurati di essere nell'appartamento corretto prima di chiamare 'DllGetClassObject'. Anche così, non sarà possibile eseguire il marshalling per le interfacce del modello di oggetto specifico. Anche se gli oggetti COM C++ implementano 'IMarshal' o' IProvideClassInfo', sarà necessario fare lo stesso se si è quello che fornisce gli oggetti che implementano una di queste interfacce (ad esempio dispstfaces di eventi). Per questi motivi e molti altri, questa è una cattiva pratica. Dovresti invece usare COM free registration. – acelent

2

Dire, la DLL COM deve essere registrata, ma l'applicazione non ha diritti di accesso amministratore. Ecco un trucco facile da registrare la DLL in HKEY_CURRENT_USER, che non richiede diritti di amministratore:

  1. Usa LoadLibrary per caricare la DLL COM.
  2. Chiama il numero GetGetProcAddress per ottenere l'indirizzo di DllRegisterServer.
  3. Chiama il numero RegOverridePredefKey per reindirizzare il registro temporaneo: HKEY_LOCAL_MACHINE a HKEY_CURRENT_USER e HKEY_CLASSES_ROOT a HKEY_CURRENT_USER\Software\Classes.
  4. Chiamare DllRegisterServer ottenuto al passaggio 2.
  5. Invertire i reindirizzamenti del Registro di sistema.
  6. Utilizzare il server COM come al solito, ora è registrato con HKEY_CURRENT_USER.
+1

"facile" mod. Però intelligente. – Dmitry

Problemi correlati