Piotr Caban : oleaut32: Added VT_BSTR handling to ctl2_add_default_value.
Alexandre Julliard
julliard at winehq.org
Tue Feb 23 11:17:21 CST 2010
Module: wine
Branch: master
Commit: e68c7cf70969afe8972f9d9b4b75810761baa728
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e68c7cf70969afe8972f9d9b4b75810761baa728
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Feb 22 23:13:14 2010 +0100
oleaut32: Added VT_BSTR handling to ctl2_add_default_value.
---
dlls/oleaut32/tests/typelib.c | 8 ++++++++
dlls/oleaut32/typelib2.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c
index 9e5d91d..523f33c 100644
--- a/dlls/oleaut32/tests/typelib.c
+++ b/dlls/oleaut32/tests/typelib.c
@@ -970,6 +970,7 @@ if(use_midl_tlb) {
static void test_CreateTypeLib(void) {
static OLECHAR interface1W[] = {'i','n','t','e','r','f','a','c','e','1',0};
+ static WCHAR defaultW[] = {'d','e','f','a','u','l','t',0x3213,0};
char filename[MAX_PATH];
WCHAR filenameW[MAX_PATH];
@@ -1075,6 +1076,13 @@ static void test_CreateTypeLib(void) {
hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
ok(hres == S_OK, "got %08x\n", hres);
+ elemdesc[0].tdesc.vt = VT_BSTR;
+ elemdesc[1].tdesc.vt = VT_BSTR;
+ V_VT(¶mdescex.varDefaultValue) = VT_BSTR;
+ V_BSTR(¶mdescex.varDefaultValue) = SysAllocString(defaultW);
+ hres = ICreateTypeInfo_AddFuncDesc(createti, 3, &funcdesc);
+ ok(hres == S_OK, "got %08x\n", hres);
+
ICreateTypeInfo_Release(createti);
hres = ICreateTypeLib_CreateTypeInfo(createtl, interface1W, TKIND_INTERFACE, &createti);
diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c
index 0a4a8bb..f392c1d 100644
--- a/dlls/oleaut32/typelib2.c
+++ b/dlls/oleaut32/typelib2.c
@@ -1190,6 +1190,44 @@ static HRESULT ctl2_add_default_value(
memcpy(&This->typelib_segment_data[MSFT_SEG_CUSTDATA][*encoded_value], data, 8);
return S_OK;
}
+ case VT_BSTR: {
+ /* Construct the data */
+ int i, len = (6+SysStringLen(V_BSTR(&v))+3) & ~0x3;
+ char *data = HeapAlloc(GetProcessHeap(), 0, len);
+
+ if(!data)
+ return E_OUTOFMEMORY;
+
+ *((unsigned short*)data) = arg_type;
+ *((unsigned*)(data+2)) = SysStringLen(V_BSTR(&v));
+ for(i=0; i<SysStringLen(V_BSTR(&v)); i++) {
+ if(V_BSTR(&v)[i] <= 0x7f)
+ data[i+6] = V_BSTR(&v)[i];
+ else
+ data[i+6] = '?';
+ }
+ WideCharToMultiByte(CP_ACP, 0, V_BSTR(&v), SysStringLen(V_BSTR(&v)), &data[6], len-6, NULL, NULL);
+ for(i=6+SysStringLen(V_BSTR(&v)); i<len; i++)
+ data[i] = 0x57;
+
+ /* Check if the data was already allocated */
+ for(*encoded_value=0; *encoded_value<=This->typelib_segdir[MSFT_SEG_CUSTDATA].length-len; *encoded_value+=4)
+ if(!memcmp(&This->typelib_segment_data[MSFT_SEG_CUSTDATA][*encoded_value], data, len)) {
+ HeapFree(GetProcessHeap(), 0, data);
+ return S_OK;
+ }
+
+ /* Allocate the data */
+ *encoded_value = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATA, len, 0);
+ if(*encoded_value == -1) {
+ HeapFree(GetProcessHeap(), 0, data);
+ return E_OUTOFMEMORY;
+ }
+
+ memcpy(&This->typelib_segment_data[MSFT_SEG_CUSTDATA][*encoded_value], data, len);
+ HeapFree(GetProcessHeap(), 0, data);
+ return S_OK;
+ }
default:
FIXME("Argument type not yet handled\n");
return E_NOTIMPL;
More information about the wine-cvs
mailing list