2008-11-12 12 views
9

Ho bisogno di scrivere il codice che viene eseguito quando viene chiamato DllRegisterServer. vale a dire quando qualcuno chiama:Win32: voci di registro necessarie per registrare un controllo ActiveX?

regsvr32 myActiveX.ocx 

sto cercando di trovare l'elenco definitivo delle voci di registro richieste (e non solo quello che posso mettere insieme dal spellunking attraverso il Registro di sistema).

Finora le mie spedizioni hanno trovato:

HKEY_CLASSES_ROOT 
    \MyCoolLibrary.MyCoolControl 
     \Clsid 
     (default) = "{myClassId}" 
    \CLSID 
     \{myClassId} 
     \Control 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 
     \MiscStatus 
      \1 
       (default) = 205201 
     \ProgID 
      (default) = "MyCoolLibrary.MyCoolControl" 
     \ToolboxBitmap32 
      (default) = "c:\foo\myActiveX.ocx,1" 
     \TypeLib 
      (default) = "{myTypeLibraryGuid}" 
     \Verb 
      \0 
       (default) = "Properties,0,2" 
     \Version 
      (default) = "1.0" 
    \TypeLib 
     \{myTypeLibraryGuid} 
     \1.0 
      (default) = "MyCoolLibrary.MyCoolControl" 

Ora, le preoccupazioni: - che cosa fa la cartella di controllo contengono? La sua presenza indica un controllo? - che cosa fa un MiscStatus di 205201? Cosa farebbe invece 205202? - Qual è il verbo "Proprietà, 0,2"? Dov'è "Proprietà, 0,0" e "Proprietà, 0,1"?

In altre parole, sto cercando i documenti.

+1

Sono uno sviluppatore COM, un novizio uno. Ho la stessa domanda. Mi piacerebbe condividere [questo] (http://ewall.org/index.php?module=ContentExpress&func=print&ceid=22) con voi. – smwikipedia

+0

La maggior parte dei framework non ne automatizza la generazione per te? – Deanna

risposta

5

Larry Osterman fornisce un buon punto di partenza:

Una gran parte del "cargo cult" natura di questo è il fatto che ci sono un insieme sconcertante di registro di sistema impostazioni che possono essere impostato per gli oggetti COM e non è chiaro quale, se applicabile, si applica . Quindi sto tentando di deporre una serie di articoli che possono aiutare le persone di a determinare ciò di cui hanno bisogno per impostare .

- What registry entries are needed to register a COM object.

Sommario: dipende da cosa scenari è necessario l'oggetto da utilizzare in Le impostazioni, assolutamente necessarie, di base sono il valore di default e ThreadingModel in HKEY_CLASSES_ROOT\CLSID\<clsid>\, ma la maggior parte del. tempo vorrai ProgIDs e AppIDs pure.

3

Non è esaustivo, ma prova l'articolo della Knowledge Base this.

Inoltre, Larry Osterman ha un utile post sul blog here.


Mi viene da pensare che un altro approccio sarebbe quello di utilizzare uno strumento come RegMon e direttamente monitorare ciò che i cambiamenti di registro sono fatti quando il metodo DllRegisterServer viene chiamato.

0

Con tutti i mezzi, andare con l'articolo di Larry Osterman collegato.

Inoltre, un buon punto di partenza sono gli script di registrazione ATL generati dalla procedura guidata dell'oggetto COM ATL MSVC. Puoi giocare con diverse opzioni e vedere come influiscono sull'output.

5

Trova/prendi/ruba una copia di Inside OLE 2, di Kraig Brockenschmidt. È vecchio come il mondo (e risale anche a me :-))

Ecco anche a high-level overview delle voci di registro sopra menzionate.

Leggi Larry Osterman's blog post per altri puntatori.

Guarda i campioni MSDN ActiveX.

Inoltre, mancano voci sotto HKCR \ Interfaces per tutte le interfacce personalizzate e le interfacce evento implementate dal controllo.

0

Nota a margine se si desidera vedere sperimentalmente quali chiavi vengono create: utilizzare Sysinternals 'Process Monitor, acquisirà in tempo reale l'attività sul registro quando si registra il controllo.

9

Quello che so finora. COM crea un oggetto basato su di esso è clsid. Questo è un guid che identifica in modo univoco quella classe.

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 

Questa classe viene quindi utilizzata per creare oggetti. La COM ora ha bisogno di sapere dov'è la DLL che contiene quell'oggetto COM. Nel mio caso particolare, il "server" che espone l'oggetto COM è una DLL e sarà "in elaborazione". Abbiamo poi segnala COM a quella dll "in-process", aggiungendo:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 

COM ha anche bisogno di conoscere il modello di threading che l'oggetto server COM supporta. Il più semplice, più comune, e quello utilizzato in questo esempio è il "appartamento" modello di threading:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 

prossima è il ProgID. Questo è simile al modo in cui il DNS viene utilizzato per trasformare un nome descrittivo in un IP. Qui ci rivolgiamo un nome "MyCoolLibrary.MyCoolControl" nella brutta clsid "{AE8530CF-D204-4877-9CAB-F052BF1F661F}"

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 
HKEY_CLASSES_ROOT 
    \MyCoolLibrary.MyCoolControl 
     \Clsid 
      (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}" 

Ora qualcuno può chiedere

MyCoolLibrary.MyCoolControl 

e COM può trasformare che in ClassID

{AE8530CF-D204-4877-9CAB-F052BF1F661F} 

volta COM ha la clasid, può quindi cercare nel registro sotto HKCR\Clsid\{AE8530CF-D204-4877-9CAB-F052BF1F661F} per trovare le informazioni reali.

Per il divertimento, il ProgID è aggiunto alla sezione Clsid, solo così la gente può avere qualche idea di cosa questa classe è:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 
     \ProgID 
      (default) = "MyCoolLibrary.MyCoolControl" 
HKEY_CLASSES_ROOT 
    \MyCoolLibrary.MyCoolControl 
     \Clsid 
      (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}" 

successivo è la libreria dei tipi. Questo è principalmente un importante per qualsiasi processo in corso, ma se l'oggetto COM si trova in un altro "appartamento", è necessario eseguire il marshalling dei parametri di funzione. COM lo fa automaticamente per te se ha una libreria dei tipi che definisce tutti i metodi delle classi.

La sezione CLSID è puntato alla libreria dei tipi appropriata con l'aggiunta di una chiave TypeLib:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 
     \ProgID 
      (default) = "MyCoolLibrary.MyCoolControl" 
     \TypeLib    
      (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}" 
HKEY_CLASSES_ROOT 
    \MyCoolLibrary.MyCoolControl 
     \Clsid 
      (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}" 

Le informazioni su questa libreria dei tipi viene memorizzato anche nel Registro di sistema, ma l'aggiunta di questi tasti è fatto per noi con una chiamata a RegisterTypeLib. Ma sarà aggiungere le chiavi per noi simile a:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \InprocServer32 
      (default) = "c:\foo\myActiveX.ocx" 
      ThreadingModel = "Apartment" 
     \ProgID 
      (default) = "MyCoolLibrary.MyCoolControl" 
     \TypeLib    
      (default) = "{17A5A3D4-439C-4C2A-8AB4-749B7771CDE1}" 
HKEY_CLASSES_ROOT 
    \MyCoolLibrary.MyCoolControl 
     \Clsid 
      (default) = "{AE8530CF-D204-4877-9CAB-F052BF1F661F}" 
HKEY_CLASSES_ROOT 
    \TypeLib 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
      \1.0 
       (default) = "My Cool ActiveX Library" 
      ... 

Ora entriamo la roba difficile, roba che è necessario per spera fa un lavoro di controllo ActiveX.

An MSDN article states che è necessario aggiungere un manichino programmabile chiave per indicare che si tratta di un controllo ActiveX:

HKEY_CLASSES_ROOT 
    \Clsid 
     \{AE8530CF-D204-4877-9CAB-F052BF1F661F} 
     \Programmable 

Ma this MSDN Library page dice la parola chiave è controllo, e non programmabile - e non v'è nessuna chiave programmabile.

Ma ciò non impedisce ad alcuni ActiveX di utilizzare Control, alcuni di quelli programmabili e altri di entrambi.

Non riesco a trovare nulla che menzioni qualsiasi altra cosa sia richiesta.

Quindi, qualcuno può trovare qualche documentazione definitiva?

+1

'Programmable' sembra essere la chiave giusta - Non ho potuto caricare un componente in MSOffice con' Control' e senza 'Programmable'. Inoltre, suggerirei di aggiungere un numero di versione al 'ProgID' (' MyCoolLibrary.MyCoolControl.1') e di mantenere un 'VersionIndependentProgID' senza il numero di versione aggiunto. – alecov

-1

Stai lavorando su un sistema operativo a 64 bit?

Se è così, invece di scrivere a
HKEY_CLASSES_ROOT \ CLSID \
si dovrebbe scrivere a
HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \