예제 #1
0
int main(int argc,const char* agrv[])
{
	if(argc < 2) {
		printf("Usage: talk_server /AUTOMTION | /REGSERVER | /UNREGSERVER\n");
		return -1;
	}
	const char* szCmdParam = agrv[1];
	
	HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (SUCCEEDED(hr))
	{
		if(0 == u_strcasecmp(agrv[1],"/REGSERVER") || 0 == u_strcasecmp(agrv[1],"-REGSERVER"))
		{
			printf("/REGSERVER\n");
		}
		else if(0 == u_strcasecmp(agrv[1],"/UNREGSERVER") || 0 == u_strcasecmp(agrv[1],"-UNREGSERVER"))
		{
			printf("/UNREGSERVER\n");

		}else if(0 == u_strcasecmp(agrv[1],"/AUTOMATION") || 0 == u_strcasecmp(agrv[1],"-AUTOMATION") 
			|| 0 == u_strcasecmp(agrv[1],"/EMBEDDING") || 0 == u_strcasecmp(agrv[1],"-EMBEDDING") )
		{
			IUnknown *pUnk = NULL;
			DWORD dwReg = 0;
			static tgmtl::class_factory<CTalkManager> cf;
			hr = cf.QueryInterface(IID_IUnknown,(void **)&pUnk);
			if (SUCCEEDED(hr))
			{
				hr = CoRegisterClassObject(CLSID_TalkToStranger,pUnk,CLSCTX_LOCAL_SERVER,REGCLS_MULTIPLEUSE| REGCLS_SUSPENDED,&dwReg);
				if (SUCCEEDED(hr))
					hr = CoResumeClassObjects();

				if(SUCCEEDED(hr)){
					printf("=============================================\n");
					printf("Server is Ready!\n");

					ModuleAddRef();//this line ensure the server running forever

					ModuleServerListen();
				}

				CoRevokeClassObject(dwReg);
			}
			//pUnk->Release();
		}
		else
		{
#ifdef WIN32
			MessageBoxA(NULL,"UNKNOWN PARAMS","Test",MB_OK);
#endif
		}
		
		CoUninitialize();
	}
	return hr;
}
CoFoldersMonitor::CoFoldersMonitor(IUnknown *pUnkOuter)
	: com::base::CUnknown(pUnkOuter)
	, m_typeInfo(nullptr)
	, m_cStrongLocks(0)
	, m_watcher()
	, m_hWorkerThread(nullptr)
	, m_workerThreadId(0)
	, m_hStopWorker(nullptr)
{
	//
	m_hStopWorker = ::CreateEvent(nullptr, TRUE, FALSE, nullptr);
	//
	ModuleAddRef();
}
예제 #3
0
/*----------------------------------------------------------------------------------------------
	This does the real work for DllMain. This gets called whether or not you use MFC.
----------------------------------------------------------------------------------------------*/
BOOL ModuleEntry::DllMain(HMODULE hmod, DWORD dwReason)
{
	bool fRet = true;
	ModuleAddRef();
	HRESULT hr;

#ifndef WIN32
#ifdef PR_SET_PTRACER
	// PR_SET_PTRACER might not be defined on all versions
	// Since Ubuntu 10.10 a normal user usually isn't allowed to use PTRACE anymore which
	// prevents call stacks and asserts from working properly. A workaround is to allow it
	// specifically for the current process (see /etc/sysctl.d/10-ptrace.conf)
	prctl(PR_SET_PTRACER, getpid(), 0, 0, 0);
#endif
#endif

	switch (dwReason)
	{
#ifdef WIN32
	case DLL_PROCESS_ATTACH:
		s_hmod = hmod;
		hr = ModuleProcessAttach();
		if (FAILED(hr))
			fRet = false;
		break;

	case DLL_THREAD_ATTACH:
		Assert(hmod == s_hmod);
		hr = ModuleThreadAttach();
		if (FAILED(hr))
			fRet = false;
		break;

	case DLL_PROCESS_DETACH:
		Assert(hmod == s_hmod);
		hr = ModuleProcessDetach();
		if (FAILED(hr))
			fRet = false;

#ifdef _MSC_VER
		// Memory leak detection at shutdown can be unreliable when COM objects are used in
		// managed code.

		// Check for memory leaks.
		//_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
#endif
		break;

	case DLL_THREAD_DETACH:
		Assert(hmod == s_hmod);
		hr = ModuleThreadDetach();
		if (FAILED(hr))
			fRet = false;
		break;
#endif //WIN32

	default:
		fRet = false;
		break;
	}

	ModuleRelease();
	return fRet;
}