1*cdf0e10cSrcweir 2*cdf0e10cSrcweir #include "stdafx.h" 3*cdf0e10cSrcweir 4*cdf0e10cSrcweir #include "XMergeFilter.h" 5*cdf0e10cSrcweir #include "XMergeFactory.h" 6*cdf0e10cSrcweir 7*cdf0e10cSrcweir 8*cdf0e10cSrcweir CXMergeSyncModule _Module; 9*cdf0e10cSrcweir 10*cdf0e10cSrcweir 11*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 12*cdf0e10cSrcweir // DLL Functions 13*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 14*cdf0e10cSrcweir BOOL WINAPI DllMain(HANDLE hInst, ULONG ulReason, LPVOID lpReserved) 15*cdf0e10cSrcweir { 16*cdf0e10cSrcweir switch (ulReason) 17*cdf0e10cSrcweir { 18*cdf0e10cSrcweir case DLL_PROCESS_ATTACH: 19*cdf0e10cSrcweir _Module.m_hInst = reinterpret_cast<HINSTANCE>(hInst); 20*cdf0e10cSrcweir break; 21*cdf0e10cSrcweir 22*cdf0e10cSrcweir case DLL_PROCESS_DETACH: 23*cdf0e10cSrcweir _Module.m_hInst = NULL; 24*cdf0e10cSrcweir break; 25*cdf0e10cSrcweir 26*cdf0e10cSrcweir case DLL_THREAD_ATTACH: 27*cdf0e10cSrcweir break; 28*cdf0e10cSrcweir 29*cdf0e10cSrcweir case DLL_THREAD_DETACH: 30*cdf0e10cSrcweir break; 31*cdf0e10cSrcweir } 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir return TRUE; 34*cdf0e10cSrcweir } 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) 38*cdf0e10cSrcweir { 39*cdf0e10cSrcweir // Create the factory object 40*cdf0e10cSrcweir CXMergeFactory *pFactory = new CXMergeFactory(); 41*cdf0e10cSrcweir if (pFactory == NULL) 42*cdf0e10cSrcweir { 43*cdf0e10cSrcweir *ppv = NULL; 44*cdf0e10cSrcweir return E_OUTOFMEMORY; 45*cdf0e10cSrcweir } 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir HRESULT hr = pFactory->QueryInterface(riid, ppv); 48*cdf0e10cSrcweir pFactory->Release(); 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir return hr; 51*cdf0e10cSrcweir } 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir STDAPI DllCanUnloadNow() 55*cdf0e10cSrcweir { 56*cdf0e10cSrcweir if (_Module.GetLockCount() == 0) 57*cdf0e10cSrcweir return S_OK; 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir return S_FALSE; 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir // Utility function to close open keys during registration 64*cdf0e10cSrcweir static _signalRegError(long lRet, HKEY hKey, HKEY hDataKey) 65*cdf0e10cSrcweir { 66*cdf0e10cSrcweir if (hKey) 67*cdf0e10cSrcweir ::RegCloseKey(hKey); 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir if (hDataKey) 71*cdf0e10cSrcweir ::RegCloseKey(hDataKey); 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir return HRESULT_FROM_WIN32(lRet); 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir STDAPI DllRegisterServer() 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir HKEY hKey = NULL; 80*cdf0e10cSrcweir HKEY hDataKey = NULL; 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir long lRet = 0; 83*cdf0e10cSrcweir TCHAR sTemp[_MAX_PATH + 1] = "\0"; 84*cdf0e10cSrcweir 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir /* 87*cdf0e10cSrcweir * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer export filter. 88*cdf0e10cSrcweir * 89*cdf0e10cSrcweir * Note that import are export are relative to the WinCE device, so files are 90*cdf0e10cSrcweir * exported to the desktop format. 91*cdf0e10cSrcweir */ 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir // Get a handle to the CLSID key 94*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); 95*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 96*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir // Create the CLSID key for the XMergeFilter 99*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); 100*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 101*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportShortDesc, 104*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 105*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 106*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir // Create the DefaultIcon key. For the moment, use one of the Async supplied ones 110*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 111*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 112*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), 115*cdf0e10cSrcweir (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) 116*cdf0e10cSrcweir * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 117*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 118*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 119*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir // Create the InprocServer32 key 122*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 123*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 124*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); 127*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 128*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 129*cdf0e10cSrcweir 130*cdf0e10cSrcweir // Create the key for the DLL file. First find the filename of the dll 131*cdf0e10cSrcweir if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) 132*cdf0e10cSrcweir { 133*cdf0e10cSrcweir lRet = ::GetLastError(); 134*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 135*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 136*cdf0e10cSrcweir } 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir 139*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, 140*cdf0e10cSrcweir (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 141*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 142*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 143*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir 146*cdf0e10cSrcweir // Setup the PegasusFilter key values 147*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 148*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 149*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportDesc, 152*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 153*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 154*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 158*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 159*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWExportExt, 163*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 164*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 165*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 169*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir /* 175*cdf0e10cSrcweir * Following calls create the entries for the filter in 176*cdf0e10cSrcweir * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters 177*cdf0e10cSrcweir */ 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), 180*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, &hKey); 181*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 182*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWImportExt); 185*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 186*cdf0e10cSrcweir 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 187*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 188*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 191*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 192*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 195*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 196*cdf0e10cSrcweir 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir /* 200*cdf0e10cSrcweir * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Writer import filter. 201*cdf0e10cSrcweir * 202*cdf0e10cSrcweir * Note that import are export are relative to the WinCE device, so files are 203*cdf0e10cSrcweir * exported to the desktop format. 204*cdf0e10cSrcweir */ 205*cdf0e10cSrcweir // Get a handle to the CLSID key 206*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); 207*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 208*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir // Create the CLSID key for the XMergeFilter 211*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); 212*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 213*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportShortDesc, 216*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 217*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 218*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir // Create the DefaultIcon key. For the moment, use one of the Async supplied ones 222*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 223*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 224*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), 227*cdf0e10cSrcweir (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) 228*cdf0e10cSrcweir * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 229*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 230*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 231*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir 234*cdf0e10cSrcweir // Create the InprocServer32 key 235*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 236*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 237*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); 240*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 241*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir // Create the key for the DLL file. First find the filename of the dll 245*cdf0e10cSrcweir if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) 246*cdf0e10cSrcweir { 247*cdf0e10cSrcweir lRet = ::GetLastError(); 248*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 249*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, 254*cdf0e10cSrcweir (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 255*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 256*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 257*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir // Setup the PegasusFilter key values 261*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 262*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 263*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportDesc, 266*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 267*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 268*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 269*cdf0e10cSrcweir 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 272*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 273*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPSWImportExt, 277*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 278*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 279*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 283*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 284*cdf0e10cSrcweir 285*cdf0e10cSrcweir 286*cdf0e10cSrcweir /* 287*cdf0e10cSrcweir * Following calls create the entries for the filter in 288*cdf0e10cSrcweir * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters 289*cdf0e10cSrcweir */ 290*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), 291*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, &hKey); 292*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 293*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir // Add in defaults for import and export 296*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPSWExportExt); 297*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 298*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 299*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, 302*cdf0e10cSrcweir (LPBYTE)CXMergeFilter::m_pszPSWImportCLSID, 303*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 304*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 305*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), 309*cdf0e10cSrcweir (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 310*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 311*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir ::RegCloseKey(hDataKey); 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir // Update registered filters 316*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPSWExportExt); 317*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 318*cdf0e10cSrcweir 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 319*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 320*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPSWImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 324*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 325*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 328*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir /* 333*cdf0e10cSrcweir * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc export filter. 334*cdf0e10cSrcweir * 335*cdf0e10cSrcweir * Note that import are export are relative to the WinCE device, so files are 336*cdf0e10cSrcweir * exported to the desktop format. 337*cdf0e10cSrcweir */ 338*cdf0e10cSrcweir 339*cdf0e10cSrcweir // Get a handle to the CLSID key 340*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); 341*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 342*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir // Create the CLSID key for the XMerge Filter 345*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, _T(""), 346*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); 347*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 348*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 349*cdf0e10cSrcweir 350*cdf0e10cSrcweir lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportShortDesc, 351*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLExportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 352*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 353*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 354*cdf0e10cSrcweir 355*cdf0e10cSrcweir 356*cdf0e10cSrcweir // Create the DefaultIcon key. For the moment, use one of the Async supplied ones 357*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 358*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 359*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), 362*cdf0e10cSrcweir (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) 363*cdf0e10cSrcweir * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 364*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 365*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 366*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir // Create the InprocServer32 key 370*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 371*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 372*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); 375*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 376*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir // Create the key for the DLL file. First find the filename of the dll 380*cdf0e10cSrcweir if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir lRet = ::GetLastError(); 383*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 384*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 385*cdf0e10cSrcweir } 386*cdf0e10cSrcweir 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, 389*cdf0e10cSrcweir (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 390*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 391*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 392*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir 395*cdf0e10cSrcweir // Setup the PegasusFilter key values 396*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 397*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 398*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportDesc, 401*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLExportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 402*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 403*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir 406*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Export"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 407*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 408*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 409*cdf0e10cSrcweir 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLExportExt, 412*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLExportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 413*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 414*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 418*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir 422*cdf0e10cSrcweir 423*cdf0e10cSrcweir /* 424*cdf0e10cSrcweir * Following calls create the entries for the filter in 425*cdf0e10cSrcweir * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters 426*cdf0e10cSrcweir */ 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), 429*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, &hKey); 430*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 431*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLImportExt); 434*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 435*cdf0e10cSrcweir 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 436*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 437*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLExportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 440*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 441*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 444*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 445*cdf0e10cSrcweir 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir /* 449*cdf0e10cSrcweir * Following calls create the HKEY_CLASSES_ROOT\CLSID entry for the Calc import filter. 450*cdf0e10cSrcweir * 451*cdf0e10cSrcweir * Note that import are export are relative to the WinCE device, so files are 452*cdf0e10cSrcweir * exported to the desktop format. 453*cdf0e10cSrcweir */ 454*cdf0e10cSrcweir // Get a handle to the CLSID key 455*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); 456*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 457*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 458*cdf0e10cSrcweir 459*cdf0e10cSrcweir 460*cdf0e10cSrcweir // Create the CLSID key for the XMergeFilter 461*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL); 462*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 463*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 464*cdf0e10cSrcweir 465*cdf0e10cSrcweir lRet = ::RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportShortDesc, 466*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLImportShortDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 467*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 468*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 469*cdf0e10cSrcweir 470*cdf0e10cSrcweir // Create the DefaultIcon key. For the moment, use one of the Async supplied ones 471*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("DefaultIcon"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 472*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 473*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0"), 476*cdf0e10cSrcweir (::_tcslen(_T("C:\\Program Files\\Microsoft ActiveSync\\pwdcnv.dll,0")) 477*cdf0e10cSrcweir * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 478*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 479*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 480*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir 483*cdf0e10cSrcweir // Create the InprocServer32 key 484*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("InProcServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 485*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 486*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 487*cdf0e10cSrcweir 488*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("ThreadingModel"), 0, REG_SZ, (LPBYTE)_T("Apartment"), 10); 489*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 490*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir 493*cdf0e10cSrcweir // Create the key for the DLL file. First find the filename of the dll 494*cdf0e10cSrcweir if (!::GetModuleFileName((HMODULE)_Module.m_hInst, sTemp, (_MAX_PATH + 1))) 495*cdf0e10cSrcweir { 496*cdf0e10cSrcweir lRet = ::GetLastError(); 497*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 498*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, NULL, 0, REG_SZ, (LPBYTE)sTemp, 503*cdf0e10cSrcweir (::_tcslen(sTemp) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 504*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 505*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 506*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 507*cdf0e10cSrcweir 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir // Setup the PegasusFilter key values 510*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T("PegasusFilter"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 511*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 512*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Description"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportDesc, 515*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 516*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 517*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 518*cdf0e10cSrcweir 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("Import"), 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 521*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 522*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 523*cdf0e10cSrcweir 524*cdf0e10cSrcweir 525*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("NewExtension"), 0, REG_SZ, (LPBYTE)CXMergeFilter::m_pszPXLImportExt, 526*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPXLImportExt) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 527*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 528*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir 531*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 532*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 533*cdf0e10cSrcweir 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir 536*cdf0e10cSrcweir /* 537*cdf0e10cSrcweir * Following calls create the entries for the filter in 538*cdf0e10cSrcweir * HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters 539*cdf0e10cSrcweir */ 540*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), 541*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, &hKey); 542*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 543*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 544*cdf0e10cSrcweir 545*cdf0e10cSrcweir // Add in defaults for import and export 546*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH +1, "%c%s\0", '.', CXMergeFilter::m_pszPXLExportExt); 547*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 548*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 549*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 550*cdf0e10cSrcweir 551*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, 552*cdf0e10cSrcweir (LPBYTE)CXMergeFilter::m_pszPXLImportCLSID, 553*cdf0e10cSrcweir (::_tcslen(CXMergeFilter::m_pszPSWImportDesc) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 554*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 555*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 556*cdf0e10cSrcweir 557*cdf0e10cSrcweir 558*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultExport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), 559*cdf0e10cSrcweir (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 560*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 561*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir ::RegCloseKey(hDataKey); 564*cdf0e10cSrcweir 565*cdf0e10cSrcweir // Update registered filters 566*cdf0e10cSrcweir 567*cdf0e10cSrcweir 568*cdf0e10cSrcweir _snprintf(sTemp, _MAX_PATH + 1, "%c%s\\InstalledFilters\0", '.', CXMergeFilter::m_pszPXLExportExt); 569*cdf0e10cSrcweir lRet = ::RegCreateKeyEx(hKey, _T(sTemp), 570*cdf0e10cSrcweir 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hDataKey, NULL); 571*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 572*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 573*cdf0e10cSrcweir 574*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, CXMergeFilter::m_pszPXLImportCLSID, 0, REG_SZ, (LPBYTE)_T(""), (1 * sizeof(TCHAR))); 575*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 576*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 577*cdf0e10cSrcweir 578*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 579*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir 582*cdf0e10cSrcweir 583*cdf0e10cSrcweir return HRESULT_FROM_WIN32(lRet); 584*cdf0e10cSrcweir } 585*cdf0e10cSrcweir 586*cdf0e10cSrcweir 587*cdf0e10cSrcweir STDAPI DllUnregisterServer() 588*cdf0e10cSrcweir { 589*cdf0e10cSrcweir long lRet = 0; 590*cdf0e10cSrcweir HKEY hKey = NULL; 591*cdf0e10cSrcweir HKEY hDataKey = NULL; 592*cdf0e10cSrcweir 593*cdf0e10cSrcweir TCHAR szClassName[_MAX_PATH] = "\0"; 594*cdf0e10cSrcweir TCHAR szKeyName[_MAX_PATH] = "\0"; 595*cdf0e10cSrcweir DWORD dwClassName = _MAX_PATH; 596*cdf0e10cSrcweir DWORD dwKeyName = _MAX_PATH; 597*cdf0e10cSrcweir 598*cdf0e10cSrcweir /* 599*cdf0e10cSrcweir * Remove HKEY_CLASS_ROOT\CLSID\{XXX} entry for the export and import filters 600*cdf0e10cSrcweir * 601*cdf0e10cSrcweir * Windows 95/98/Me allow one step deletion of a key and all subkeys. 602*cdf0e10cSrcweir * Windows NT/2000/XP do not so the subkeys must be deleted individually. 603*cdf0e10cSrcweir */ 604*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey); 605*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 606*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir 609*cdf0e10cSrcweir // First up, the Writer export filter 610*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); 611*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 612*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir 615*cdf0e10cSrcweir while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) 616*cdf0e10cSrcweir != ERROR_NO_MORE_ITEMS) 617*cdf0e10cSrcweir { 618*cdf0e10cSrcweir lRet = ::RegDeleteKey(hDataKey, szKeyName); 619*cdf0e10cSrcweir 620*cdf0e10cSrcweir ::lstrcpy(szKeyName, "\0"); 621*cdf0e10cSrcweir ::lstrcpy(szClassName, "\0"); 622*cdf0e10cSrcweir 623*cdf0e10cSrcweir dwClassName = _MAX_PATH; 624*cdf0e10cSrcweir dwKeyName = _MAX_PATH; 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWExportCLSID); 630*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) 631*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 632*cdf0e10cSrcweir 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir 635*cdf0e10cSrcweir // Next, the Writer import filter 636*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPSWImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); 637*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 638*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir 641*cdf0e10cSrcweir while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) 642*cdf0e10cSrcweir != ERROR_NO_MORE_ITEMS) 643*cdf0e10cSrcweir { 644*cdf0e10cSrcweir lRet = ::RegDeleteKey(hDataKey, szKeyName); 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir ::lstrcpy(szKeyName, "\0"); 647*cdf0e10cSrcweir ::lstrcpy(szClassName, "\0"); 648*cdf0e10cSrcweir 649*cdf0e10cSrcweir dwClassName = _MAX_PATH; 650*cdf0e10cSrcweir dwKeyName = _MAX_PATH; 651*cdf0e10cSrcweir } 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 654*cdf0e10cSrcweir 655*cdf0e10cSrcweir lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPSWImportCLSID); 656*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) 657*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir // Next up, the Calc export filter 661*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLExportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); 662*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 663*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) 667*cdf0e10cSrcweir != ERROR_NO_MORE_ITEMS) 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir lRet = ::RegDeleteKey(hDataKey, szKeyName); 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir ::lstrcpy(szKeyName, "\0"); 672*cdf0e10cSrcweir ::lstrcpy(szClassName, "\0"); 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir dwClassName = _MAX_PATH; 675*cdf0e10cSrcweir dwKeyName = _MAX_PATH; 676*cdf0e10cSrcweir } 677*cdf0e10cSrcweir 678*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 679*cdf0e10cSrcweir 680*cdf0e10cSrcweir lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLExportCLSID); 681*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) 682*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 683*cdf0e10cSrcweir 684*cdf0e10cSrcweir 685*cdf0e10cSrcweir // Next, the Calc import filter 686*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, CXMergeFilter::m_pszPXLImportCLSID, 0, KEY_ALL_ACCESS, &hDataKey); 687*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 688*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir while ((lRet = ::RegEnumKeyEx(hDataKey, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)) 692*cdf0e10cSrcweir != ERROR_NO_MORE_ITEMS) 693*cdf0e10cSrcweir { 694*cdf0e10cSrcweir lRet = ::RegDeleteKey(hDataKey, szKeyName); 695*cdf0e10cSrcweir 696*cdf0e10cSrcweir ::lstrcpy(szKeyName, "\0"); 697*cdf0e10cSrcweir ::lstrcpy(szClassName, "\0"); 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir dwClassName = _MAX_PATH; 700*cdf0e10cSrcweir dwKeyName = _MAX_PATH; 701*cdf0e10cSrcweir } 702*cdf0e10cSrcweir 703*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 704*cdf0e10cSrcweir 705*cdf0e10cSrcweir lRet = ::RegDeleteKey(hKey, CXMergeFilter::m_pszPXLImportCLSID); 706*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS && lRet != ERROR_FILE_NOT_FOUND) 707*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir 712*cdf0e10cSrcweir 713*cdf0e10cSrcweir /* 714*cdf0e10cSrcweir * Remove the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows CE Services\Filters 715*cdf0e10cSrcweir */ 716*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows CE Services\\Filters"), 717*cdf0e10cSrcweir 0, KEY_ALL_ACCESS, &hKey); 718*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 719*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 720*cdf0e10cSrcweir 721*cdf0e10cSrcweir 722*cdf0e10cSrcweir // Remove the Writer export filter from the Writer import file extension subkey. 723*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWImportExt); 724*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 725*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 726*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 727*cdf0e10cSrcweir 728*cdf0e10cSrcweir lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWExportCLSID); 729*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 730*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 731*cdf0e10cSrcweir 732*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 733*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir 736*cdf0e10cSrcweir // Remove the Writer import filter from the Writer export file extension subkey. 737*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPSWExportExt); 738*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 739*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 740*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 741*cdf0e10cSrcweir 742*cdf0e10cSrcweir lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPSWImportCLSID); 743*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 744*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 745*cdf0e10cSrcweir 746*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 747*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 748*cdf0e10cSrcweir 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir // Make Binary Copy the default for Writer export file extension subkey DefaultImport 751*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPSWExportExt); 752*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 753*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 754*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 755*cdf0e10cSrcweir 756*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), 757*cdf0e10cSrcweir (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 758*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 759*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 762*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 763*cdf0e10cSrcweir 764*cdf0e10cSrcweir 765*cdf0e10cSrcweir // Remove the Calc export filter from the Calc import file extension subkey. 766*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLImportExt); 767*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 768*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 769*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLExportCLSID); 772*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 773*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 774*cdf0e10cSrcweir 775*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 776*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 777*cdf0e10cSrcweir 778*cdf0e10cSrcweir // Remove the Calc import filter from the Calc export file extension subkey. 779*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\\InstalledFilters", CXMergeFilter::m_pszPXLExportExt); 780*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 781*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 782*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 783*cdf0e10cSrcweir 784*cdf0e10cSrcweir lRet = ::RegDeleteValue(hDataKey, CXMergeFilter::m_pszPXLImportCLSID); 785*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 786*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 787*cdf0e10cSrcweir 788*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 789*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 790*cdf0e10cSrcweir 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir // Make Binary Copy the default for Calc export file extension subkey DefaultImport 793*cdf0e10cSrcweir _snprintf(szKeyName, _MAX_PATH, ".%s\0", CXMergeFilter::m_pszPXLExportExt); 794*cdf0e10cSrcweir lRet = ::RegOpenKeyEx(hKey, _T(szKeyName), 0, KEY_ALL_ACCESS, &hDataKey); 795*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 796*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 797*cdf0e10cSrcweir 798*cdf0e10cSrcweir lRet = ::RegSetValueEx(hDataKey, _T("DefaultImport"), 0, REG_SZ, (LPBYTE)_T("Binary Copy"), 799*cdf0e10cSrcweir (::_tcslen(_T("Binary Copy")) * sizeof(TCHAR) + (1 * sizeof(TCHAR)))); 800*cdf0e10cSrcweir if (lRet != ERROR_SUCCESS) 801*cdf0e10cSrcweir return _signalRegError(lRet, hKey, hDataKey); 802*cdf0e10cSrcweir 803*cdf0e10cSrcweir ::lstrcpyn(szKeyName, "\0", _MAX_PATH); 804*cdf0e10cSrcweir ::RegCloseKey(hDataKey); hDataKey = NULL; 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir 807*cdf0e10cSrcweir 808*cdf0e10cSrcweir ::RegCloseKey(hKey); hKey = NULL; 809*cdf0e10cSrcweir 810*cdf0e10cSrcweir return HRESULT_FROM_WIN32(lRet); 811*cdf0e10cSrcweir } 812*cdf0e10cSrcweir 813*cdf0e10cSrcweir 814*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 815*cdf0e10cSrcweir // CXMergeSyncModule methods 816*cdf0e10cSrcweir ////////////////////////////////////////////////////////////////////// 817*cdf0e10cSrcweir CXMergeSyncModule::CXMergeSyncModule () 818*cdf0e10cSrcweir { 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir 821*cdf0e10cSrcweir CXMergeSyncModule::~CXMergeSyncModule () 822*cdf0e10cSrcweir { 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir long CXMergeSyncModule::LockServer(BOOL fLock) 826*cdf0e10cSrcweir { 827*cdf0e10cSrcweir if(fLock) 828*cdf0e10cSrcweir return ::InterlockedIncrement(&m_lLocks); 829*cdf0e10cSrcweir else 830*cdf0e10cSrcweir return ::InterlockedDecrement(&m_lLocks); 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir long CXMergeSyncModule::GetLockCount() 834*cdf0e10cSrcweir { 835*cdf0e10cSrcweir return m_lLocks + m_lObjs; 836*cdf0e10cSrcweir } 837*cdf0e10cSrcweir 838