diff --git a/dlls/oleaut32/Makefile.in b/dlls/oleaut32/Makefile.in index aa787a219a1..76d7a5b84fb 100644 --- a/dlls/oleaut32/Makefile.in +++ b/dlls/oleaut32/Makefile.in @@ -16,7 +16,6 @@ C_SRCS = \ connpt.c \ dispatch.c \ hash.c \ - ole2disp.c \ oleaut.c \ olefont.c \ olepicture.c \ @@ -27,7 +26,9 @@ C_SRCS = \ typelib.c \ variant.c -C_SRCS16 = typelib16.c +C_SRCS16 = \ + ole2disp.c \ + typelib16.c RC_SRCS = version.rc diff --git a/dlls/oleaut32/dispatch.c b/dlls/oleaut32/dispatch.c index 7cc7b2da054..61143e4f69f 100644 --- a/dlls/oleaut32/dispatch.c +++ b/dlls/oleaut32/dispatch.c @@ -154,3 +154,29 @@ HRESULT WINAPI DispGetParam( if (hr == DISP_E_TYPEMISMATCH) *puArgErr = pos; return hr; } + +/****************************************************************************** + * CreateStdDispatch [OLEAUT32.32] + */ +HRESULT WINAPI CreateStdDispatch( + IUnknown* punkOuter, + void* pvThis, + ITypeInfo* ptinfo, + IUnknown** ppunkStdDisp) +{ + FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, + ppunkStdDisp); + return E_NOTIMPL; +} + +/****************************************************************************** + * CreateDispTypeInfo [OLEAUT32.31] + */ +HRESULT WINAPI CreateDispTypeInfo( + INTERFACEDATA *pidata, + LCID lcid, + ITypeInfo **pptinfo) +{ + FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); + return 0; +} diff --git a/dlls/oleaut32/ole2disp.c b/dlls/oleaut32/ole2disp.c index c3803d4d73f..b06c61664e3 100644 --- a/dlls/oleaut32/ole2disp.c +++ b/dlls/oleaut32/ole2disp.c @@ -84,21 +84,6 @@ BSTR16 WINAPI SysAllocString16(LPCOLESTR16 in) return out; } -/****************************************************************************** - * SysAllocString [OLEAUT32.2] - * - * MSDN (October 2001) states that this returns a NULL value if the argument - * is a zero-length string. This does not appear to be true; certainly it - * returns a value under Win98 (Oleaut32.dll Ver 2.40.4515.0) - */ -BSTR WINAPI SysAllocString(LPCOLESTR in) -{ - if (!in) return 0; - - /* Delegate this to the SysAllocStringLen32 method. */ - return SysAllocStringLen(in, lstrlenW(in)); -} - /****************************************************************************** * SysReallocString [OLE2DISP.3] */ @@ -110,31 +95,6 @@ INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPCOLESTR16 in) return 1; } -/****************************************************************************** - * SysReAllocString [OLEAUT32.3] - */ -INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in) -{ - /* - * Sanity check - */ - if (old==NULL) - return 0; - - /* - * Make sure we free the old string. - */ - if (*old!=NULL) - SysFreeString(*old); - - /* - * Allocate the new string - */ - *old = SysAllocString(in); - - return 1; -} - /****************************************************************************** * SysAllocStringLen [OLE2DISP.4] */ @@ -158,73 +118,6 @@ BSTR16 WINAPI SysAllocStringLen16(const char *in, int len) return out; } -/****************************************************************************** - * SysAllocStringLen [OLEAUT32.4] - * - * In "Inside OLE, second edition" by Kraig Brockshmidt. In the Automation - * section, he describes the DWORD value placed *before* the BSTR data type. - * he describes it as a "DWORD count of characters". By experimenting with - * a windows application, this count seems to be a DWORD count of bytes in - * the string. Meaning that the count is double the number of wide - * characters in the string. - */ -BSTR WINAPI SysAllocStringLen(const OLECHAR *in, unsigned int len) -{ - DWORD bufferSize; - DWORD* newBuffer; - WCHAR* stringBuffer; - - /* - * Find the length of the buffer passed-in in bytes. - */ - bufferSize = len * sizeof (WCHAR); - - /* - * Allocate a new buffer to hold the string. - * dont't forget to keep an empty spot at the beginning of the - * buffer for the character count and an extra character at the - * end for the NULL. - */ - newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), - 0, - bufferSize + sizeof(WCHAR) + sizeof(DWORD)); - - /* - * If the memory allocation failed, return a null pointer. - */ - if (newBuffer==0) - return 0; - - /* - * Copy the length of the string in the placeholder. - */ - *newBuffer = bufferSize; - - /* - * Skip the byte count. - */ - newBuffer++; - - /* - * Copy the information in the buffer. - * Since it is valid to pass a NULL pointer here, we'll initialize the - * buffer to nul if it is the case. - */ - if (in != 0) - memcpy(newBuffer, in, bufferSize); - else - memset(newBuffer, 0, bufferSize); - - /* - * Make sure that there is a nul character at the end of the - * string. - */ - stringBuffer = (WCHAR*)newBuffer; - stringBuffer[len] = L'\0'; - - return (LPWSTR)stringBuffer; -} - /****************************************************************************** * SysReAllocStringLen [OLE2DISP.5] */ @@ -236,32 +129,6 @@ int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len) return 1; } - -/****************************************************************************** - * SysReAllocStringLen [OLEAUT32.5] - */ -int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len) -{ - /* - * Sanity check - */ - if (old==NULL) - return 0; - - /* - * Make sure we free the old string. - */ - if (*old!=NULL) - SysFreeString(*old); - - /* - * Allocate the new string - */ - *old = SysAllocStringLen(in, len); - - return 1; -} - /****************************************************************************** * SysFreeString [OLE2DISP.6] */ @@ -270,31 +137,6 @@ void WINAPI SysFreeString16(BSTR16 in) BSTR_Free(in); } -/****************************************************************************** - * SysFreeString [OLEAUT32.6] - */ -void WINAPI SysFreeString(BSTR in) -{ - DWORD* bufferPointer; - - /* NULL is a valid parameter */ - if(!in) return; - - /* - * We have to be careful when we free a BSTR pointer, it points to - * the beginning of the string but it skips the byte count contained - * before the string. - */ - bufferPointer = (DWORD*)in; - - bufferPointer--; - - /* - * Free the memory from its "real" origin. - */ - HeapFree(GetProcessHeap(), 0, bufferPointer); -} - /****************************************************************************** * SysStringLen [OLE2DISP.7] */ @@ -303,66 +145,6 @@ int WINAPI SysStringLen16(BSTR16 str) return strlen(BSTR_GetAddr(str)); } -/****************************************************************************** - * SysStringLen [OLEAUT32.7] - * - * The Windows documentation states that the length returned by this function - * is not necessarely the same as the length returned by the _lstrlenW method. - * It is the same number that was passed in as the "len" parameter if the - * string was allocated with a SysAllocStringLen method call. - */ -int WINAPI SysStringLen(BSTR str) -{ - DWORD* bufferPointer; - - if (!str) return 0; - /* - * The length of the string (in bytes) is contained in a DWORD placed - * just before the BSTR pointer - */ - bufferPointer = (DWORD*)str; - - bufferPointer--; - - return (int)(*bufferPointer/sizeof(WCHAR)); -} - -/****************************************************************************** - * SysStringByteLen [OLEAUT32.149] - * - * The Windows documentation states that the length returned by this function - * is not necessarely the same as the length returned by the _lstrlenW method. - * It is the same number that was passed in as the "len" parameter if the - * string was allocated with a SysAllocStringLen method call. - */ -int WINAPI SysStringByteLen(BSTR str) -{ - DWORD* bufferPointer; - - if (!str) return 0; - /* - * The length of the string (in bytes) is contained in a DWORD placed - * just before the BSTR pointer - */ - bufferPointer = (DWORD*)str; - - bufferPointer--; - - return (int)(*bufferPointer); -} - -/****************************************************************************** - * CreateDispTypeInfo [OLEAUT32.31] - */ -HRESULT WINAPI CreateDispTypeInfo( - INTERFACEDATA *pidata, - LCID lcid, - ITypeInfo **pptinfo) -{ - FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo); - return 0; -} - /****************************************************************************** * CreateDispTypeInfo [OLE2DISP.31] */ @@ -389,20 +171,6 @@ HRESULT WINAPI CreateStdDispatch16( return 0; } -/****************************************************************************** - * CreateStdDispatch [OLEAUT32.32] - */ -HRESULT WINAPI CreateStdDispatch( - IUnknown* punkOuter, - void* pvThis, - ITypeInfo* ptinfo, - IUnknown** ppunkStdDisp) -{ - FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo, - ppunkStdDisp); - return E_NOTIMPL; -} - /****************************************************************************** * RegisterActiveObject [OLE2DISP.35] */ @@ -412,140 +180,3 @@ HRESULT WINAPI RegisterActiveObject16( FIXME("(%p,%s,0x%08lx,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister); return E_NOTIMPL; } - -/****************************************************************************** - * OleTranslateColor [OLEAUT32.421] - * - * Converts an OLE_COLOR to a COLORREF. - * See the documentation for conversion rules. - * pColorRef can be NULL. In that case the user only wants to test the - * conversion. - */ -HRESULT WINAPI OleTranslateColor( - OLE_COLOR clr, - HPALETTE hpal, - COLORREF* pColorRef) -{ - COLORREF colorref; - BYTE b = HIBYTE(HIWORD(clr)); - - TRACE("(%08lx, %p, %p):stub\n", clr, hpal, pColorRef); - - /* - * In case pColorRef is NULL, provide our own to simplify the code. - */ - if (pColorRef == NULL) - pColorRef = &colorref; - - switch (b) - { - case 0x00: - { - if (hpal != 0) - *pColorRef = PALETTERGB(GetRValue(clr), - GetGValue(clr), - GetBValue(clr)); - else - *pColorRef = clr; - - break; - } - - case 0x01: - { - if (hpal != 0) - { - PALETTEENTRY pe; - /* - * Validate the palette index. - */ - if (GetPaletteEntries(hpal, LOWORD(clr), 1, &pe) == 0) - return E_INVALIDARG; - } - - *pColorRef = clr; - - break; - } - - case 0x02: - *pColorRef = clr; - break; - - case 0x80: - { - int index = LOBYTE(LOWORD(clr)); - - /* - * Validate GetSysColor index. - */ - if ((index < COLOR_SCROLLBAR) || (index > COLOR_GRADIENTINACTIVECAPTION)) - return E_INVALIDARG; - - *pColorRef = GetSysColor(index); - - break; - } - - default: - return E_INVALIDARG; - } - - return S_OK; -} - -/****************************************************************************** - * SysAllocStringByteLen [OLEAUT32.150] - * - */ -BSTR WINAPI SysAllocStringByteLen(LPCSTR in, UINT len) -{ - DWORD* newBuffer; - char* stringBuffer; - - /* - * Allocate a new buffer to hold the string. - * dont't forget to keep an empty spot at the beginning of the - * buffer for the character count and an extra character at the - * end for the NULL. - */ - newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), - 0, - len + sizeof(WCHAR) + sizeof(DWORD)); - - /* - * If the memory allocation failed, return a null pointer. - */ - if (newBuffer==0) - return 0; - - /* - * Copy the length of the string in the placeholder. - */ - *newBuffer = len; - - /* - * Skip the byte count. - */ - newBuffer++; - - /* - * Copy the information in the buffer. - * Since it is valid to pass a NULL pointer here, we'll initialize the - * buffer to nul if it is the case. - */ - if (in != 0) - memcpy(newBuffer, in, len); - - /* - * Make sure that there is a nul character at the end of the - * string. - */ - stringBuffer = (char *)newBuffer; - stringBuffer[len] = 0; - stringBuffer[len+1] = 0; - - return (LPWSTR)stringBuffer; -} - - diff --git a/dlls/oleaut32/oleaut.c b/dlls/oleaut32/oleaut.c index 7087d9e5d15..87616d7b9c1 100644 --- a/dlls/oleaut32/oleaut.c +++ b/dlls/oleaut32/oleaut.c @@ -28,7 +28,7 @@ #include "ole2.h" #include "olectl.h" -#include "wine/obj_oleaut.h" +#include "oleauto.h" #include "wine/obj_olefont.h" #include "tmarshal.h" @@ -37,6 +37,265 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); +/****************************************************************************** + * SysStringLen [OLEAUT32.7] + * + * The Windows documentation states that the length returned by this function + * is not necessarely the same as the length returned by the _lstrlenW method. + * It is the same number that was passed in as the "len" parameter if the + * string was allocated with a SysAllocStringLen method call. + */ +int WINAPI SysStringLen(BSTR str) +{ + DWORD* bufferPointer; + + if (!str) return 0; + /* + * The length of the string (in bytes) is contained in a DWORD placed + * just before the BSTR pointer + */ + bufferPointer = (DWORD*)str; + + bufferPointer--; + + return (int)(*bufferPointer/sizeof(WCHAR)); +} + +/****************************************************************************** + * SysStringByteLen [OLEAUT32.149] + * + * The Windows documentation states that the length returned by this function + * is not necessarely the same as the length returned by the _lstrlenW method. + * It is the same number that was passed in as the "len" parameter if the + * string was allocated with a SysAllocStringLen method call. + */ +int WINAPI SysStringByteLen(BSTR str) +{ + DWORD* bufferPointer; + + if (!str) return 0; + /* + * The length of the string (in bytes) is contained in a DWORD placed + * just before the BSTR pointer + */ + bufferPointer = (DWORD*)str; + + bufferPointer--; + + return (int)(*bufferPointer); +} + +/****************************************************************************** + * SysAllocString [OLEAUT32.2] + * + * MSDN (October 2001) states that this returns a NULL value if the argument + * is a zero-length string. This does not appear to be true; certainly it + * returns a value under Win98 (Oleaut32.dll Ver 2.40.4515.0) + */ +BSTR WINAPI SysAllocString(LPCOLESTR in) +{ + if (!in) return 0; + + /* Delegate this to the SysAllocStringLen32 method. */ + return SysAllocStringLen(in, lstrlenW(in)); +} + +/****************************************************************************** + * SysFreeString [OLEAUT32.6] + */ +void WINAPI SysFreeString(BSTR in) +{ + DWORD* bufferPointer; + + /* NULL is a valid parameter */ + if(!in) return; + + /* + * We have to be careful when we free a BSTR pointer, it points to + * the beginning of the string but it skips the byte count contained + * before the string. + */ + bufferPointer = (DWORD*)in; + + bufferPointer--; + + /* + * Free the memory from its "real" origin. + */ + HeapFree(GetProcessHeap(), 0, bufferPointer); +} + +/****************************************************************************** + * SysAllocStringLen [OLEAUT32.4] + * + * In "Inside OLE, second edition" by Kraig Brockshmidt. In the Automation + * section, he describes the DWORD value placed *before* the BSTR data type. + * he describes it as a "DWORD count of characters". By experimenting with + * a windows application, this count seems to be a DWORD count of bytes in + * the string. Meaning that the count is double the number of wide + * characters in the string. + */ +BSTR WINAPI SysAllocStringLen(const OLECHAR *in, unsigned int len) +{ + DWORD bufferSize; + DWORD* newBuffer; + WCHAR* stringBuffer; + + /* + * Find the length of the buffer passed-in in bytes. + */ + bufferSize = len * sizeof (WCHAR); + + /* + * Allocate a new buffer to hold the string. + * dont't forget to keep an empty spot at the beginning of the + * buffer for the character count and an extra character at the + * end for the NULL. + */ + newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), + 0, + bufferSize + sizeof(WCHAR) + sizeof(DWORD)); + + /* + * If the memory allocation failed, return a null pointer. + */ + if (newBuffer==0) + return 0; + + /* + * Copy the length of the string in the placeholder. + */ + *newBuffer = bufferSize; + + /* + * Skip the byte count. + */ + newBuffer++; + + /* + * Copy the information in the buffer. + * Since it is valid to pass a NULL pointer here, we'll initialize the + * buffer to nul if it is the case. + */ + if (in != 0) + memcpy(newBuffer, in, bufferSize); + else + memset(newBuffer, 0, bufferSize); + + /* + * Make sure that there is a nul character at the end of the + * string. + */ + stringBuffer = (WCHAR*)newBuffer; + stringBuffer[len] = L'\0'; + + return (LPWSTR)stringBuffer; +} + +/****************************************************************************** + * SysReAllocStringLen [OLEAUT32.5] + */ +int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len) +{ + /* + * Sanity check + */ + if (old==NULL) + return 0; + + /* + * Make sure we free the old string. + */ + if (*old!=NULL) + SysFreeString(*old); + + /* + * Allocate the new string + */ + *old = SysAllocStringLen(in, len); + + return 1; +} + +/****************************************************************************** + * SysAllocStringByteLen [OLEAUT32.150] + * + */ +BSTR WINAPI SysAllocStringByteLen(LPCSTR in, UINT len) +{ + DWORD* newBuffer; + char* stringBuffer; + + /* + * Allocate a new buffer to hold the string. + * dont't forget to keep an empty spot at the beginning of the + * buffer for the character count and an extra character at the + * end for the NULL. + */ + newBuffer = (DWORD*)HeapAlloc(GetProcessHeap(), + 0, + len + sizeof(WCHAR) + sizeof(DWORD)); + + /* + * If the memory allocation failed, return a null pointer. + */ + if (newBuffer==0) + return 0; + + /* + * Copy the length of the string in the placeholder. + */ + *newBuffer = len; + + /* + * Skip the byte count. + */ + newBuffer++; + + /* + * Copy the information in the buffer. + * Since it is valid to pass a NULL pointer here, we'll initialize the + * buffer to nul if it is the case. + */ + if (in != 0) + memcpy(newBuffer, in, len); + + /* + * Make sure that there is a nul character at the end of the + * string. + */ + stringBuffer = (char *)newBuffer; + stringBuffer[len] = 0; + stringBuffer[len+1] = 0; + + return (LPWSTR)stringBuffer; +} + +/****************************************************************************** + * SysReAllocString [OLEAUT32.3] + */ +INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in) +{ + /* + * Sanity check + */ + if (old==NULL) + return 0; + + /* + * Make sure we free the old string. + */ + if (*old!=NULL) + SysFreeString(*old); + + /* + * Allocate the new string + */ + *old = SysAllocString(in); + + return 1; +} + static WCHAR _delimiter[2] = {'!',0}; /* default delimiter apparently */ static WCHAR *pdelimiter = &_delimiter[0]; @@ -150,6 +409,87 @@ UINT WINAPI OaBuildVersion() } } +/****************************************************************************** + * OleTranslateColor [OLEAUT32.421] + * + * Converts an OLE_COLOR to a COLORREF. + * See the documentation for conversion rules. + * pColorRef can be NULL. In that case the user only wants to test the + * conversion. + */ +HRESULT WINAPI OleTranslateColor( + OLE_COLOR clr, + HPALETTE hpal, + COLORREF* pColorRef) +{ + COLORREF colorref; + BYTE b = HIBYTE(HIWORD(clr)); + + TRACE("(%08lx, %p, %p):stub\n", clr, hpal, pColorRef); + + /* + * In case pColorRef is NULL, provide our own to simplify the code. + */ + if (pColorRef == NULL) + pColorRef = &colorref; + + switch (b) + { + case 0x00: + { + if (hpal != 0) + *pColorRef = PALETTERGB(GetRValue(clr), + GetGValue(clr), + GetBValue(clr)); + else + *pColorRef = clr; + + break; + } + + case 0x01: + { + if (hpal != 0) + { + PALETTEENTRY pe; + /* + * Validate the palette index. + */ + if (GetPaletteEntries(hpal, LOWORD(clr), 1, &pe) == 0) + return E_INVALIDARG; + } + + *pColorRef = clr; + + break; + } + + case 0x02: + *pColorRef = clr; + break; + + case 0x80: + { + int index = LOBYTE(LOWORD(clr)); + + /* + * Validate GetSysColor index. + */ + if ((index < COLOR_SCROLLBAR) || (index > COLOR_GRADIENTINACTIVECAPTION)) + return E_INVALIDARG; + + *pColorRef = GetSysColor(index); + + break; + } + + default: + return E_INVALIDARG; + } + + return S_OK; +} + /*********************************************************************** * DllRegisterServer (OLEAUT32.320) */