OSDN Git Service

Changes to make NVDA work again on Windows XP with no service pack: release-2010.2beta2
authorJames Teh <jamie@jantrid.net>
Wed, 29 Sep 2010 02:52:00 +0000 (12:52 +1000)
committerJames Teh <jamie@jantrid.net>
Wed, 29 Sep 2010 02:52:00 +0000 (12:52 +1000)
* NVDAHelper: winIPCUtils: generateDesktopSpecificNamespace(): wcscpy_s() isn't available in Windows XP no sp, so use wcsncpy() instead.
* IAccessible NVDAObject: findOverlayClasses(): msftedit.dll isn't available on Windows XP no sp, so handle this gracefully when trying to retrieve IID_ITextServices. Also, only ever attempt to retrieve it once and cache the result for later use, which should be more efficient.

Fixes #908.

source/NVDAHelper/common/winIPCUtils.cpp
source/NVDAObjects/IAccessible/__init__.py

index 7040211..66af7f2 100644 (file)
@@ -30,6 +30,6 @@ int generateDesktopSpecificNamespace(wchar_t* buf, int cch) {
        s<<sessionId<<"."<<deskName;\r
        int len=s.str().length();\r
        if(!buf||(cch<=0)) return len;\r
-       wcscpy_s(buf,cch,s.str().c_str());\r
+       wcsncpy(buf,s.str().c_str(),cch);\r
        return min(len,cch);\r
 }\r
index 148bf55..03febd7 100644 (file)
@@ -402,17 +402,23 @@ the NVDAObject for IAccessible
                        MSHTML.findExtraIAccessibleOverlayClasses(self, clsList)\r
 \r
                #Support for Windowless richEdit\r
-               pIidITextServices=ctypes.cast(ctypes.windll.msftedit.IID_ITextServices,ctypes.POINTER(GUID))\r
-               try:\r
-                       pDoc=self.IAccessibleObject.QueryInterface(IServiceProvider).QueryService(pIidITextServices.contents,ITextDocument)\r
-               except COMError:\r
-                       pDoc=None\r
-               if pDoc:\r
-                       self._ITextDocumentObject=pDoc\r
-                       self.useITextDocumentSupport=True\r
-                       self.editAPIVersion=2\r
-                       from NVDAObjects.window.edit import Edit\r
-                       clsList.append(Edit)\r
+               if not hasattr(IAccessible,"IID_ITextServices"):\r
+                       try:\r
+                               IAccessible.IID_ITextServices=ctypes.cast(ctypes.windll.msftedit.IID_ITextServices,ctypes.POINTER(GUID)).contents\r
+                       except WindowsError:\r
+                               log.debugWarning("msftedit not available, couldn't retrieve IID_ITextServices")\r
+                               IAccessible.IID_ITextServices=None\r
+               if IAccessible.IID_ITextServices:\r
+                       try:\r
+                               pDoc=self.IAccessibleObject.QueryInterface(IServiceProvider).QueryService(IAccessible.IID_ITextServices,ITextDocument)\r
+                       except COMError:\r
+                               pDoc=None\r
+                       if pDoc:\r
+                               self._ITextDocumentObject=pDoc\r
+                               self.useITextDocumentSupport=True\r
+                               self.editAPIVersion=2\r
+                               from NVDAObjects.window.edit import Edit\r
+                               clsList.append(Edit)\r
 \r
                #Window root IAccessibles\r
                if self.event_objectID in (None,winUser.OBJID_WINDOW) and self.event_childID==0 and self.IAccessibleRole==oleacc.ROLE_SYSTEM_WINDOW:\r