107 lines
3.8 KiB
C++
107 lines
3.8 KiB
C++
|
/******************************************************************************
|
||
|
* Temp conversion utility to take registry entries and populate the class store with those entries.
|
||
|
*****************************************************************************/
|
||
|
|
||
|
/******************************************************************************
|
||
|
includes
|
||
|
******************************************************************************/
|
||
|
#include "precomp.hxx"
|
||
|
|
||
|
/******************************************************************************
|
||
|
defines and prototypes
|
||
|
******************************************************************************/
|
||
|
|
||
|
extern CLSID CLSID_ClassStore;
|
||
|
extern const IID IID_IClassStore;
|
||
|
extern const IID IID_IClassAdmin;
|
||
|
|
||
|
LONG
|
||
|
UpdateDatabaseFromIID(
|
||
|
MESSAGE * pMessage )
|
||
|
{
|
||
|
BasicRegistry * pHKCR = new BasicRegistry( pMessage->hRoot ); // HKCR
|
||
|
BasicRegistry * pInterfaceRoot;
|
||
|
IIDICT * pIIDict = pMessage->pIIDict;
|
||
|
BOOL fFinish = 0;
|
||
|
int Index;
|
||
|
LONG Error;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get the first IID key under HKCR
|
||
|
//
|
||
|
|
||
|
Error = pHKCR->Find( "Interface", &pInterfaceRoot );
|
||
|
|
||
|
if( Error == ERROR_NO_MORE_ITEMS )
|
||
|
return ERROR_SUCCESS;
|
||
|
|
||
|
//
|
||
|
// Go thru all the subkeys under Interface and get the details under the keys.
|
||
|
//
|
||
|
|
||
|
pInterfaceRoot->InitForEnumeration( 0 );
|
||
|
|
||
|
for( Index = 0;
|
||
|
fFinish != 1;
|
||
|
++Index )
|
||
|
{
|
||
|
BasicRegistry * pKey;
|
||
|
char InterfaceKeyBuffer[ 256 ];
|
||
|
DWORD SizeOfInterfaceKeyBuffer = 256;
|
||
|
|
||
|
|
||
|
Error = pInterfaceRoot->NextKey(
|
||
|
&InterfaceKeyBuffer[0],
|
||
|
&SizeOfInterfaceKeyBuffer,
|
||
|
&pKey,
|
||
|
pMessage->ftLow,
|
||
|
pMessage->ftHigh );
|
||
|
|
||
|
if( Error != ERROR_NO_MORE_ITEMS )
|
||
|
{
|
||
|
BasicRegistry * pProxyClsidKey;
|
||
|
|
||
|
// get the proxystubclsid key under this.
|
||
|
|
||
|
Error = pKey->Find("ProxyStubclsid32", &pProxyClsidKey );
|
||
|
|
||
|
if( Error != ERROR_NO_MORE_ITEMS )
|
||
|
{
|
||
|
char PSBuffer[ 256 ];
|
||
|
DWORD SizeofPSBuffer = 256;
|
||
|
|
||
|
// Get the unnamed value. That is the clsid value.i
|
||
|
// Enter that into the iidict.
|
||
|
|
||
|
Error = pProxyClsidKey->QueryValue(
|
||
|
"",
|
||
|
&PSBuffer[0],
|
||
|
&SizeofPSBuffer );
|
||
|
|
||
|
if( Error != ERROR_NO_MORE_ITEMS )
|
||
|
{
|
||
|
ITF_ENTRY * pITFEntry = pMessage->pIIDict->Search(
|
||
|
&InterfaceKeyBuffer[0] );
|
||
|
|
||
|
if( !pITFEntry )
|
||
|
{
|
||
|
pITFEntry = new ITF_ENTRY;
|
||
|
pITFEntry->SetIIDString( &InterfaceKeyBuffer[0] );
|
||
|
pMessage->pIIDict->Insert( pITFEntry );
|
||
|
}
|
||
|
pITFEntry->SetClsid( &PSBuffer[0] );
|
||
|
}
|
||
|
delete pProxyClsidKey;
|
||
|
}
|
||
|
delete pKey;
|
||
|
}
|
||
|
else
|
||
|
fFinish = 1;
|
||
|
|
||
|
}
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
|
||
|
}
|