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(); }
/*---------------------------------------------------------------------------------------------- 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; }