[COMDLG32_WINETEST]

* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60546
This commit is contained in:
Amine Khaldi 2013-10-05 20:44:20 +00:00
parent 64e052cb3e
commit 43ef186f8f
8 changed files with 607 additions and 150 deletions

View file

@ -1,18 +1,14 @@
add_definitions(-D__ROS_LONG64__)
list(APPEND SOURCE
filedlg.c
finddlg.c
fontdlg.c
itemdlg.c
printdlg.c
testlist.c
rsrc.rc)
add_executable(comdlg32_winetest ${SOURCE})
target_link_libraries(comdlg32_winetest wine uuid)
testlist.c)
add_executable(comdlg32_winetest ${SOURCE} rsrc.rc)
target_link_libraries(comdlg32_winetest uuid)
set_module_type(comdlg32_winetest win32cui)
add_importlibs(comdlg32_winetest comdlg32 winspool user32 gdi32 msvcrt kernel32 ntdll ole32 shell32)
add_importlibs(comdlg32_winetest comdlg32 winspool user32 gdi32 ole32 shell32 msvcrt kernel32)
add_cd_file(TARGET comdlg32_winetest DESTINATION reactos/bin FOR all)

View file

@ -19,12 +19,23 @@
*
*/
#include <windows.h>
//#include <windows.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
#include <wine/test.h>
#include "shlguid.h"
#include <wingdi.h>
#include <objbase.h>
#include <cderr.h>
#include <dlgs.h>
#include <commdlg.h>
#include <shlguid.h>
#define COBJMACROS
#include "shobjidl.h"
#include <shobjidl.h>
/* ##### */
@ -93,7 +104,7 @@ static void test_DialogCancel(void)
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
@ -239,7 +250,7 @@ cleanup:
return 0;
}
static LONG_PTR WINAPI template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
static UINT_PTR WINAPI template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_INITDIALOG)
{
@ -266,7 +277,7 @@ static void test_create_view_window2(void)
char filename[1024] = {0};
DWORD ret;
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;
ofn.lpfnHook = create_view_window2_hook;
@ -283,10 +294,10 @@ static void test_create_view_template(void)
char filename[1024] = {0};
DWORD ret;
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;
ofn.lpfnHook = (LPOFNHOOKPROC)template_hook;
ofn.lpfnHook = template_hook;
ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER| OFN_ENABLETEMPLATE;
ofn.hInstance = GetModuleHandleA(NULL);
ofn.lpTemplateName = "template1";
@ -318,7 +329,7 @@ static const struct {
{ 0xffffffff }
};
static LONG_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
static UINT_PTR WINAPI resize_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static RECT initrc, rc;
static int index, count;
@ -531,14 +542,14 @@ todo_wine
static void test_resize(void)
{
OPENFILENAME ofn = { sizeof(OPENFILENAME)};
OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };
char filename[1024] = {0};
DWORD ret;
int i;
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;
ofn.lpfnHook = (LPOFNHOOKPROC) resize_template_hook;
ofn.lpfnHook = resize_template_hook;
ofn.hInstance = GetModuleHandle(NULL);
ofn.lpTemplateName = "template_sz";
for( i = 0; resize_testcases[i].flags != 0xffffffff; i++) {
@ -581,7 +592,7 @@ static ok_wndproc_testcase ok_testcases[] = {
/* test_ok_wndproc can be used as hook procedure or a subclass
* window proc for the file dialog */
static LONG_PTR WINAPI test_ok_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
static UINT_PTR WINAPI test_ok_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND parent = GetParent( dlg);
static ok_wndproc_testcase *testcase = NULL;
@ -624,7 +635,7 @@ static LONG_PTR WINAPI test_ok_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM
return FALSE;
}
static LONG_PTR WINAPI ok_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
static UINT_PTR WINAPI ok_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
if (msg == WM_SETFONT)
SetWindowLongPtrA( dlg, GWLP_WNDPROC, (LONG_PTR) test_ok_wndproc);
@ -633,7 +644,7 @@ static LONG_PTR WINAPI ok_template_hook(HWND dlg, UINT msg, WPARAM wParam, LPARA
static void test_ok(void)
{
OPENFILENAME ofn = { sizeof(OPENFILENAME)};
OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };
char filename[1024] = {0};
char tmpfilename[ MAX_PATH];
char curdir[MAX_PATH];
@ -655,9 +666,7 @@ static void test_ok(void)
for( i = 0; ok_testcases[i].retval != -1; i++) {
strcpy( filename, tmpfilename);
ofn.lCustData = (LPARAM)(ok_testcases + i);
ofn.lpfnHook = ok_testcases[i].do_subclass
? (LPOFNHOOKPROC) ok_template_hook
: (LPOFNHOOKPROC) test_ok_wndproc;
ofn.lpfnHook = ok_testcases[i].do_subclass ? ok_template_hook : test_ok_wndproc;
ret = GetOpenFileNameA(&ofn);
ok( ok_testcases[i].expclose == ok_testcases[i].actclose,
"testid %d: Open File dialog should %shave closed.\n", i,
@ -706,7 +715,7 @@ static struct {
{ -1 }
};
static LONG_PTR WINAPI template_hook_arrange(HWND dlgChild, UINT msg, WPARAM wParam, LPARAM lParam)
static UINT_PTR WINAPI template_hook_arrange(HWND dlgChild, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int index, fixhelp;
static posz posz0[2];
@ -843,10 +852,10 @@ static void test_arrange(void)
return;
}
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;
ofn.lpfnHook = (LPOFNHOOKPROC)template_hook_arrange;
ofn.lpfnHook = template_hook_arrange;
ofn.hInstance = hDlgTmpl;
ofn.lpstrFilter="text\0*.txt\0All\0*\0\0";
for( i = 0; arrange_tests[i].nrcontrols != -1; i++) {
@ -916,7 +925,7 @@ static void test_getfolderpath(void)
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
@ -948,7 +957,7 @@ static void test_resizable2(void)
skip( "some interactive resizable dialog tests (set WINETEST_INTERACTIVE=1)\n");
return;
}
ofn.lStructSize = sizeof(ofn);
ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofn.lpstrFile = filename;
ofn.nMaxFile = 1024;
ofn.lpfnHook = NULL;
@ -983,7 +992,7 @@ static void test_resizable2(void)
static void test_mru(void)
{
ok_wndproc_testcase testcase = {0};
OPENFILENAME ofn = {sizeof(OPENFILENAME)};
OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };
const char *test_dir_name = "C:\\mru_test";
const char *test_file_name = "test.txt";
const char *test_full_path = "C:\\mru_test\\test.txt";
@ -996,7 +1005,7 @@ static void test_mru(void)
ofn.hInstance = GetModuleHandle(NULL);
ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLETEMPLATE | OFN_NOCHANGEDIR;
ofn.lCustData = (LPARAM)&testcase;
ofn.lpfnHook = (LPOFNHOOKPROC)test_ok_wndproc;
ofn.lpfnHook = test_ok_wndproc;
SetLastError(0xdeadbeef);
ret = CreateDirectoryA(test_dir_name, NULL);
@ -1044,56 +1053,199 @@ static UINT_PTR WINAPI test_extension_wndproc(HWND dlg, UINT msg, WPARAM wParam,
return FALSE;
}
static const char *defext_filters[] = {
"TestFilter (*.pt*)\0*.pt*\0",
"TestFilter (*.ab?)\0*.ab?\0",
"TestFilter (*.*)\0*.*\0",
NULL /* is a test, not an endmark! */
};
#define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
static void test_extension_helper(OPENFILENAME* ofn, const char *filter,
const char *expected_filename)
{
char *filename_ptr;
DWORD ret;
BOOL boolret;
strcpy(ofn->lpstrFile, "deadbeef");
ofn->lpstrFilter = filter;
boolret = GetSaveFileNameA(ofn);
ok(boolret, "%s: expected TRUE\n", filter);
ret = CommDlgExtendedError();
ok(!ret, "%s: CommDlgExtendedError returned %#x\n", filter, ret);
filename_ptr = ofn->lpstrFile + ofn->nFileOffset;
ok(strcmp(filename_ptr, expected_filename) == 0,
"%s: Filename is %s, expected %s\n", filter, filename_ptr, expected_filename);
}
static void test_extension(void)
{
OPENFILENAME ofn = { sizeof(OPENFILENAME)};
OPENFILENAME ofn = { OPENFILENAME_SIZE_VERSION_400 };
char filename[1024] = {0};
char curdir[MAX_PATH];
char *filename_ptr;
const char *test_file_name = "deadbeef";
unsigned int i;
DWORD ret;
BOOL boolret;
const char *defext_concrete_filters[] = {
"TestFilter (*.abc)\0*.abc\0",
"TestFilter (*.abc;)\0*.abc;\0",
"TestFilter (*.abc;*.def)\0*.abc;*.def\0",
};
const char *defext_wildcard_filters[] = {
"TestFilter (*.pt*)\0*.pt*\0",
"TestFilter (*.pt*;*.abc)\0*.pt*;*.abc\0",
"TestFilter (*.ab?)\0*.ab?\0",
"TestFilter (*.*)\0*.*\0",
"TestFilter (*sav)\0*sav\0",
NULL /* is a test, not an endmark! */
};
boolret = GetCurrentDirectoryA(sizeof(curdir), curdir);
ok(boolret, "Failed to get current dir err %d\n", GetLastError());
/* Ignore .* extension */
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_ENABLEHOOK;
ofn.lpstrDefExt = NULL;
ofn.lpstrInitialDir = curdir;
ofn.lpfnHook = test_extension_wndproc;
ofn.nFileExtension = 0;
for (i = 0; i < ARRAY_SIZE(defext_filters); i++) {
ofn.lpstrFilter = defext_filters[i];
strcpy(filename, test_file_name);
boolret = GetSaveFileNameA(&ofn);
ok(boolret, "%u: expected true\n", i);
ret = CommDlgExtendedError();
ok(!ret, "%u: CommDlgExtendedError returned %#x\n", i, ret);
filename_ptr = ofn.lpstrFile + strlen( ofn.lpstrFile ) - strlen( test_file_name );
ok( strlen(ofn.lpstrFile) >= strlen(test_file_name), "Filename %s is too short\n", ofn.lpstrFile );
ok( strcmp(filename_ptr, test_file_name) == 0,
"Filename is %s, expected %s\n", filename_ptr, test_file_name );
ofn.lpstrDefExt = NULL;
/* Without lpstrDefExt, append no extension */
test_extension_helper(&ofn, "TestFilter (*.abc) lpstrDefExt=NULL\0*.abc\0", "deadbeef");
test_extension_helper(&ofn, "TestFilter (*.ab?) lpstrDefExt=NULL\0*.ab?\0", "deadbeef");
ofn.lpstrDefExt = "";
/* If lpstrDefExt="" and the filter has a concrete extension, append it */
test_extension_helper(&ofn, "TestFilter (*.abc) lpstrDefExt=\"\"\0*.abc\0", "deadbeef.abc");
/* If lpstrDefExt="" and the filter has a wildcard extension, do nothing */
test_extension_helper(&ofn, "TestFilter (*.ab?) lpstrDefExt=\"\"\0*.ab?\0", "deadbeef");
ofn.lpstrDefExt = "xyz";
/* Append concrete extensions from filters */
for (i = 0; i < ARRAY_SIZE(defext_concrete_filters); i++) {
test_extension_helper(&ofn, defext_concrete_filters[i], "deadbeef.abc");
}
/* Append nothing from this filter */
test_extension_helper(&ofn, "TestFilter (*.)\0*.\0", "deadbeef");
/* Ignore wildcard extensions in filters */
for (i = 0; i < ARRAY_SIZE(defext_wildcard_filters); i++) {
test_extension_helper(&ofn, defext_wildcard_filters[i], "deadbeef.xyz");
}
}
#undef ARRAY_SIZE
static BOOL WINAPI test_null_enum(HWND hwnd, LPARAM lParam)
{
/* Find the textbox and send a filename so IDOK will work.
If the file textbox is empty IDOK will be ignored */
CHAR className[20];
if(GetClassNameA(hwnd, className, sizeof(className)) > 0 && !strcmp("Edit",className))
{
SetWindowText(hwnd, "testfile");
return FALSE; /* break window enumeration */
}
return TRUE;
}
static UINT_PTR WINAPI test_null_wndproc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
HWND parent = GetParent( dlg);
if( msg == WM_NOTIFY) {
SetTimer( dlg, 0, 100, 0);
SetTimer( dlg, 1, 1000, 0);
EnumChildWindows( parent, test_null_enum, 0);
}
if( msg == WM_TIMER) {
if(!wParam)
PostMessage( parent, WM_COMMAND, IDOK, 0);
else {
/* the dialog did not close automatically */
KillTimer( dlg, 0);
PostMessage( parent, WM_COMMAND, IDCANCEL, 0);
}
}
return FALSE;
}
static void test_null_filename(void)
{
OPENFILENAMEA ofnA = {0};
OPENFILENAMEW ofnW = {0};
WCHAR filterW[] = {'t','e','x','t','\0','*','.','t','x','t','\0',
'A','l','l','\0','*','\0','\0'};
DWORD ret;
ofnA.lStructSize = OPENFILENAME_SIZE_VERSION_400A;
ofnA.lpstrFile = NULL;
ofnA.nMaxFile = 0;
ofnA.nFileOffset = 0xdead;
ofnA.nFileExtension = 0xbeef;
ofnA.lpfnHook = test_null_wndproc;
ofnA.Flags = OFN_ENABLEHOOK | OFN_EXPLORER;
ofnA.hInstance = GetModuleHandleA(NULL);
ofnA.lpstrFilter = "text\0*.txt\0All\0*\0\0";
ofnA.lpstrDefExt = NULL;
ret = GetOpenFileNameA(&ofnA);
todo_wine ok(ret, "GetOpenFileNameA returned %#x\n", ret);
ret = CommDlgExtendedError();
todo_wine ok(!ret, "CommDlgExtendedError returned %#x, should be 0\n", ret);
todo_wine ok(ofnA.nFileOffset != 0xdead, "ofnA.nFileOffset is 0xdead\n");
todo_wine ok(ofnA.nFileExtension != 0xbeef, "ofnA.nFileExtension is 0xbeef\n");
ofnA.lpstrFile = NULL;
ofnA.nMaxFile = 1024; /* bogus input - lpstrFile = NULL but fake 1024 bytes available */
ofnA.nFileOffset = 0xdead;
ofnA.nFileExtension = 0xbeef;
ret = GetOpenFileNameA(&ofnA);
ok(ret, "GetOpenFileNameA returned %#x\n", ret);
ret = CommDlgExtendedError();
ok(!ret, "CommDlgExtendedError returned %#x\n", ret);
ok(ofnA.nFileOffset != 0xdead, "ofnA.nFileOffset is 0xdead\n");
ok(ofnA.nFileExtension == 0, "ofnA.nFileExtension is 0x%x, should be 0\n", ofnA.nFileExtension);
/* unicode tests */
ofnW.lStructSize = OPENFILENAME_SIZE_VERSION_400W;
ofnW.lpstrFile = NULL;
ofnW.nMaxFile = 0;
ofnW.nFileOffset = 0xdead;
ofnW.nFileExtension = 0xbeef;
ofnW.lpfnHook = test_null_wndproc;
ofnW.Flags = OFN_ENABLEHOOK | OFN_EXPLORER;
ofnW.hInstance = GetModuleHandleW(NULL);
ofnW.lpstrFilter = filterW;
ofnW.lpstrDefExt = NULL;
ret = GetOpenFileNameW(&ofnW);
todo_wine ok(ret, "GetOpenFileNameW returned %#x\n", ret);
ret = CommDlgExtendedError();
todo_wine ok(!ret, "CommDlgExtendedError returned %#x\n", ret);
todo_wine ok(ofnW.nFileOffset != 0xdead, "ofnW.nFileOffset is 0xdead\n");
todo_wine ok(ofnW.nFileExtension != 0xbeef, "ofnW.nFileExtension is 0xbeef\n");
ofnW.lpstrFile = NULL;
ofnW.nMaxFile = 1024; /* bogus input - lpstrFile = NULL but fake 1024 bytes available */
ofnW.nFileOffset = 0xdead;
ofnW.nFileExtension = 0xbeef;
ret = GetOpenFileNameW(&ofnW);
ok(ret, "GetOpenFileNameA returned %#x\n", ret);
ret = CommDlgExtendedError();
ok(!ret, "CommDlgExtendedError returned %#x\n", ret);
ok(ofnW.nFileOffset != 0xdead, "ofnW.nFileOffset is 0xdead\n");
ok(ofnW.nFileExtension == 0, "ofnW.nFileExtension is 0x%x, should be 0\n", ofnW.nFileExtension);
}
START_TEST(filedlg)
{
test_DialogCancel();
@ -1106,4 +1258,5 @@ START_TEST(filedlg)
test_mru();
if( resizesupported) test_resizable2();
test_extension();
test_null_filename();
}

View file

@ -19,9 +19,16 @@
*
*/
#include "windows.h"
#include "commdlg.h"
#include "wine/test.h"
//#include "windows.h"
#define WIN32_NO_STATUS
#include <wine/test.h>
#include <wingdi.h>
#include <winuser.h>
#include <cderr.h>
#include <commdlg.h>
static UINT ID_FINDMSGSTRING;

View file

@ -19,19 +19,21 @@
*
*/
#include <stdarg.h>
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "wingdi.h"
#include "winspool.h"
#include "winuser.h"
#include "objbase.h"
#include <wine/test.h>
#include "commdlg.h"
//#include <stdarg.h>
#include "wine/test.h"
//#include "windef.h"
//#include "winbase.h"
//#include "winerror.h"
#include <wingdi.h>
#include <winspool.h>
#include <winuser.h>
//#include "objbase.h"
#include <commdlg.h>
static int get_dpiy(void)
{

View file

@ -19,11 +19,16 @@
*
*/
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
#include <wine/test.h>
#define COBJMACROS
#define CONST_VTABLE
#include "shlobj.h"
#include "wine/test.h"
#include <shlobj.h>
static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**);
static HRESULT (WINAPI *pSHGetIDListFromObject)(IUnknown*, PIDLIST_ABSOLUTE*);
@ -277,19 +282,28 @@ static BOOL test_instantiation(void)
IExplorerBrowser *peb;
IShellBrowser *psb;
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&peb);
ok(hr == E_FAIL, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IExplorerBrowser_Release(peb);
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&psb);
ok(hr == E_FAIL, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IShellBrowser_Release(psb);
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
ok(hr == E_FAIL, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
hr = IServiceProvider_QueryService(psp, &SID_SExplorerBrowserFrame, &IID_ICommDlgBrowser, (void**)&punk);
ok(hr == S_OK, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
/* since win8, the result is E_NOTIMPL for all other services */
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&peb);
ok(hr == E_NOTIMPL || broken(hr == E_FAIL), "got 0x%08x (expected E_NOTIMPL)\n", hr);
if(SUCCEEDED(hr)) IExplorerBrowser_Release(peb);
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&psb);
ok(hr == E_NOTIMPL || broken(hr == E_FAIL), "got 0x%08x (expected E_NOTIMPL)\n", hr);
if(SUCCEEDED(hr)) IShellBrowser_Release(psb);
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_ICommDlgBrowser, (void**)&punk);
ok(hr == E_NOTIMPL || broken(hr == E_FAIL), "got 0x%08x (expected E_NOTIMPL)\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
hr = IServiceProvider_QueryService(psp, &SID_STopLevelBrowser, &IID_IUnknown, (void**)&punk);
ok(hr == E_NOTIMPL || broken(hr == E_FAIL), "got 0x%08x (expected E_NOTIMPL)\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
hr = IServiceProvider_QueryService(psp, &IID_IUnknown, &IID_IUnknown, (void**)&punk);
ok(hr == E_NOTIMPL || broken(hr == E_FAIL), "got 0x%08x (expected E_NOTIMPL)\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
IServiceProvider_Release(psp);
}
@ -369,7 +383,7 @@ static BOOL test_instantiation(void)
hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IFileDialogEvents, (void**)&punk);
ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(pfd);
if(SUCCEEDED(hr)) IFileDialog_Release(pfd);
hr = IFileSaveDialog_QueryInterface(pfsd, &IID_IExplorerBrowser, (void**)&punk);
ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
@ -379,7 +393,7 @@ static BOOL test_instantiation(void)
ok(hr == S_OK, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
hr = IFileOpenDialog_QueryInterface(pfsd, &IID_ICommDlgBrowser3, (void**)&punk);
hr = IFileSaveDialog_QueryInterface(pfsd, &IID_ICommDlgBrowser3, (void**)&punk);
ok(hr == S_OK, "got 0x%08x.\n", hr);
if(SUCCEEDED(hr)) IUnknown_Release(punk);
@ -1378,11 +1392,12 @@ static void test_customize(void)
&IID_IFileDialog, (void**)&pfod);
ok(hr == S_OK, "got 0x%08x.\n", hr);
hr = IFileOpenDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfdc);
hr = IFileDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfdc);
ok(hr == S_OK, "got 0x%08x.\n", hr);
if(FAILED(hr))
{
skip("Skipping IFileDialogCustomize tests.\n");
IFileDialog_Release(pfod);
return;
}
@ -1666,7 +1681,7 @@ static void test_customize(void)
IFileDialogEvents_Release(pfde);
IFileDialogCustomize_Release(pfdc);
ref = IFileOpenDialog_Release(pfod);
ref = IFileDialog_Release(pfod);
ok(!ref, "Refcount not zero (%d).\n", ref);
@ -1674,7 +1689,7 @@ static void test_customize(void)
&IID_IFileDialog, (void**)&pfod);
ok(hr == S_OK, "got 0x%08x.\n", hr);
hr = IFileDialogCustomize_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfdc);
hr = IFileDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfdc);
ok(hr == S_OK, "got 0x%08x.\n", hr);
i = 0;
@ -1884,10 +1899,34 @@ static void test_customize(void)
}
IFileDialogCustomize_Release(pfdc);
ref = IFileOpenDialog_Release(pfod);
ref = IFileDialog_Release(pfod);
ok(!ref, "Refcount not zero (%d).\n", ref);
}
static void test_persistent_state(void)
{
IFileDialog *fd;
HRESULT hr;
hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
&IID_IFileDialog, (void**)&fd);
ok(hr == S_OK, "got 0x%08x.\n", hr);
if (0)
{
/* crashes at least on Win8 */
hr = IFileDialog_SetClientGuid(fd, NULL);
}
hr = IFileDialog_SetClientGuid(fd, &IID_IUnknown);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IFileDialog_SetClientGuid(fd, &IID_NULL);
ok(hr == S_OK, "got 0x%08x\n", hr);
IFileDialog_Release(fd);
}
START_TEST(itemdlg)
{
OleInitialize(NULL);
@ -1899,6 +1938,7 @@ START_TEST(itemdlg)
test_advise();
test_filename();
test_customize();
test_persistent_state();
}
else
skip("Skipping all Item Dialog tests.\n");

