From: Dmitry Timoshkov dmitry@baikal.ru
punkCaller is ignored by StdPicture ClassFactory implementation anyway.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/oleaut32/olepicture.c | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index b2ad6cb473a..f6bf36c414c 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -2322,16 +2322,13 @@ HRESULT WINAPI OleLoadPicturePath( LPOLESTR szURLorPath, LPUNKNOWN punkCaller, DWORD dwReserved, OLE_COLOR clrReserved, REFIID riid, LPVOID *ppvRet ) { - IPicture *ipicture; HANDLE hFile; DWORD dwFileSize; HGLOBAL hGlobal = NULL; DWORD dwBytesRead; IStream *stream; BOOL bRead; - IPersistStream *pStream; HRESULT hRes; - HRESULT init_res; WCHAR *file_candidate; WCHAR path_buf[MAX_PATH];
@@ -2407,32 +2404,10 @@ HRESULT WINAPI OleLoadPicturePath( LPOLESTR szURLorPath, LPUNKNOWN punkCaller, return hRes; }
- init_res = CoInitialize(NULL); - - hRes = CoCreateInstance(&CLSID_StdPicture, punkCaller, CLSCTX_INPROC_SERVER, - &IID_IPicture, (LPVOID*)&ipicture); - if (SUCCEEDED(hRes)) { - hRes = IPicture_QueryInterface(ipicture, &IID_IPersistStream, (LPVOID*)&pStream); - - if (SUCCEEDED(hRes)) { - hRes = IPersistStream_Load(pStream, stream); - - if (SUCCEEDED(hRes)) { - hRes = IPicture_QueryInterface(ipicture, riid, ppvRet); - - if (FAILED(hRes)) - ERR("Failed to get interface %s from IPicture.\n", debugstr_guid(riid)); - } - IPersistStream_Release(pStream); - } - IPicture_Release(ipicture); - } + hRes = OleLoadPicture(stream, 0, FALSE, riid, ppvRet);
IStream_Release(stream);
- if (SUCCEEDED(init_res)) - CoUninitialize(); - return hRes; }
From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/oleaut32/olepicture.c | 75 +++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 34 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index f6bf36c414c..33d2a12f88b 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -2306,6 +2306,45 @@ HRESULT WINAPI OleLoadPictureFile(VARIANT file, LPDISPATCH *picture) return E_NOTIMPL; }
+static HRESULT create_stream(const WCHAR *filename, IStream **stream) +{ + HANDLE hFile; + DWORD dwFileSize; + HGLOBAL hGlobal = NULL; + DWORD dwBytesRead; + HRESULT hr = S_OK; + + hFile = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return HRESULT_FROM_WIN32(GetLastError()); + + dwFileSize = GetFileSize(hFile, NULL); + if (dwFileSize != INVALID_FILE_SIZE) + { + hGlobal = GlobalAlloc(GMEM_FIXED, dwFileSize); + if (!hGlobal) + hr = E_OUTOFMEMORY; + else + { + if (!ReadFile(hFile, hGlobal, dwFileSize, &dwBytesRead, NULL)) + { + GlobalFree(hGlobal); + hr = HRESULT_FROM_WIN32(GetLastError()); + } + } + } + + CloseHandle(hFile); + + if (FAILED(hr)) return hr; + + hr = CreateStreamOnHGlobal(hGlobal, TRUE, stream); + if (FAILED(hr)) + GlobalFree(hGlobal); + + return hr; +} + /*********************************************************************** * OleSavePictureFile (OLEAUT32.423) */ @@ -2322,12 +2361,7 @@ HRESULT WINAPI OleLoadPicturePath( LPOLESTR szURLorPath, LPUNKNOWN punkCaller, DWORD dwReserved, OLE_COLOR clrReserved, REFIID riid, LPVOID *ppvRet ) { - HANDLE hFile; - DWORD dwFileSize; - HGLOBAL hGlobal = NULL; - DWORD dwBytesRead; IStream *stream; - BOOL bRead; HRESULT hRes; WCHAR *file_candidate; WCHAR path_buf[MAX_PATH]; @@ -2355,36 +2389,9 @@ HRESULT WINAPI OleLoadPicturePath( LPOLESTR szURLorPath, LPUNKNOWN punkCaller,
/* Handle candidate DOS paths separately. */ if (file_candidate[1] == ':') { - hFile = CreateFileW(file_candidate, GENERIC_READ, 0, NULL, OPEN_EXISTING, - 0, NULL); - if (hFile == INVALID_HANDLE_VALUE) - return INET_E_RESOURCE_NOT_FOUND; - - dwFileSize = GetFileSize(hFile, NULL); - if (dwFileSize != INVALID_FILE_SIZE ) - { - hGlobal = GlobalAlloc(GMEM_FIXED,dwFileSize); - if ( hGlobal) - { - bRead = ReadFile(hFile, hGlobal, dwFileSize, &dwBytesRead, NULL) && dwBytesRead == dwFileSize; - if (!bRead) - { - GlobalFree(hGlobal); - hGlobal = 0; - } - } - } - CloseHandle(hFile); - - if (!hGlobal) + hRes = create_stream(file_candidate, &stream); + if (FAILED(hRes)) return INET_E_RESOURCE_NOT_FOUND; - - hRes = CreateStreamOnHGlobal(hGlobal, TRUE, &stream); - if (FAILED(hRes)) - { - GlobalFree(hGlobal); - return hRes; - } } else { IMoniker *pmnk; IBindCtx *pbc;
From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/oleaut32/olepicture.c | 36 ++++++++++++++++------ dlls/oleaut32/tests/olepicture.c | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 9 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index 33d2a12f88b..36de9c355f3 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -2297,15 +2297,6 @@ HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode, return hr; }
-/*********************************************************************** - * OleLoadPictureFile (OLEAUT32.422) - */ -HRESULT WINAPI OleLoadPictureFile(VARIANT file, LPDISPATCH *picture) -{ - FIXME("(%s %p): stub\n", wine_dbgstr_variant(&file), picture); - return E_NOTIMPL; -} - static HRESULT create_stream(const WCHAR *filename, IStream **stream) { HANDLE hFile; @@ -2345,6 +2336,33 @@ static HRESULT create_stream(const WCHAR *filename, IStream **stream) return hr; }
+/*********************************************************************** + * OleLoadPictureFile (OLEAUT32.422) + */ +HRESULT WINAPI OleLoadPictureFile(VARIANT filename, IDispatch **picture) +{ + IStream *stream; + HRESULT hr; + + TRACE("(%s,%p)\n", wine_dbgstr_variant(&filename), picture); + + if (V_VT(&filename) != VT_BSTR) + return CTL_E_FILENOTFOUND; + + hr = create_stream(V_BSTR(&filename), &stream); + if (hr != S_OK) + { + if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) + return CTL_E_FILENOTFOUND; + + return CTL_E_PATHFILEACCESSERROR; + } + + hr = OleLoadPicture(stream, 0, FALSE, &IID_IDispatch, (void **)picture); + IStream_Release(stream); + return hr; +} + /*********************************************************************** * OleSavePictureFile (OLEAUT32.423) */ diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c index 210fea4d4c1..ee2dbdf62ba 100644 --- a/dlls/oleaut32/tests/olepicture.c +++ b/dlls/oleaut32/tests/olepicture.c @@ -948,6 +948,7 @@ static void test_OleLoadPicturePath(void) HANDLE file; DWORD size; WCHAR *ptr; + VARIANT var;
const struct { @@ -1014,6 +1015,14 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW + 8); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == S_OK, "OleLoadPictureFile error %#x\n", hres); + IPicture_Release(pic); + VariantClear(&var); + /* Try a DOS path with tacked on "file:". */ hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == S_OK || @@ -1022,6 +1031,13 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); + VariantClear(&var); + DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -1031,12 +1047,26 @@ static void test_OleLoadPicturePath(void) broken(hres == E_FAIL), /*Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW + 8); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_FILENOTFOUND, "wrong error %#x\n", hres); + VariantClear(&var); + hres = OleLoadPicturePath(temp_fileW, NULL, 0, 0, &IID_IPicture, (void **)&pic); ok(hres == INET_E_RESOURCE_NOT_FOUND || /* XP+ */ broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); + VariantClear(&var); + file = CreateFileA(temp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(file, bmpimage, sizeof(bmpimage), &size, NULL); @@ -1058,6 +1088,13 @@ static void test_OleLoadPicturePath(void) if (pic) IPicture_Release(pic);
+ VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#x\n", hres); + VariantClear(&var); + DeleteFileA(temp_file);
/* Try with a nonexistent file. */ @@ -1066,6 +1103,22 @@ static void test_OleLoadPicturePath(void) broken(hres == E_UNEXPECTED) || /* NT4 */ broken(hres == E_FAIL), /* Win2k */ "Expected OleLoadPicturePath to return INET_E_RESOURCE_NOT_FOUND, got 0x%08lx\n", hres); + + VariantInit(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(temp_fileW); + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_PATHFILEACCESSERROR, "wrong error %#lx\n", hres); + VariantClear(&var); + + VariantInit(&var); + V_VT(&var) = VT_INT; + V_INT(&var) = 762; + hres = OleLoadPictureFile(var, (IDispatch **)&pic); + ok(hres == CTL_E_FILENOTFOUND, "wrong error %#lx\n", hres); + + if (0) /* crashes under Windows */ + hres = OleLoadPictureFile(var, NULL); }
static void test_himetric(void)