📄 pcdmsync.cpp
字号:
//
// File:
// =====
// PCDMSync.cpp: Implementation File
//
// Description:
// ============
// Class represents the dll module, also
// keeps track of module lock count.
//
#include "stdafx.h"
#include <cesync.h>
#include "PCDMSyncFldr.h"
#include "PCDMSyncStore.h"
#include "PCDMSyncFctry.h"
CPCDMSyncModule _Module; // one & only global module object
//
// ======================== DLL EXPORTS ===========================
//
BOOL WINAPI DllMain(HANDLE hInst, ULONG ulReason, LPVOID lpReserved)
{
switch(ulReason)
{
case DLL_PROCESS_ATTACH :
_Module.m_hInst = reinterpret_cast<HINSTANCE>(hInst);
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
default:
break;
}
return TRUE;
}
STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv)
{
//
// Create & query our class factory that creates
// CPCDMSyncStore objects.
//
CPCDMSyncFactory *pFactory = new CPCDMSyncFactory();
if(pFactory == NULL)
{
*ppv = NULL;
return E_OUTOFMEMORY;
}
HRESULT hr = pFactory->QueryInterface(iid, ppv);
pFactory->Release();
return hr;
}
STDAPI DllCanUnloadNow(void)
{
return _Module.GetLockCount() ? S_FALSE : S_OK;
}
STDAPI DllRegisterServer(void)
{
HKEY hKey = NULL;
HKEY hKey1 = NULL;
long lRet = 0;
TCHAR szTemp[_MAX_PATH] = "\0";
//
// + Create CLSID key HKCR\CLSID\{XXX...}
// + Create InprocServer key HKCR\CLSID\{XXX...}\InprocServer32
// + Set InprocServer value HFCR\CLSID\{XXX...}\InprocServer32\PCDMSync.dll
// + Create ProgId key HFCR\CLSID\{XXX...}\ProgId
// + Set the ProgId key HFCR\CLSID\{XXX...}\ProgId\AWL.PCDMSync
//
lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegCreateKeyEx(hKey, CPCDMSyncStore::GetCLSID(), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegCreateKeyEx(hKey, _T("InprocServer32"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey1, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
TCHAR szFileName[_MAX_PATH + 1];
if(!::GetModuleFileName((HMODULE)_Module.m_hInst, szFileName, (_MAX_PATH + 1)))
{
lRet = ::GetLastError(); // We need to get the actual error
goto exit;
}
lRet = ::RegSetValueEx(hKey1, NULL, 0, REG_SZ, (LPBYTE)szFileName, (::_tcslen(szFileName) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey1);
hKey1 = NULL;
lRet = ::RegCreateKeyEx(hKey, _T("ProgId"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey1, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, NULL, 0, REG_SZ, (LPBYTE)CPCDMSyncStore::GetProgId(), (::_tcslen(CPCDMSyncStore::GetProgId()) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey);
::RegCloseKey(hKey1);
hKey = NULL;
hKey1 = NULL;
//
// + Create the ProgId key HKCR\AWL.PCDMSync
// + Set default value HKCR\AWL.PCDMSync\PCDMSync
// + Create "display name" key HKCR\AWL.PCDMSync\DisplayName
// + Set default value HKCR\AWL.PCDMSync\DisplayName\PCDM Database
//
lRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, CPCDMSyncStore::GetProgId(), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegCreateKeyEx(hKey, _T("CLSID"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey1, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, NULL, 0, REG_SZ, (LPBYTE)CPCDMSyncStore::GetCLSID(), (::_tcslen(CPCDMSyncStore::GetCLSID()) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)_T("PCDMSync"), (::_tcslen(_T("PCDMSync")) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey, _T("Display Name"), 0, REG_SZ, (LPBYTE)CPCDMSyncStore::GetDesc() , (::_tcslen(CPCDMSyncStore::GetDesc()) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey);
::RegCloseKey(hKey1);
hKey = NULL;
hKey1 = NULL;
//
// ==== Begin Folder(s) registration ====
//
// TODO: If you add new folders to the store, you will also
// have to register those folders under WinCE.
//
// + Create provider key HKLM\SOFTWARE\Microsoft\Windows CE Services\Services\Synchronization\Objects\PCDMSync
// + Set default value HKLM\SOFTWARE\Microsoft\Windows CE Services\Services\Synchronization\Objects\PCDMSync\PCDMSync
// + Create "display name" key HKCR\PCDMSync.PCDMSync\Display Name
// + Set default value HKCR\PCDMSync.PCDMSync\DisplayName - PCDMSync
// + Set Display Name HKCR\PCDMSync.PCDMSync\DisplayName - PCDMSync
// + Set Plural Name HKCR\PCDMSync.PCDMSync\PluralName - PCDM CD Itemss
// + Set Store Name HKCR\PCDMSync.PCDMSync\Store - AWL.PCDMSync
lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows CE Services\\Services\\Synchronization\\Objects"), 0, KEY_ALL_ACCESS, &hKey);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegCreateKeyEx(hKey, _T("PCDMSync"), 0, _T(""), 0, KEY_ALL_ACCESS, NULL, &hKey1, NULL);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, NULL, 0, REG_SZ, (LPBYTE)_T("PCDMSync Object"), (::_tcslen(_T("PCDMSync Object")) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, _T("Display Name"), 0, REG_SZ, (LPBYTE)_T("PCDMSync"), (::_tcslen(_T("PCDMSync")) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, _T("Plural Name"), 0, REG_SZ, (LPBYTE)_T("PCDM CD Items"), (::_tcslen(_T("PCDM CD Items")) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegSetValueEx(hKey1, _T("Store"), 0, REG_SZ, (LPBYTE)CPCDMSyncStore::GetProgId(), (::_tcslen(CPCDMSyncStore::GetProgId()) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
::_stprintf(szTemp, _T("%s, -%d"), szFileName, IDI_PCDMSYNC_ICON);
lRet = ::RegSetValueEx(hKey1, _T("DefaultIcon"), 0, REG_SZ, (LPBYTE)szTemp, (::_tcslen(szTemp) * sizeof(TCHAR) + 1 * sizeof(TCHAR)));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey);
::RegCloseKey(hKey1);
hKey = NULL;
hKey1= NULL;
//
// ==== End Folder(s) registration ====
//
exit:
if(hKey)
::RegCloseKey(hKey);
if(hKey1)
::RegCloseKey(hKey1);
return HRESULT_FROM_WIN32(lRet);
}
STDAPI DllUnregisterServer(void)
{
//
// + Delete HKCR\CLSID\{XXX} tree
// + Delete HKCR\ProgId\PCDMSync tree
// + Delete HKLM\SOFTWARE\Microsoft\Windows CE Services\Services\Synchronization\Objects\PCDMSync tree
//
long lRet = 0;
HKEY hKey = NULL;
HKEY hKey1 = NULL;
TCHAR szClassName[_MAX_PATH] = "\0";
TCHAR szKeyName[_MAX_PATH] = "\0";
DWORD dwClassName = _MAX_PATH;
DWORD dwKeyName = _MAX_PATH;
lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hKey);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegOpenKeyEx(hKey, CPCDMSyncStore::GetCLSID(), 0, KEY_ALL_ACCESS, &hKey1);
if(lRet != ERROR_SUCCESS)
goto exit;
while(ERROR_NO_MORE_ITEMS != (lRet = ::RegEnumKeyEx(hKey1, 0, szKeyName, &dwKeyName, 0, szClassName, &dwClassName, NULL)))
{
lRet = ::RegDeleteKey(hKey1, szKeyName);
::lstrcpy(szClassName,"\0");
::lstrcpy(szKeyName ,"\0");
dwClassName = _MAX_PATH;
dwKeyName = _MAX_PATH;
}
::RegCloseKey(hKey1);
hKey1 = NULL;
lRet = ::RegDeleteKey(hKey, CPCDMSyncStore::GetCLSID());
if((lRet != ERROR_SUCCESS) && (lRet != ERROR_FILE_NOT_FOUND))
goto exit;
::RegCloseKey(hKey);
hKey = NULL;
lRet = ::RegOpenKeyEx(HKEY_CLASSES_ROOT, CPCDMSyncStore::GetProgId(), 0, KEY_ALL_ACCESS, &hKey);
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegDeleteKey(hKey, _T("CLSID"));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey);
hKey = NULL;
lRet = ::RegDeleteKey(HKEY_CLASSES_ROOT, CPCDMSyncStore::GetProgId());
if(lRet != ERROR_SUCCESS)
goto exit;
lRet = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows CE Services\\Services\\Synchronization\\Objects"), 0, KEY_ALL_ACCESS, &hKey);
if(lRet != ERROR_SUCCESS)
goto exit;
//
// ==== Begin Folder(s) un-registration ====
//
// TODO: If you add new folders to your store, you will also
// need to add code to unregister them here.
//
lRet = ::RegDeleteKey(hKey, _T("PCDMSync"));
if(lRet != ERROR_SUCCESS)
goto exit;
::RegCloseKey(hKey);
hKey = NULL;
// ==== End Folder(s) un-registration ====
exit:
if(hKey)
::RegCloseKey(hKey);
if(hKey1)
::RegCloseKey(hKey1);
return HRESULT_FROM_WIN32(lRet);
}
//
// ======================== MEMBERS ===========================
//
CPCDMSyncModule::CPCDMSyncModule()
{
m_lLocks = 0;
m_lObjs = 0;
m_hInst = NULL;
}
long CPCDMSyncModule::GetLockCount()
{
return (m_lLocks + m_lObjs);
}
long CPCDMSyncModule::LockObject(BOOL fLock)
{
if(fLock)
return ::InterlockedIncrement(&m_lObjs);
else
return ::InterlockedDecrement(&m_lObjs);
}
long CPCDMSyncModule::LockServer(BOOL fLock)
{
if(fLock)
return ::InterlockedIncrement(&m_lLocks);
else
return ::InterlockedDecrement(&m_lLocks);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -