216 lines
7.8 KiB
C++
216 lines
7.8 KiB
C++
|
/******************************************************************************
|
||
|
* Temp conversion utility to take registry entries and populate the class store with those entries.
|
||
|
*****************************************************************************/
|
||
|
|
||
|
/******************************************************************************
|
||
|
includes
|
||
|
******************************************************************************/
|
||
|
#include "precomp.hxx"
|
||
|
#include "..\appmgr\resource.h"
|
||
|
extern HINSTANCE ghInstance;
|
||
|
|
||
|
/******************************************************************************
|
||
|
defines and prototypes
|
||
|
******************************************************************************/
|
||
|
|
||
|
extern CLSID CLSID_ClassStore;
|
||
|
extern const IID IID_IClassStore;
|
||
|
extern const IID IID_IClassAdmin;
|
||
|
|
||
|
LONG
|
||
|
UpdatePackage(
|
||
|
MESSAGE * pMessage,
|
||
|
BOOL fUsageFlag,
|
||
|
DWORD Context,
|
||
|
char * pClsidString,
|
||
|
char * pAppid,
|
||
|
char * ServerName,
|
||
|
DWORD * pMajorVersion,
|
||
|
DWORD * pMinorVersion,
|
||
|
DWORD * pLocale );
|
||
|
|
||
|
|
||
|
LONG
|
||
|
FindCLSIDFromFileExtension(
|
||
|
MESSAGE * pMessage,
|
||
|
BasicRegistry * pFileExtKey,
|
||
|
char * ClsidBuffer,
|
||
|
DWORD * SizeofClsidBuffer,
|
||
|
char * szExt );
|
||
|
|
||
|
LONG
|
||
|
UpdateDatabaseFromFileExt(
|
||
|
MESSAGE * pMessage )
|
||
|
{
|
||
|
BasicRegistry * pHKCR = new BasicRegistry( pMessage->hRoot );
|
||
|
BasicRegistry * pFileKey;
|
||
|
LONG Error;
|
||
|
int Index;
|
||
|
|
||
|
//
|
||
|
// Get the file extension entries one by one. A file extension entry
|
||
|
// is one whose name starts with a ".". So we enumerate the keys
|
||
|
// looking for file extensions and add to the class dictionary.
|
||
|
// Note that this step is carried out AFTER the class dictionary is
|
||
|
// already populated, so we can assume that the class dictionary is
|
||
|
// present.
|
||
|
//
|
||
|
|
||
|
pHKCR->InitForEnumeration(0);
|
||
|
|
||
|
for ( Index = 0;Error != ERROR_NO_MORE_ITEMS;++Index )
|
||
|
{
|
||
|
char FileExtBuffer[ 256 ];
|
||
|
DWORD SizeOfFileExtBuffer = 256;
|
||
|
Error = pHKCR->NextKey( FileExtBuffer,
|
||
|
&SizeOfFileExtBuffer,
|
||
|
&pFileKey,
|
||
|
pMessage->ftLow, pMessage->ftHigh );
|
||
|
|
||
|
if( (Error == ERROR_SUCCESS ) && (FileExtBuffer[0] == '.') )
|
||
|
{
|
||
|
LONG Error2;
|
||
|
char ClsidBuffer[256];
|
||
|
DWORD SizeofClsidBuffer = 256;
|
||
|
|
||
|
// this is a file extension key.
|
||
|
|
||
|
// Given a file extension key, figure out the CLSID.
|
||
|
|
||
|
/*****
|
||
|
if(_stricmp(FileExtBuffer, ".doc" ) == 0 )
|
||
|
printf("Hello1");
|
||
|
******/
|
||
|
|
||
|
Error2 = FindCLSIDFromFileExtension(
|
||
|
pMessage,
|
||
|
pFileKey,
|
||
|
ClsidBuffer,
|
||
|
&SizeofClsidBuffer,
|
||
|
FileExtBuffer );
|
||
|
if( Error2 != ERROR_NO_MORE_ITEMS )
|
||
|
{
|
||
|
CLASS_ENTRY * pClsEntry;
|
||
|
|
||
|
// Enter into the Clsid dictionary.
|
||
|
|
||
|
if( (pClsEntry = pMessage->pClsDict->Search( &ClsidBuffer[0] ) ) != 0 )
|
||
|
{
|
||
|
int len = strlen( FileExtBuffer );
|
||
|
char * p = new char[ len + 1];
|
||
|
strcpy( p, FileExtBuffer );
|
||
|
pClsEntry->FileExtList.Add( p );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
// close the key if we opened it.
|
||
|
|
||
|
if( Error == ERROR_SUCCESS )
|
||
|
delete pFileKey;
|
||
|
}
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
LONG
|
||
|
FindCLSIDFromFileExtension(
|
||
|
MESSAGE * pMessage,
|
||
|
BasicRegistry * pFileExtKey,
|
||
|
char * ClsidBuffer,
|
||
|
DWORD * pSizeofClsidBuffer,
|
||
|
char * szExt )
|
||
|
{
|
||
|
char Buffer[256];
|
||
|
DWORD SizeofBuffer;
|
||
|
BasicRegistry * pClsidKey;
|
||
|
HKEY pTempKey;
|
||
|
BasicRegistry * pProgIDKey;
|
||
|
LONG Error = ERROR_NO_MORE_ITEMS;
|
||
|
int fFound = 0;
|
||
|
|
||
|
// Find the unnamed value. This is the progid value. Under this, a CLSID key should be present.
|
||
|
|
||
|
SizeofBuffer = 256;
|
||
|
Error = pFileExtKey->QueryValue("", &Buffer[0], &SizeofBuffer );
|
||
|
|
||
|
// Get the key named in the Buffer.
|
||
|
|
||
|
Error = RegOpenKeyEx( pMessage->hRoot,
|
||
|
&Buffer[0],
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
&pTempKey );
|
||
|
|
||
|
pProgIDKey = new BasicRegistry( pTempKey );
|
||
|
|
||
|
if( Error == ERROR_SUCCESS )
|
||
|
{
|
||
|
// Now get the CLSID subkey under this prog id key.
|
||
|
|
||
|
Error = pProgIDKey->Find( "CLSID", &pClsidKey );
|
||
|
|
||
|
if( Error == ERROR_SUCCESS )
|
||
|
{
|
||
|
// Find the unnamed value in this
|
||
|
|
||
|
Error = pClsidKey->QueryValue( "", &ClsidBuffer[0], pSizeofClsidBuffer );
|
||
|
|
||
|
delete pClsidKey;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CLSID TempClsid;
|
||
|
|
||
|
// uuid create on TempClsid here
|
||
|
UuidCreate(&TempClsid);
|
||
|
|
||
|
// Convert that to a string.
|
||
|
|
||
|
CLSIDToString( &TempClsid, &ClsidBuffer[0] );
|
||
|
|
||
|
CLASS_ENTRY * pClassEntry = new CLASS_ENTRY;
|
||
|
|
||
|
memcpy( pClassEntry->ClsidString,
|
||
|
&ClsidBuffer[0],
|
||
|
SIZEOF_STRINGIZED_CLSID );
|
||
|
|
||
|
pMessage->pClsDict->Insert( pClassEntry );
|
||
|
|
||
|
char * pT = new char [SIZEOF_STRINGIZED_CLSID];
|
||
|
|
||
|
memcpy( pT,
|
||
|
&ClsidBuffer[0],
|
||
|
SIZEOF_STRINGIZED_CLSID );
|
||
|
|
||
|
UpdatePackage( pMessage,
|
||
|
0, // clsid update
|
||
|
CTX_LOCAL_SERVER,
|
||
|
pT,
|
||
|
0,
|
||
|
pMessage->pPackagePath,
|
||
|
0,
|
||
|
0,
|
||
|
0 );
|
||
|
|
||
|
Error = ERROR_SUCCESS;
|
||
|
}
|
||
|
delete pProgIDKey;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Message that the file extension couldn't be mapped to a prog ID
|
||
|
char szCaption [256];
|
||
|
char szBuffer[256];
|
||
|
|
||
|
::LoadString(ghInstance, IDS_BOGUS_EXTENSION, szBuffer, 256);
|
||
|
strcat(szBuffer, szExt);
|
||
|
strncpy(szCaption, pMessage->pPackagePath, 256);
|
||
|
int iReturn = ::MessageBox(pMessage->hwnd, szBuffer,
|
||
|
szCaption,
|
||
|
MB_OK);
|
||
|
}
|
||
|
|
||
|
return Error == ERROR_SUCCESS ? Error: ERROR_NO_MORE_ITEMS;
|
||
|
}
|