Fix PropVariantCopy for VT_LPSTR and VT_LPWSTR

Robert Shearman rob at codeweavers.com
Mon Sep 6 08:48:11 CDT 2004


Changelog:
- Fix PropVariantCopy for VT_LPSTR and VT_LPWSTR.
- Test case VT_BSTR, VT_LPSTR and VT_LPWSTR.

-------------- next part --------------
Index: wine/dlls/ole32/ole2.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/ole2.c,v
retrieving revision 1.53
diff -u -p -r1.53 ole2.c
--- wine/dlls/ole32/ole2.c	3 Sep 2004 01:04:38 -0000	1.53
+++ wine/dlls/ole32/ole2.c	6 Sep 2004 13:44:39 -0000
@@ -1,4 +1,3 @@
-
 /*
  *	OLE2 library
  *
@@ -2426,8 +2425,11 @@ HRESULT WINAPI PropVariantClear(PROPVARI
         CoTaskMemFree(pvar->u.blob.pBlobData);
         break;
     case VT_BSTR:
-        FIXME("Need to load OLEAUT32 for SysFreeString\n");
-        /* SysFreeString(pvar->u.bstrVal); */
+        if (pvar->u.bstrVal)
+        {
+            FIXME("Need to load OLEAUT32 for SysFreeString\n");
+            /* SysFreeString(pvar->u.bstrVal); */
+        }
         break;
    case VT_CF:
         if (pvar->u.pclipdata)
@@ -2496,13 +2498,13 @@ HRESULT WINAPI PropVariantCopy(PROPVARIA
         break;
     case VT_LPSTR:
         len = strlen(pvarSrc->u.pszVal);
-        pvarDest->u.pszVal = CoTaskMemAlloc(len);
-        CopyMemory(pvarDest->u.pszVal, pvarSrc->u.pszVal, len);
+        pvarDest->u.pszVal = CoTaskMemAlloc((len+1)*sizeof(CHAR));
+        CopyMemory(pvarDest->u.pszVal, pvarSrc->u.pszVal, (len+1)*sizeof(CHAR));
         break;
     case VT_LPWSTR:
         len = lstrlenW(pvarSrc->u.pwszVal);
-        pvarDest->u.pwszVal = CoTaskMemAlloc(len);
-        CopyMemory(pvarDest->u.pwszVal, pvarSrc->u.pwszVal, len);
+        pvarDest->u.pwszVal = CoTaskMemAlloc((len+1)*sizeof(WCHAR));
+        CopyMemory(pvarDest->u.pwszVal, pvarSrc->u.pwszVal, (len+1)*sizeof(WCHAR));
         break;
     case VT_BLOB:
     case VT_BLOB_OBJECT:
Index: wine/dlls/ole32/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/ole32/tests/Makefile.in,v
retrieving revision 1.2
diff -u -p -r1.2 Makefile.in
--- wine/dlls/ole32/tests/Makefile.in	3 Sep 2004 01:04:38 -0000	1.2
+++ wine/dlls/ole32/tests/Makefile.in	6 Sep 2004 13:44:39 -0000
@@ -3,7 +3,7 @@ TOPOBJDIR = ../../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 TESTDLL   = ole32.dll
-IMPORTS   = ole32 kernel32 ntdll
+IMPORTS   = oleaut32 ole32 kernel32 ntdll
 EXTRALIBS = -luuid
 
 CTESTS = \
Index: wine/dlls/ole32/tests/propvariant.c
===================================================================
RCS file: /home/wine/wine/dlls/ole32/tests/propvariant.c,v
retrieving revision 1.1
diff -u -p -r1.1 propvariant.c
--- wine/dlls/ole32/tests/propvariant.c	3 Sep 2004 01:04:38 -0000	1.1
+++ wine/dlls/ole32/tests/propvariant.c	6 Sep 2004 13:44:39 -0000
@@ -18,12 +18,16 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
 #include "windows.h"
 /* not present in Wine yet */
 /*#include "propidl.h"*/
 WINOLEAPI PropVariantClear(PROPVARIANT*);
+WINOLEAPI PropVariantCopy(PROPVARIANT*, const PROPVARIANT*);
 
 #include "wine/test.h"
+#include "wine/unicode.h"
 
 struct valid_mapping
 {
@@ -160,7 +164,46 @@ static void test_validtypes()
     }
 }
 
+static void test_copy()
+{
+    static const char szTestString[] = "Test String";
+    static const WCHAR wszTestString[] = {'T','e','s','t',' ','S','t','r','i','n','g',0};
+    PROPVARIANT propvarSrc;
+    PROPVARIANT propvarDst;
+    HRESULT hr;
+
+    propvarSrc.vt = VT_BSTR;
+    propvarSrc.u.bstrVal = SysAllocString(wszTestString);
+
+    hr = PropVariantCopy(&propvarDst, &propvarSrc);
+    ok(hr == S_OK, "PropVariantCopy(...VT_BSTR...) failed\n");
+    ok(!strcmpW(propvarSrc.u.bstrVal, propvarDst.u.bstrVal), "BSTR not copied properly\n");
+    hr = PropVariantClear(&propvarSrc);
+    ok(hr == S_OK, "PropVariantClear(...VT_BSTR...) failed\n");
+    hr = PropVariantClear(&propvarDst);
+    ok(hr == S_OK, "PropVariantClear(...VT_BSTR...) failed\n");
+
+    propvarSrc.vt = VT_LPWSTR;
+    propvarSrc.u.pwszVal = (LPWSTR)wszTestString;
+    hr = PropVariantCopy(&propvarDst, &propvarSrc);
+    ok(hr == S_OK, "PropVariantCopy(...VT_LPWSTR...) failed\n");
+    ok(!strcmpW(propvarSrc.u.pwszVal, propvarDst.u.pwszVal), "Wide string not copied properly\n");
+    hr = PropVariantClear(&propvarDst);
+    ok(hr == S_OK, "PropVariantClear(...VT_LPWSTR...) failed\n");
+    memset(&propvarSrc, 0, sizeof(propvarSrc));
+
+    propvarSrc.vt = VT_LPSTR;
+    propvarSrc.u.pszVal = (LPSTR)szTestString;
+    hr = PropVariantCopy(&propvarDst, &propvarSrc);
+    ok(hr == S_OK, "PropVariantCopy(...VT_LPSTR...) failed\n");
+    ok(!strcmp(propvarSrc.u.pszVal, propvarDst.u.pszVal), "String not copied properly\n");
+    hr = PropVariantClear(&propvarDst);
+    ok(hr == S_OK, "PropVariantClear(...VT_LPSTR...) failed\n");
+    memset(&propvarSrc, 0, sizeof(propvarSrc));
+}
+
 START_TEST(propvariant)
 {
     test_validtypes();
+    test_copy();
 }


More information about the wine-patches mailing list