PATCH: Re: Problem with Access-mdb/DAO

Marcus Meissner marcus at jet.franken.de
Thu Jan 8 16:52:11 CST 2004


> Ok, I just tried and changed the code a bit. This now works with
> normal wide char strings as well as binary data (may as well be an
> ASCII string) with type BSTR. Though it works for me it may not
> be the right solution.

It is.

I have changed all similar constructs to your code.

I have also added a testcase for VariantCopy().

Ciao, Marcus

Changelog:
	Copy BSTRs byte wise.
	Added a testcase for byte wise copy of VT_BSTR variant with VariantCopy().

Index: safearray.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/safearray.c,v
retrieving revision 1.31
diff -u -r1.31 safearray.c
--- dlls/oleaut32/safearray.c	31 Dec 2003 18:58:25 -0000	1.31
+++ dlls/oleaut32/safearray.c	8 Jan 2004 22:45:31 -0000
@@ -383,7 +386,7 @@
       {
         if (*lpBstr)
         {
-          *lpDest = SysAllocStringLen(*lpBstr, SysStringLen(*lpBstr));
+          *lpDest = SysAllocStringByteLen((char*)*lpBstr, SysStringByteLen(*lpBstr));
           if (!*lpDest)
             return E_OUTOFMEMORY;
         }
@@ -887,7 +893,7 @@
 
         if (lpBstr)
         {
-          *lpDest = SysAllocStringLen(lpBstr, SysStringLen(lpBstr));
+          *lpDest = SysAllocStringByteLen((char*)lpBstr, SysStringByteLen(lpBstr));
           if (!*lpDest)
             hRet = E_OUTOFMEMORY;
         }
@@ -968,7 +974,7 @@
 
         if (*lpBstr)
         {
-          *lpDest = SysAllocStringLen(*lpBstr, SysStringLen(*lpBstr));
+          *lpDest = SysAllocStringByteLen((char*)*lpBstr, SysStringByteLen(*lpBstr));
           if (!*lpBstr)
             hRet = E_OUTOFMEMORY;
         }
Index: variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.83
diff -u -r1.83 variant.c
--- dlls/oleaut32/variant.c	6 Jan 2004 22:08:34 -0000	1.83
+++ dlls/oleaut32/variant.c	8 Jan 2004 22:45:36 -0000
@@ -727,7 +729,7 @@
       {
         if (V_BSTR(pvargSrc))
         {
-          V_BSTR(pvargDest) = SysAllocStringLen(V_BSTR(pvargSrc), SysStringLen(V_BSTR(pvargSrc)));
+          V_BSTR(pvargDest) = SysAllocStringByteLen((char*)V_BSTR(pvargSrc), SysStringByteLen(V_BSTR(pvargSrc)));
           if (!V_BSTR(pvargDest))
             hres = E_OUTOFMEMORY;
         }
@@ -852,7 +855,7 @@
   else if (V_VT(pSrc) == (VT_BSTR|VT_BYREF))
   {
     /* Native doesn't check that *V_BSTRREF(pSrc) is valid */
-    V_BSTR(pvargDest) = SysAllocStringLen(*V_BSTRREF(pSrc), SysStringLen(*V_BSTRREF(pSrc)));
+    V_BSTR(pvargDest) = SysAllocStringByteLen((char*)*V_BSTRREF(pSrc), SysStringByteLen(*V_BSTRREF(pSrc)));
   }
   else if (V_VT(pSrc) == (VT_RECORD|VT_BYREF))
   {
Index: tests/vartype.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/tests/vartype.c,v
retrieving revision 1.4
diff -u -r1.4 vartype.c
--- dlls/oleaut32/tests/vartype.c	6 Jan 2004 22:08:34 -0000	1.4
+++ dlls/oleaut32/tests/vartype.c	8 Jan 2004 22:45:39 -0000
@@ -4607,6 +4607,7 @@
   const OLECHAR szTest[10] = { 'T','e','s','t','\0' };
   const CHAR szTestA[6] = { 'T','e','s','t','\0','?' };
   BSTR str;
+  HRESULT hres;
 
   str = SysAllocStringByteLen(szTestA, 0x80000000);
   ok (str == NULL, "Expected NULL, got %p\n", str);
@@ -4640,9 +4641,20 @@
   {
     const CHAR szTestTruncA[4] = { 'T','e','s','\0' };
     LPINTERNAL_BSTR bstr = Get(str);
+    VARIANT vt1, vt2;
 
     ok (bstr->dwLen == 3, "Expected 3, got %ld\n", bstr->dwLen);
     ok (!lstrcmpA((LPCSTR)bstr->szString, szTestTruncA), "String different\n");
+
+    V_VT(&vt1) = VT_BSTR;
+    V_BSTR(&vt1) = str;
+    V_VT(&vt2) = VT_EMPTY;
+    hres = VariantCopy(&vt2, &vt1);
+    ok (hres == S_OK,"Failed to copy binary bstring with hres 0x%08lx\n", hres);
+    bstr = Get(V_BSTR(&vt2));
+    ok (bstr->dwLen == 3, "Expected 3, got %ld\n", bstr->dwLen);
+    ok (!lstrcmpA((LPCSTR)bstr->szString, szTestTruncA), "String different\n");
+
     SysFreeString(str);
   }
 



More information about the wine-patches mailing list