⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcdmsync.cpp

📁 《Windows CE 权威指南》(作者:(美)CHRIS MUENCH
💻 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 + -