OSDN Git Service

Do not use ITfUIElementMgr nor register ITfUIElementSink on XP as it can cause corru...
authorMichael Curran <mick@kulgan.net>
Tue, 14 Aug 2012 00:54:09 +0000 (10:54 +1000)
committerMichael Curran <mick@kulgan.net>
Tue, 14 Aug 2012 00:54:09 +0000 (10:54 +1000)
nvdaHelper/remote/tsf.cpp

index 0511ff7..7d18fc9 100644 (file)
@@ -26,6 +26,9 @@ http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 \r
 using namespace std;\r
 \r
+bool isUIElementMgrSafe=false;\r
+\r
+\r
 bool fetchRangeExtent(ITfRange* pRange, long* start, ULONG* length) {\r
        HRESULT res=S_OK;\r
        if(!pRange) return false;\r
@@ -170,12 +173,13 @@ bool TsfSink::Initialize() {
                        hr = src->AdviseSink(IID_ITfActiveLanguageProfileNotifySink,\r
                                (ITfActiveLanguageProfileNotifySink*)this, &mLangProfCookie);\r
                }\r
-               if (hr == S_OK) {\r
-                       hr = mpThreadMgr->QueryInterface(IID_ITfUIElementMgr,(void**)&mpUIElementMgr);\r
-               }\r
-               if (hr == S_OK) {\r
-                       hr = src->AdviseSink(IID_ITfUIElementSink,\r
-                       (ITfUIElementSink*)this, &mUIElementCookie);\r
+               if(isUIElementMgrSafe) {\r
+                       if (hr == S_OK) {\r
+                               hr = mpThreadMgr->QueryInterface(IID_ITfUIElementMgr,(void**)&mpUIElementMgr);\r
+                       }\r
+                       if (hr == S_OK) {\r
+                               hr = src->AdviseSink(IID_ITfUIElementSink,(ITfUIElementSink*)this, &mUIElementCookie);\r
+                       }\r
                }\r
                src->Release();\r
                src = NULL;\r
@@ -582,6 +586,8 @@ TsfSink* fetchCurrentTsfSink() {
 }\r
 \r
 void TSF_inProcess_initialize() {\r
+       //Allow use of UIElementMgr on Vista and higher (crashes things on XP)\r
+       if((GetVersion()&0xff)>5) isUIElementMgrSafe=true;\r
        // Initialize TLS and use window hook to create TSF sink in each thread\r
        gTsfIndex = TlsAlloc();\r
        if (gTsfIndex != TLS_OUT_OF_INDEXES)\r