+ // unregister type lib from the registry\r
+ UnRegisterTypeLib(LIBID_AXVLC, 1, 0, LOCALE_NEUTRAL, SYS_WIN32);\r
+\r
+ // remove component categories we supports\r
+ ICatRegister *pcr;\r
+ if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr, \r
+ NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr)) ) {\r
+ CATID implCategories[] = {\r
+ CATID_Control,\r
+ CATID_PersistsToPropertyBag,\r
+ CATID_SafeForInitializing,\r
+ CATID_SafeForScripting,\r
+ };\r
+\r
+ pcr->UnRegisterClassImplCategories(CLSID_VLCPlugin,\r
+ sizeof(implCategories)/sizeof(CATID), implCategories);\r
+ pcr->Release();\r
+ }\r
+\r
+ SHDeleteKey(HKEY_CLASSES_ROOT, TEXT(VERS_PROGID_STR));\r
+ SHDeleteKey(HKEY_CLASSES_ROOT, TEXT(PROGID_STR));\r
+\r
+ LPCTSTR psz_CLSID = TStrFromGUID(CLSID_VLCPlugin);\r
+\r
+ if( NULL == psz_CLSID )\r
+ return E_OUTOFMEMORY;\r
+\r
+ HKEY hClsIDKey;\r
+ if( ERROR_SUCCESS == RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("CLSID"), 0, KEY_WRITE, &hClsIDKey) )\r
+ {\r
+ SHDeleteKey(hClsIDKey, psz_CLSID);\r
+ RegCloseKey(hClsIDKey);\r
+ }\r
+\r
+ return S_OK;\r
+};\r
+\r
+STDAPI DllRegisterServer(VOID)\r
+{\r
+ DllUnregisterServer();\r
+\r
+ LPCTSTR psz_CLSID = TStrFromGUID(CLSID_VLCPlugin);\r
+\r
+ if( NULL == psz_CLSID )\r
+ return E_OUTOFMEMORY;\r
+\r
+ HKEY hBaseKey;\r
+\r
+ if( ERROR_SUCCESS != RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("CLSID"), 0, KEY_CREATE_SUB_KEY, &hBaseKey) )\r
+ return E_FAIL;\r
+\r
+ HKEY hClassKey = keyCreate(hBaseKey, psz_CLSID);\r
+ if( NULL != hClassKey )\r
+ {\r
+ HKEY hSubKey;\r
+\r
+ // default key value\r
+ RegSetValueEx(hClassKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)DESCRIPTION, sizeof(DESCRIPTION));\r
+\r
+ // Control key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("Control"));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // InprocServer32 key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("InprocServer32"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)COMDLLPATH, sizeof(COMDLLPATH));\r
+ RegSetValueEx(hSubKey, TEXT("ThreadingModel"), 0, REG_SZ,\r
+ (const BYTE*)THREADING_MODEL, sizeof(THREADING_MODEL));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // MiscStatus key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("MiscStatus\\1"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ, (const BYTE*)"131473", sizeof("131473"));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // Programmable key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("Programmable"));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // ProgID key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("ProgID"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ, \r
+ (const BYTE*)VERS_PROGID_STR, sizeof(VERS_PROGID_STR));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // VersionIndependentProgID key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("VersionIndependentProgID"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ, \r
+ (const BYTE*)PROGID_STR, sizeof(PROGID_STR));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // Version key value\r
+ hSubKey = keyCreate(hClassKey, TEXT("Version"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)VERSION_STR, sizeof(VERSION_STR));\r
+ RegCloseKey(hSubKey);\r
+\r
+ // TypeLib key value\r
+ LPCTSTR psz_LIBID = TStrFromGUID(LIBID_AXVLC);\r
+ if( NULL != psz_LIBID )\r
+ {\r
+ hSubKey = keyCreate(hClassKey, TEXT("TypeLib"));\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)psz_LIBID, sizeof(TCHAR)*GUID_STRLEN);\r
+ RegCloseKey(hSubKey);\r
+ }\r
+ RegCloseKey(hClassKey);\r
+ }\r
+ RegCloseKey(hBaseKey);\r
+\r
+ hBaseKey = keyCreate(HKEY_CLASSES_ROOT, TEXT(PROGID_STR));\r
+ if( NULL != hBaseKey )\r
+ {\r
+ // default key value\r
+ RegSetValueEx(hBaseKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)DESCRIPTION, sizeof(DESCRIPTION));\r
+\r
+ HKEY hSubKey = keyCreate(hBaseKey, TEXT("CLSID"));\r
+ if( NULL != hSubKey )\r
+ {\r
+ // default key value\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)psz_CLSID, sizeof(TCHAR)*GUID_STRLEN);\r
+\r
+ RegCloseKey(hSubKey);\r
+ }\r
+ hSubKey = keyCreate(hBaseKey, TEXT("CurVer"));\r
+ if( NULL != hSubKey )\r
+ {\r
+ // default key value\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)VERS_PROGID_STR, sizeof(VERS_PROGID_STR));\r
+\r
+ RegCloseKey(hSubKey);\r
+ }\r
+ RegCloseKey(hBaseKey);\r
+ }\r
+\r
+ hBaseKey = keyCreate(HKEY_CLASSES_ROOT, TEXT(VERS_PROGID_STR));\r
+ if( NULL != hBaseKey )\r
+ {\r
+ // default key value\r
+ RegSetValueEx(hBaseKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)DESCRIPTION, sizeof(DESCRIPTION));\r
+\r
+ HKEY hSubKey = keyCreate(hBaseKey, TEXT("CLSID"));\r
+ if( NULL != hSubKey )\r
+ {\r
+ // default key value\r
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ,\r
+ (const BYTE*)psz_CLSID, sizeof(TCHAR)*GUID_STRLEN);\r
+\r
+ RegCloseKey(hSubKey);\r
+ }\r
+ RegCloseKey(hBaseKey);\r
+ }\r
+\r
+ // indicate which component categories we support\r
+ ICatRegister *pcr;\r
+ if( SUCCEEDED(CoCreateInstance(CLSID_StdComponentCategoriesMgr, \r
+ NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr)) ) {\r
+ CATID implCategories[] = {\r
+ CATID_Control,\r
+ CATID_PersistsToPropertyBag,\r
+ CATID_SafeForInitializing,\r
+ CATID_SafeForScripting,\r
+ };\r
+\r
+ pcr->RegisterClassImplCategories(CLSID_VLCPlugin,\r
+ sizeof(implCategories)/sizeof(CATID), implCategories);\r
+ pcr->Release();\r
+ }\r
+\r
+ // register type lib into the registry\r
+ ITypeLib *typeLib;\r
+ if( SUCCEEDED(LoadTypeLibEx(OLESTR("")COMDLLPATH, REGKIND_REGISTER, &typeLib)) )\r
+ typeLib->Release();\r
+\r