// コマンドライン引数からCOMサーバー登録/削除を行う static int RegisterCOMServer(int &nRet, bool &bRun, bool &bAutomation, bool &bTray) { HRESULT hRes; TCHAR szTokens[] = _T("-/"); LPCTSTR lpszToken = _Module.FindOneOf(::GetCommandLine(), szTokens); while (lpszToken) { CString strToken = Misc::GetStrWord(lpszToken, &lpszToken); if (strToken.CompareNoCase(_T("UnregServer") ) == 0) { nRet = _Module.UnregisterServer(); nRet = UnRegisterCLSIDInCategory(CLSID_API, CATID_SafeForInitializing); if ( FAILED(nRet) ) return nRet; nRet = UnRegisterCLSIDInCategory(CLSID_API, CATID_SafeForScripting); if ( FAILED(nRet) ) return nRet; ::MessageBox(NULL, _T("COMサーバー削除しました。"), _T("unDonut"), 0); bRun = false; break; } else if (strToken.CompareNoCase(_T("RegServer") ) == 0) { nRet = _Module.RegisterServer(TRUE, &CLSID_API); if (nRet == S_OK) { // Mark the control as safe for initializing. hRes = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data"); if ( FAILED(hRes) ) return hRes; hRes = RegisterCLSIDInCategory(CLSID_API, CATID_SafeForInitializing); if ( FAILED(hRes) ) return hRes; // Mark the control as safe for scripting. hRes = CreateComponentCategory(CATID_SafeForScripting, L"Controls that are safely scriptable"); if ( FAILED(hRes) ) return hRes; hRes = RegisterCLSIDInCategory(CLSID_API, CATID_SafeForScripting); if ( FAILED(hRes) ) return hRes; ::MessageBox(NULL, _T("COMサーバー登録しました。"), _T("unDonut"), 0); } else ::MessageBox(NULL, _T("COMサーバー登録失敗しました。"), _T("unDonut"), 0); bRun = false; break; } else if (strToken.CompareNoCase(_T("Automation")) == 0 || (strToken.CompareNoCase(_T("Embedding" )) == 0) ) { bAutomation = true; break; #if 1 //+++ } else if (strToken.CompareNoCase(_T("tray") ) == 0) { bTray = true; break; #endif } lpszToken = _Module.FindOneOf(lpszToken, szTokens); } return S_OK; }
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) { HRESULT hRes = ::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); ATLASSERT(SUCCEEDED(hRes)); #if (_WIN32_IE >= 0x0300) INITCOMMONCONTROLSEX iccx; iccx.dwSize = sizeof(iccx); iccx.dwICC = ICC_BAR_CLASSES; // change to support other controls BOOL bRet = ::InitCommonControlsEx(&iccx); bRet; ATLASSERT(bRet); #else ::InitCommonControls(); #endif hRes = _Module.Init(ObjectMap, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = 0; TCHAR szTokens[] = _T("-/"); bool bRun = true; bool bAutomation = false; LPCTSTR lpszToken = _Module.FindOneOf(::GetCommandLine(), szTokens); while(lpszToken != NULL) { if(lstrcmpi(lpszToken, _T("UnregServer")) == 0) { _Module.UpdateRegistryFromResource(IDR_DP, FALSE); nRet = _Module.UnregisterServer(TRUE); bRun = false; break; } else if(lstrcmpi(lpszToken, _T("RegServer")) == 0) { // Already registered... bRun = false; break; } else if((lstrcmpi(lpszToken, _T("Automation")) == 0) || (lstrcmpi(lpszToken, _T("Embedding")) == 0)) { bAutomation = true; break; } lpszToken = _Module.FindOneOf(lpszToken, szTokens); } if(bRun) { if(!bAutomation && CSingleInstance::Instance().IsAlreadyRunning()) { // Only attempt this if manually started, i.e. allow automation // clients to start multiple instances, for what it's worth if(!CSingleInstance::Instance().ActivateRunningInstance()) { MessageBox(NULL, _T("Failed to activate running instance of Developer Playground.\nPlease use Task Manager or similar to terminate rogue DP processes."), _T("DP Error"), MB_OK); } } else { if(!bAutomation) { // Auto-register self at startup, if manually started _Module.UpdateRegistryFromResource(IDR_DP, TRUE); nRet = _Module.RegisterServer(TRUE); } DWORD dwThreadId = 0; SmartHandle hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); SmartHandle hThread = CreateThread(NULL, 0, FactoryThreadProc, hEvent, 0, &dwThreadId); _Module.StartMonitor(); if(bAutomation) { CMessageLoop theLoop; nRet = theLoop.Run(); } else { nRet = Run(lpstrCmdLine, nCmdShow); } SetEvent(hEvent); ::Sleep(_Module.m_dwPause); } } _Module.Term(); ::CoUninitialize(); return nRet; }