#include <windows.h>
#include <shlwapi.h>
+#include <guiddef.h>
+
using namespace std;
#define COMPANY_STR "VideoLAN"
#define GUID_STRLEN 39
/*
-** MingW headers do not declare those
+** MingW headers & libs do not declare those
*/
-extern const CATID CATID_SafeForInitializing;
-extern const CATID CATID_SafeForScripting;
+static DEFINE_GUID(_CATID_InternetAware, 0x0DE86A58, 0x2BAA, 0x11CF, 0xA2, 0x29, 0x00,0xAA,0x00,0x3D,0x73,0x52);
+static DEFINE_GUID(_CATID_SafeForInitializing, 0x7DD95802, 0x9882, 0x11CF, 0x9F, 0xA9, 0x00,0xAA,0x00,0x6C,0x42,0xC4);
+static DEFINE_GUID(_CATID_SafeForScripting, 0x7DD95801, 0x9882, 0x11CF, 0x9F, 0xA9, 0x00,0xAA,0x00,0x6C,0x42,0xC4);
static LONG i_class_ref= 0;
static HINSTANCE h_instance= 0;
+HMODULE DllGetModule()
+{
+ return h_instance;
+};
+
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
*ppv = NULL;
- if( (CLSID_VLCPlugin == rclsid)
- || (CLSID_VLCPlugin2 == rclsid) )
+ if( (CLSID_VLCPlugin == rclsid )
+ || ( CLSID_VLCPlugin2 == rclsid) )
{
VLCPluginClass *plugin = new VLCPluginClass(&i_class_ref, h_instance, rclsid);
hr = plugin->QueryInterface(riid, ppv);
CATID implCategories[] = {
CATID_Control,
CATID_PersistsToPropertyBag,
- CATID_SafeForInitializing,
- CATID_SafeForScripting,
+ _CATID_InternetAware,
+ _CATID_SafeForInitializing,
+ _CATID_SafeForScripting,
};
pcr->UnRegisterClassImplCategories(CLSID_VLCPlugin,
SHDeleteKey(HKEY_CLASSES_ROOT, TEXT(PROGID_STR));
- UnregisterProgID(CLSID_VLCPlugin, 1);
+ UnregisterProgID(CLSID_VLCPlugin, 2);
UnregisterProgID(CLSID_VLCPlugin2, 1);
return S_OK;
};
-static HRESULT RegisterClassID(HKEY hParent, REFCLSID rclsid, unsigned int version, const char *path, size_t pathLen)
+static HRESULT RegisterClassID(HKEY hParent, REFCLSID rclsid, unsigned int version, BOOL isDefault, const char *path, size_t pathLen)
{
+ char progId[sizeof(PROGID_STR)+16];
+ sprintf(progId, "%s.%u", PROGID_STR, version);
+
+ char description[sizeof(DESCRIPTION)+16];
+ sprintf(description, "%s v%u", DESCRIPTION, version);
+
HKEY hClassKey;
{
LPCSTR psz_CLSID = CStrFromGUID(rclsid);
if( NULL == psz_CLSID )
return E_OUTOFMEMORY;
+ HKEY hProgKey = keyCreate(HKEY_CLASSES_ROOT, progId);
+ if( NULL != hProgKey )
+ {
+ // default key value
+ keySetDef(hProgKey, description);
+
+ keyClose(keySetDef(keyCreate(hProgKey, "CLSID"),
+ psz_CLSID,
+ GUID_STRLEN));
+
+ //hSubKey = keyClose(keyCreate(hBaseKey, "Insertable"));
+
+ RegCloseKey(hProgKey);
+ }
+ if( isDefault )
+ {
+ hProgKey = keyCreate(HKEY_CLASSES_ROOT, PROGID_STR);
+ if( NULL != hProgKey )
+ {
+ // default key value
+ keySetDef(hProgKey, description);
+
+ keyClose(keySetDef(keyCreate(hProgKey, "CLSID"),
+ psz_CLSID,
+ GUID_STRLEN));
+
+ keyClose(keySetDef(keyCreate(hProgKey, "CurVer"),
+ progId));
+ }
+ }
hClassKey = keyCreate(hParent, psz_CLSID);
CoTaskMemFree((void *)psz_CLSID);
}
if( NULL != hClassKey )
{
// default key value
- keySetDef(hClassKey, DESCRIPTION, sizeof(DESCRIPTION));
+ keySetDef(hClassKey, description);
// Control key value
keyClose(keyCreate(hClassKey, "Control"));
keyClose(keyCreate(hClassKey, "Programmable"));
// ProgID key value
- {
- char progId[sizeof(PROGID_STR)+16];
- sprintf(progId, "%s.%u", PROGID_STR, version);
- keyClose(keySetDef(keyCreate(hClassKey,
- TEXT("ProgID")),
- progId));
- }
+ keyClose(keySetDef(keyCreate(hClassKey,
+ TEXT("ProgID")),
+ progId));
// VersionIndependentProgID key value
keyClose(keySetDef(keyCreate(hClassKey,
PROGID_STR, sizeof(PROGID_STR)));
// Version key value
- {
- char ver[32];
- sprintf(ver, "%u.0", version);
- keyClose(keySetDef(keyCreate(hClassKey,
- "Version"),
- ver));
- }
+ keyClose(keySetDef(keyCreate(hClassKey,
+ "Version"),
+ "1.0"));
// TypeLib key value
LPCSTR psz_LIBID = CStrFromGUID(LIBID_AXVLC);
return S_OK;
}
-static HRESULT RegisterProgID(REFCLSID rclsid, unsigned int version)
-{
- LPCSTR psz_CLSID = CStrFromGUID(rclsid);
-
- if( NULL == psz_CLSID )
- return E_OUTOFMEMORY;
-
- char progId[sizeof(PROGID_STR)+16];
- sprintf(progId, "%s.%u", PROGID_STR, version);
-
- HKEY hBaseKey = keyCreate(HKEY_CLASSES_ROOT, progId);
- if( NULL != hBaseKey )
- {
- // default key value
- keySetDef(hBaseKey, DESCRIPTION, sizeof(DESCRIPTION));
-
- keyClose(keySetDef(keyCreate(hBaseKey, "CLSID"),
- psz_CLSID,
- GUID_STRLEN));
-
- //hSubKey = keyClose(keyCreate(hBaseKey, "Insertable"));
-
- RegCloseKey(hBaseKey);
- }
- CoTaskMemFree((void *)psz_CLSID);
-
- return S_OK;
-}
-
-static HRESULT RegisterDefaultProgID(REFCLSID rclsid, unsigned int version)
-{
- LPCSTR psz_CLSID = CStrFromGUID(rclsid);
-
- if( NULL == psz_CLSID )
- return E_OUTOFMEMORY;
-
- HKEY hBaseKey = keyCreate(HKEY_CLASSES_ROOT, PROGID_STR);
- if( NULL != hBaseKey )
- {
- // default key value
- keySetDef(hBaseKey, DESCRIPTION, sizeof(DESCRIPTION));
-
- keyClose(keySetDef(keyCreate(hBaseKey, "CLSID"),
- psz_CLSID,
- GUID_STRLEN));
-
- char progId[sizeof(PROGID_STR)+16];
- sprintf(progId, "%s.%u", PROGID_STR, version);
-
- keyClose(keySetDef(keyCreate(hBaseKey, "CurVer"),
- progId));
- }
- CoTaskMemFree((void *)psz_CLSID);
-}
-
STDAPI DllRegisterServer(VOID)
{
DllUnregisterServer();
char DllPath[MAX_PATH];
DWORD DllPathLen=GetModuleFileNameA(h_instance, DllPath, sizeof(DllPath)) ;
- if( 0 == DllPathLen )
+ if( 0 == DllPathLen )
return E_UNEXPECTED;
HKEY hBaseKey;
if( ERROR_SUCCESS != RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_CREATE_SUB_KEY, &hBaseKey) )
return SELFREG_E_CLASS;
-
- RegisterClassID(hBaseKey, CLSID_VLCPlugin, 1, DllPath, DllPathLen);
- RegisterClassID(hBaseKey, CLSID_VLCPlugin2, 2, DllPath, DllPathLen);
-
- RegCloseKey(hBaseKey);
- RegisterProgID(CLSID_VLCPlugin, 1);
- RegisterProgID(CLSID_VLCPlugin2, 2);
+ RegisterClassID(hBaseKey, CLSID_VLCPlugin, 1, FALSE, DllPath, DllPathLen);
+ RegisterClassID(hBaseKey, CLSID_VLCPlugin2, 2, TRUE, DllPath, DllPathLen);
- /* default control */
- RegisterDefaultProgID(CLSID_VLCPlugin2, 2);
+ RegCloseKey(hBaseKey);
// indicate which component categories we support
ICatRegister *pcr;
CATID implCategories[] = {
CATID_Control,
CATID_PersistsToPropertyBag,
- CATID_SafeForInitializing,
- CATID_SafeForScripting,
+ _CATID_InternetAware,
+ _CATID_SafeForInitializing,
+ _CATID_SafeForScripting,
};
pcr->RegisterClassImplCategories(CLSID_VLCPlugin,
// replace .exe by .tlb
strcpy(DllPath+DllPathLen-4, ".tlb");
#endif
-
+
#ifndef OLE2ANSI
size_t typeLibPathLen = MultiByteToWideChar(CP_ACP, 0, DllPath, -1, NULL, 0);
if( typeLibPathLen > 0 )
return 0;
DWORD dwRegisterClassObject;
+ DWORD dwRegisterClassObject2;
if( FAILED(CoRegisterClassObject(CLSID_VLCPlugin, classProc,
CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegisterClassObject)) )
ACTIVEOBJECT_WEAK, &dwRegisterActiveObject)) )
return 0;
+ if( FAILED(RegisterActiveObject(classProc, CLSID_VLCPlugin2,
+ ACTIVEOBJECT_WEAK, &dwRegisterActiveObject2)) )
+ return 0;
+
classProc->Release();
/*
while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
if( msg.message == WM_QUIT )
- break; // Leave the PeekMessage while() loop
+ break; // break out PeekMessage loop
/*if(TranslateAccelerator(ghwndApp, ghAccel, &msg))
continue;*/
}
if(msg.message == WM_QUIT)
- break; // Leave the for() loop
+ break; // break out main loop
WaitMessage();
}
if( SUCCEEDED(RevokeActiveObject(dwRegisterActiveObject, NULL)) )
CoRevokeClassObject(dwRegisterClassObject);
+ if( SUCCEEDED(RevokeActiveObject(dwRegisterActiveObject2, NULL)) )
+ CoRevokeClassObject(dwRegisterClassObject2);
+
// Reached on WM_QUIT message
- CoUninitialize();
+ OleUninitialize();
return ((int) msg.wParam);
};