View file

@ -2,6 +2,7 @@
* Unit test suite for comdlg32 API functions: printer dialogs
*
* Copyright 2006-2007 Detlef Riekenberg
* Copyright 2013 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -19,24 +20,31 @@
*
*/
#include <stdarg.h>
#define COBJMACROS
#define CONST_VTABLE
#define WIN32_NO_STATUS
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "wingdi.h"
#include "winuser.h"
#include "objbase.h"
#include <wine/test.h>
#include "cderr.h"
#include "commdlg.h"
//#include <stdarg.h>
#include <stdio.h>
#include "wine/test.h"
//#include "windef.h"
//#include "winbase.h"
//#include "winerror.h"
#include <wingdi.h>
#include <winuser.h>
#include <objbase.h>
#include <cderr.h>
#include <commdlg.h>
#include <dlgs.h>
/* ########################### */
extern const IID IID_IObjectWithSite;
static HMODULE hcomdlg32;
static HRESULT (WINAPI * pPrintDlgExA)(LPPRINTDLGEXA);
static HRESULT (WINAPI * pPrintDlgExW)(LPPRINTDLGEXW);
/* ########################### */
@ -44,25 +52,16 @@ static HRESULT (WINAPI * pPrintDlgExW)(LPPRINTDLGEXW);
static const CHAR emptyA[] = "";
static const CHAR PrinterPortsA[] = "PrinterPorts";
/* ########################### */
static LPCSTR load_functions(void)
static const char *debugstr_guid(const GUID *guid)
{
LPCSTR ptr;
ptr = "comdlg32.dll";
hcomdlg32 = GetModuleHandleA(ptr);
ptr = "PrintDlgExA";
pPrintDlgExA = (void *) GetProcAddress(hcomdlg32, ptr);
if (!pPrintDlgExA) return ptr;
ptr = "PrintDlgExW";
pPrintDlgExW = (void *) GetProcAddress(hcomdlg32, ptr);
if (!pPrintDlgExW) return ptr;
return NULL;
static char buf[50];
if (!guid) return "(null)";
sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
guid->Data4[5], guid->Data4[6], guid->Data4[7]);
return buf;
}
/* ########################### */
@ -127,9 +126,21 @@ static void test_PageSetupDlgA(void)
/* ########################### */
static UINT_PTR CALLBACK print_hook_proc(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp)
{
if (msg == WM_INITDIALOG)
{
/* some driver popup a dialog and hung the test or silently limit the number of copies,
when trying to set more than 999 copies */
SetDlgItemInt(hdlg, edt3, 123, FALSE);
PostMessage(hdlg, WM_COMMAND, IDOK, FALSE);
}
return 0;
}
static void test_PrintDlgA(void)
{
DWORD res;
DWORD res, n_copies = 0;
LPPRINTDLGA pDlg;
DEVNAMES *pDevNames;
LPCSTR driver;
@ -137,7 +148,7 @@ static void test_PrintDlgA(void)
LPCSTR port;
CHAR buffer[MAX_PATH];
LPSTR ptr;
DEVMODE *dm;
pDlg = HeapAlloc(GetProcessHeap(), 0, (sizeof(PRINTDLGA)) * 2);
if (!pDlg) return;
@ -200,9 +211,7 @@ static void test_PrintDlgA(void)
/* The Driver Entry does not include a Path */
ptr = strrchr(driver, '\\');
todo_wine {
ok( ptr == NULL, "got %p for '%s' (expected NULL for a simple name)\n", ptr, driver);
}
/* The Driver Entry does not have an extension (fixed to ".drv") */
ptr = strrchr(driver, '.');
@ -220,37 +229,172 @@ static void test_PrintDlgA(void)
res, GetLastError(), ptr, buffer);
if (ptr) ptr[0] = '\0';
todo_wine {
ok( lstrcmpiA(driver, buffer) == 0,
"got driver '%s' (expected '%s')\n", driver, buffer);
}
n_copies = DeviceCapabilities(device, port, DC_COPIES, NULL, NULL);
ok(n_copies > 0, "DeviceCapabilities(DC_COPIES) failed\n");
}
GlobalUnlock(pDlg->hDevNames);
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
HeapFree(GetProcessHeap(), 0, pDlg);
/* if device doesn't support printing of multiple copies then
* an attempt to set number of copies > 1 in print dialog would
* cause the PrintDlg under Windows display the MessageBox and
* the test will hang waiting for user response.
*/
if (n_copies > 1)
{
ZeroMemory(pDlg, sizeof(*pDlg));
pDlg->lStructSize = sizeof(*pDlg);
pDlg->Flags = PD_ENABLEPRINTHOOK;
pDlg->lpfnPrintHook = print_hook_proc;
res = PrintDlg(pDlg);
ok(res, "PrintDlg error %#x\n", CommDlgExtendedError());
/* Version of Microsoft XPS Document Writer driver shipped before Win7
* reports that it can print multiple copies, but returns 1.
*/
ok(pDlg->nCopies == 123 || broken(pDlg->nCopies == 1), "expected nCopies 123, got %d\n", pDlg->nCopies);
ok(pDlg->hDevMode != 0, "hDevMode should not be 0\n");
dm = GlobalLock(pDlg->hDevMode);
/* some broken drivers use always PD_USEDEVMODECOPIES */
ok((S1(U1(*dm)).dmCopies == 1) || broken(S1(U1(*dm)).dmCopies == 123),
"expected dm->dmCopies 1, got %d\n", S1(U1(*dm)).dmCopies);
GlobalUnlock(pDlg->hDevMode);
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
ZeroMemory(pDlg, sizeof(*pDlg));
pDlg->lStructSize = sizeof(*pDlg);
pDlg->Flags = PD_ENABLEPRINTHOOK | PD_USEDEVMODECOPIES;
pDlg->lpfnPrintHook = print_hook_proc;
res = PrintDlg(pDlg);
ok(res, "PrintDlg error %#x\n", CommDlgExtendedError());
ok(pDlg->nCopies == 1, "expected nCopies 1, got %d\n", pDlg->nCopies);
ok(pDlg->hDevMode != 0, "hDevMode should not be 0\n");
dm = GlobalLock(pDlg->hDevMode);
ok(S1(U1(*dm)).dmCopies == 123, "expected dm->dmCopies 123, got %d\n", S1(U1(*dm)).dmCopies);
GlobalUnlock(pDlg->hDevMode);
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
}
HeapFree(GetProcessHeap(), 0, pDlg);
}
/* ########################### */
static HRESULT WINAPI callback_QueryInterface(IPrintDialogCallback *iface,
REFIID riid, void **ppv)
{
ok(0, "callback_QueryInterface(%s): unexpected call\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
static ULONG WINAPI callback_AddRef(IPrintDialogCallback *iface)
{
trace("callback_AddRef\n");
return 2;
}
static ULONG WINAPI callback_Release(IPrintDialogCallback *iface)
{
trace("callback_Release\n");
return 1;
}
static HRESULT WINAPI callback_InitDone(IPrintDialogCallback *iface)
{
trace("callback_InitDone\n");
return S_OK;
}
static HRESULT WINAPI callback_SelectionChange(IPrintDialogCallback *iface)
{
trace("callback_SelectionChange\n");
return S_OK;
}
static HRESULT WINAPI callback_HandleMessage(IPrintDialogCallback *iface,
HWND hdlg, UINT msg, WPARAM wp, LPARAM lp, LRESULT *res)
{
trace("callback_HandleMessage %p,%04x,%lx,%lx,%p\n", hdlg, msg, wp, lp, res);
/* *res = PD_RESULT_PRINT; */
return S_OK;
}
static const IPrintDialogCallbackVtbl callback_Vtbl =
{
callback_QueryInterface,
callback_AddRef,
callback_Release,
callback_InitDone,
callback_SelectionChange,
callback_HandleMessage
};
static IPrintDialogCallback callback = { &callback_Vtbl };
static HRESULT WINAPI unknown_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
trace("unknown_QueryInterface %s\n", debugstr_guid(riid));
if (IsEqualGUID(riid, &IID_IPrintDialogCallback))
{
*ppv = &callback;
return S_OK;
}
else if (IsEqualGUID(riid, &IID_IObjectWithSite))
{
*ppv = NULL;
return E_NOINTERFACE;
}
ok(0, "unexpected IID %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI unknown_AddRef(IUnknown *iface)
{
trace("unknown_AddRef\n");
return 2;
}
static ULONG WINAPI unknown_Release(IUnknown *iface)
{
trace("unknown_Release\n");
return 1;
}
static const IUnknownVtbl unknown_Vtbl =
{
unknown_QueryInterface,
unknown_AddRef,
unknown_Release
};
static IUnknown unknown = { &unknown_Vtbl };
static void test_PrintDlgExW(void)
{
PRINTPAGERANGE pagerange[2];
LPPRINTDLGEXW pDlg;
DEVNAMES *dn;
HRESULT res;
/* PrintDlgEx not present before w2k */
if (!pPrintDlgExW) {
skip("PrintDlgExW not available\n");
return;
}
/* Set CommDlgExtendedError != 0 */
PrintDlg(NULL);
SetLastError(0xdeadbeef);
res = pPrintDlgExW(NULL);
if(res == E_NOTIMPL)
{
win_skip("PrintDlgExW returns not implemented\n");
return;
}
ok( (res == E_INVALIDARG),
"got 0x%x with %u and %u (expected 'E_INVALIDARG')\n",
res, GetLastError(), CommDlgExtendedError());
@ -288,10 +432,136 @@ static void test_PrintDlgExW(void)
"got 0x%x with %u and %u (expected 'E_HANDLE')\n",
res, GetLastError(), CommDlgExtendedError());
/* nStartPage must be START_PAGE_GENERAL for the general page or a valid property sheet index */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING | PD_NOPAGENUMS;
res = pPrintDlgExW(pDlg);
ok((res == E_INVALIDARG), "got 0x%x (expected 'E_INVALIDARG')\n", res);
/* Use PD_NOPAGENUMS or set nMaxPageRanges and lpPageRanges */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok((res == E_INVALIDARG), "got 0x%x (expected 'E_INVALIDARG')\n", res);
/* this is invalid: a valid lpPageRanges with 0 for nMaxPageRanges */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING;
pDlg->lpPageRanges = pagerange;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok((res == E_INVALIDARG), "got 0x%x (expected 'E_INVALIDARG')\n", res);
/* this is invalid: NULL for lpPageRanges with a valid nMaxPageRanges */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING;
pDlg->nMaxPageRanges = 1;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok((res == E_INVALIDARG), "got 0x%x (expected 'E_INVALIDARG')\n", res);
/* this works: lpPageRanges with a valid nMaxPageRanges */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING;
pDlg->nMaxPageRanges = 1;
pDlg->lpPageRanges = pagerange;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
if (res == E_FAIL)
{
skip("No printer configured.\n");
HeapFree(GetProcessHeap(), 0, pDlg);
return;
}
ok(res == S_OK, "got 0x%x (expected S_OK)\n", res);
dn = GlobalLock(pDlg->hDevNames);
ok(dn != NULL, "expected '!= NULL' for GlobalLock(%p)\n",pDlg->hDevNames);
if (dn)
{
ok(dn->wDriverOffset, "(expected '!= 0' for wDriverOffset)\n");
ok(dn->wDeviceOffset, "(expected '!= 0' for wDeviceOffset)\n");
ok(dn->wOutputOffset, "(expected '!= 0' for wOutputOffset)\n");
ok(dn->wDefault == DN_DEFAULTPRN, "got 0x%x (expected DN_DEFAULTPRN)\n", dn->wDefault);
GlobalUnlock(pDlg->hDevNames);
}
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
/* this works also: PD_NOPAGENUMS */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING | PD_NOPAGENUMS;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok(res == S_OK, "got 0x%x (expected S_OK)\n", res);
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
/* this works: PD_RETURNDC with PD_RETURNDEFAULT */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING | PD_NOPAGENUMS | PD_RETURNDC;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok(res == S_OK, "got 0x%x (expected S_OK)\n", res);
ok(pDlg->hDC != NULL, "HDC missing for PD_RETURNDC\n");
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
DeleteDC(pDlg->hDC);
/* this works: PD_RETURNIC with PD_RETURNDEFAULT */
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_RETURNDEFAULT | PD_NOWARNING | PD_NOPAGENUMS | PD_RETURNIC;
pDlg->nStartPage = START_PAGE_GENERAL;
res = pPrintDlgExW(pDlg);
ok(res == S_OK, "got 0x%x (expected S_OK)\n", res);
ok(pDlg->hDC != NULL, "HDC missing for PD_RETURNIC\n");
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
DeleteDC(pDlg->hDC);
/* interactive PrintDlgEx tests */
if (!winetest_interactive)
{
skip("interactive PrintDlgEx tests (set WINETEST_INTERACTIVE=1)\n");
return;
}
ZeroMemory(pDlg, sizeof(PRINTDLGEXW));
pDlg->lStructSize = sizeof(PRINTDLGEXW);
pDlg->hwndOwner = GetDesktopWindow();
pDlg->Flags = PD_NOPAGENUMS | PD_RETURNIC;
pDlg->nStartPage = START_PAGE_GENERAL;
pDlg->lpCallback = &unknown;
pDlg->dwResultAction = S_OK;
res = pPrintDlgExW(pDlg);
ok(res == S_OK, "got 0x%x (expected S_OK)\n", res);
ok(pDlg->dwResultAction == PD_RESULT_PRINT, "expected PD_RESULT_PRINT, got %#x\n", pDlg->dwResultAction);
ok(pDlg->hDC != NULL, "HDC missing for PD_RETURNIC\n");
GlobalFree(pDlg->hDevMode);
GlobalFree(pDlg->hDevNames);
DeleteDC(pDlg->hDC);
HeapFree(GetProcessHeap(), 0, pDlg);
return;
}
static BOOL abort_proc_called = FALSE;
@ -376,19 +646,11 @@ end:
START_TEST(printdlg)
{
LPCSTR ptr;
ptr = load_functions();
hcomdlg32 = GetModuleHandleA("comdlg32.dll");
pPrintDlgExW = (void *) GetProcAddress(hcomdlg32, "PrintDlgExW");
test_PageSetupDlgA();
test_PrintDlgA();
test_abort_proc();
/* PrintDlgEx not present before w2k */
if (ptr) {
win_skip("%s\n", ptr);
return;
}
test_PrintDlgExW();
test_abort_proc();
}

View file

@ -17,10 +17,10 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "windef.h"
#include "winuser.h"
#include <windef.h>
#include <winuser.h>
TEMPLATE1 DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 227, 215
TEMPLATE1 DIALOG 5, 43, 227, 215
STYLE WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg"
{
@ -38,7 +38,7 @@ FONT 8, "MS Shell Dlg"
* resizing on small desk tops.
* This will work with 640x480 pixels
*/
TEMPLATE_SZ DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 300, 40
TEMPLATE_SZ DIALOG 5, 43, 300, 40
STYLE WS_CHILD | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg"
{
@ -50,7 +50,7 @@ FONT 8, "MS Shell Dlg"
}
/* note: the test program will modify coordinates and nr of controls in this template */
TEMPLATE_STC32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 11111, 0, 316, 76
TEMPLATE_STC32 DIALOG 11111, 0, 316, 76
STYLE WS_CHILD | WS_CLIPSIBLINGS
FONT 8, "MS Shell Dlg"
{

View file

@ -1,10 +1,7 @@
/* Automatically generated file; DO NOT EDIT!! */
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#define STANDALONE
#include "wine/test.h"
#include <wine/test.h>
extern void func_filedlg(void);
extern void func_finddlg(void);