OSDN Git Service

Reduce invocations of CoInitializeEx
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sun, 8 Oct 2017 12:58:46 +0000 (21:58 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sun, 1 Apr 2018 07:34:34 +0000 (16:34 +0900)
xkeymacsdll/TSFHandler.cpp
xkeymacsdll/xkeymacsdll.cpp

index 2b54fa9..5392c4e 100644 (file)
@@ -32,15 +32,19 @@ void TSFHandler::InitSink()
 {\r
        if (TLS::GetTSFHandler())\r
                return;\r
-       HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\r
-       if (FAILED(hr)) {\r
-               DebugLog("CoInitializeEx failed.");\r
-               return;\r
-       }\r
-       if (hr == S_FALSE)\r
-               CoUninitialize();\r
        ITfThreadMgr *thread;\r
-       if (FAILED(CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&thread)))) {\r
+       HRESULT hr = CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&thread));\r
+       if (hr == CO_E_NOTINITIALIZED) {\r
+               hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\r
+               if (FAILED(hr)) {\r
+                       DebugLog("CoInitializeEx failed.");\r
+                       return;\r
+               }\r
+               if (hr == S_FALSE)\r
+                       CoUninitialize();\r
+               hr = CoCreateInstance(CLSID_TF_ThreadMgr, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&thread));\r
+       }\r
+       if (FAILED(hr)) {\r
                DebugLog("CoCreateInstance for ThreadMgr failed.");\r
                return;\r
        }\r
index 45ddeab..df2d078 100644 (file)
@@ -243,7 +243,6 @@ void CXkeymacsDll::ShowHookState()
 LRESULT CALLBACK CXkeymacsDll::CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)\r
 {\r
        SetKeyboardHook();\r
-       TSFHandler::InitSink();\r
        if (nCode >= 0) {\r
                const CWPSTRUCT *cwps = reinterpret_cast<CWPSTRUCT *>(lParam);\r
                switch (cwps->message) {\r
@@ -341,6 +340,7 @@ LRESULT CALLBACK CXkeymacsDll::ShellProc(int nCode, WPARAM wParam, LPARAM lParam
 void CXkeymacsDll::InitKeyboardProc()\r
 {\r
        AppName::Init();\r
+       TSFHandler::InitSink();\r
        if (m_CurrentConfig == NULL ||\r
                        _tcsnicmp(m_CurrentConfig->AppName, AppName::GetAppName(), 0xF) ||      // PROCESSENTRY32 has only 0xF bytes of Name\r
                        !CUtils::IsMatchWindowText(m_CurrentConfig->WindowText)) {\r