/************************************************************************** THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. Copyright 1998 Microsoft Corporation. All Rights Reserved. **************************************************************************/ /************************************************************************** File: SampView.cpp Description: Contains DLLMain and standard OLE COM object creation stuff. **************************************************************************/ /************************************************************************** #include statements **************************************************************************/ #include "ShlView.h" #include "ClsFact.h" #include "ViewList.h" #include "Utility.h" #include #include "ParseXML.h" /************************************************************************** GUID stuff **************************************************************************/ //this part is only done once //if you need to use the GUID in another file, just include Guid.h #pragma data_seg(".text") #define INITGUID #include #include #include "Guid.h" #pragma data_seg() /************************************************************************** private function prototypes **************************************************************************/ extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID); /************************************************************************** global variables **************************************************************************/ HINSTANCE g_hInst; UINT g_DllRefCount; HIMAGELIST g_himlLarge = NULL; HIMAGELIST g_himlSmall = NULL; TCHAR g_szStoragePath[MAX_PATH]; TCHAR g_szExtTitle[TITLE_SIZE]; const TCHAR c_szDataFile[] = TEXT("items.ini\0"); const TCHAR c_szSection[] = TEXT("Items\0"); int g_nColumn = INITIAL_COLUMN_SIZE; CViewList *g_pViewList; IXMLDocument *g_pXMLDoc = NULL; const TCHAR g_szXMLUrl[] = TEXT("http://a-yurip1/test/test.xml"); /************************************************************************** DllMain **************************************************************************/ extern "C" BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { HRESULT hr; PSTR pszErr = NULL; switch(dwReason) { case DLL_PROCESS_ATTACH: g_hInst = hInstance; g_DllRefCount = 0; // Open the sourse XML // For now we are using global XML object because we have only one file // In the future we have to associate the file with the folder and put the object in IDL if (g_pXMLDoc == NULL) { hr = GetSourceXML(&g_pXMLDoc, TEXT("http://a-yurip1/test/test.xml")); if (!SUCCEEDED(hr) || !g_pXMLDoc) { SAFERELEASE(g_pXMLDoc); return FALSE; } BSTR bstrVal; hr = g_pXMLDoc->get_version(&bstrVal); // Check if the version is correct ??????? // SysFreeString(bstrVal); bstrVal = NULL; } GetGlobalSettings(); //create the global image lists CreateImageLists(); g_pViewList = new CViewList(); break; case DLL_PROCESS_DETACH: SaveGlobalSettings(); //destroy the global image lists DestroyImageLists(); if(g_pViewList) delete g_pViewList; if (g_pXMLDoc) SAFERELEASE(g_pXMLDoc); break; } return TRUE; } /************************************************************************** DllCanUnloadNow **************************************************************************/ STDAPI DllCanUnloadNow(VOID) { return (g_DllRefCount ? S_FALSE : S_OK); } /************************************************************************** DllGetClassObject **************************************************************************/ STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID *ppReturn) { *ppReturn = NULL; //if we don't support this classid, return the proper error code if(!IsEqualCLSID(rclsid, CLSID_SampleNameSpace)) return CLASS_E_CLASSNOTAVAILABLE; //create a CClassFactory object and check it for validity CClassFactory *pClassFactory = new CClassFactory(); if(NULL == pClassFactory) return E_OUTOFMEMORY; //get the QueryInterface return for our return value HRESULT hResult = pClassFactory->QueryInterface(riid, ppReturn); //call Release to decrement the ref count - creating the object set it to one //and QueryInterface incremented it - since its being used externally (not by //us), we only want the ref count to be 1 pClassFactory->Release(); //return the result from QueryInterface return hResult; } /************************************************************************** DllRegisterServer **************************************************************************/ typedef struct{ HKEY hRootKey; LPTSTR lpszSubKey; LPTSTR lpszValueName; LPTSTR lpszData; }REGSTRUCT, *LPREGSTRUCT; STDAPI DllRegisterServer(VOID) { int i; HKEY hKey; LRESULT lResult; DWORD dwDisp; TCHAR szSubKey[MAX_PATH]; TCHAR szCLSID[MAX_PATH]; TCHAR szModule[MAX_PATH]; LPWSTR pwsz; //get the CLSID in string form StringFromIID(CLSID_SampleNameSpace, &pwsz); if(pwsz) { WideCharToLocal(szCLSID, pwsz, ARRAYSIZE(szCLSID)); //free the string LPMALLOC pMalloc; CoGetMalloc(1, &pMalloc); if(pMalloc) { pMalloc->Free(pwsz); pMalloc->Release(); } } //get this DLL's path and file name GetModuleFileName(g_hInst, szModule, ARRAYSIZE(szModule)); //register the CLSID entries REGSTRUCT ClsidEntries[] = { HKEY_CLASSES_ROOT, TEXT("CLSID\\%s"), NULL, g_szExtTitle, HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), NULL, TEXT("%s"), HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), TEXT("ThreadingModel"), TEXT("Apartment"), HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\DefaultIcon"), NULL, TEXT("%s,0"), NULL, NULL, NULL, NULL}; for(i = 0; ClsidEntries[i].hRootKey; i++) { //Create the sub key string. wsprintf(szSubKey, ClsidEntries[i].lpszSubKey, szCLSID); lResult = RegCreateKeyEx( ClsidEntries[i].hRootKey, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { TCHAR szData[MAX_PATH]; //if necessary, create the value string wsprintf(szData, ClsidEntries[i].lpszData, szModule); lResult = RegSetValueEx( hKey, ClsidEntries[i].lpszValueName, 0, REG_SZ, (LPBYTE)szData, (lstrlen(szData) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } else return SELFREG_E_CLASS; } //Register the default flags for the folder. wsprintf( szSubKey, TEXT("CLSID\\%s\\ShellFolder"), szCLSID); lResult = RegCreateKeyEx( HKEY_CLASSES_ROOT, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { DWORD dwData = SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_BROWSABLE | SFGAO_DROPTARGET; lResult = RegSetValueEx( hKey, TEXT("Attributes"), 0, REG_BINARY, (LPBYTE)&dwData, sizeof(dwData)); RegCloseKey(hKey); } else return SELFREG_E_CLASS; //Register the name space extension /* Create the sub key string. Change this from "...MyComputer..." to "...Desktop..." if desired. */ wsprintf( szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\%s"), //TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\%s"), szCLSID); lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { TCHAR szData[MAX_PATH]; //Create the value string. lstrcpy(szData, g_szExtTitle); lResult = RegSetValueEx( hKey, NULL, 0, REG_SZ, (LPBYTE)szData, (lstrlen(szData) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } else return SELFREG_E_CLASS; //If running on NT, register the extension as approved. OSVERSIONINFO osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); if(VER_PLATFORM_WIN32_NT == osvi.dwPlatformId) { lstrcpy( szSubKey, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved")); lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); if(NOERROR == lResult) { TCHAR szData[MAX_PATH]; //Create the value string. lstrcpy(szData, g_szExtTitle); lResult = RegSetValueEx( hKey, szCLSID, 0, REG_SZ, (LPBYTE)szData, (lstrlen(szData) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } else return SELFREG_E_CLASS; } return S_OK; }