Windows 带有钩子的OpenFileName导致CDERR\u对话框失败
我从GetOpenFileName中得到一个错误CDERR\U DIALOGFAILURE。这是密码 //在WndProcWindows 带有钩子的OpenFileName导致CDERR\u对话框失败,windows,templates,getopenfilename,Windows,Templates,Getopenfilename,我从GetOpenFileName中得到一个错误CDERR\U DIALOGFAILURE。这是密码 //在WndProc LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance; switch (message) { case WM_CREATE:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HINSTANCE hInstance;
switch (message)
{
case WM_CREATE:
hInstance = (HINSTANCE) GetWindowLong (hWnd, GWL_HINSTANCE);
//WndProc内的消息处理中
case ID_READ_LOG_FILE:
{
OPENFILENAME ofn;
char fn[MAX_PATH]="\0";
char filter[32]="Text Files\0*.TXT;\0\0";
char title[]="Open Log File";
char defext[]="TXT";
int status;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.hInstance = hInstance;
ofn.lpstrFilter = filter;
ofn.nFilterIndex = 0;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter = 0 ;
ofn.lpstrFile = fn;
ofn.nMaxFile = sizeof(fn);
ofn.lpstrFileTitle = NULL;
if (ReadLogFileLastDir[0] == '\0')
{
SHGetSpecialFolderPath (NULL,ReadLogFileLastDir,0x0005,false);
};
ofn.lpstrInitialDir = ReadLogFileLastDir;
ofn.lpstrTitle = title;
ofn.Flags = OFN_FILEMUSTEXIST |
OFN_PATHMUSTEXIST |
OFN_EXPLORER |
OFN_ENABLETEMPLATE |
OFN_ENABLESIZING |
OFN_ENABLEHOOK ;
ofn.lpstrDefExt = NULL;
ofn.lpfnHook = HookFileOpen;
ofn.lCustData = 1234; // just for fun
ofn.lpTemplateName = MAKEINTRESOURCE(IDD_HOOKFILEOPEN);
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = defext;
status = GetOpenFileName (&ofn);
if (status == 0)
{
DWORD iStat, z;
iStat = CommDlgExtendedError();
if (iStat == CDERR_DIALOGFAILURE)
//对话框过程看起来像这样,但从未被调用
UINT_PTR CALLBACK HookFileOpen (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
我不知道到底需要什么,但我修改了对话框,使其成为具有剪辑同级的子对象,并删除了所有其他样式和扩展样式,现在它可以工作。我不知道确切需要什么,但我修改了对话框,使其成为具有剪辑同级的子对象,并删除了所有其他样式和扩展样式,现在它可以工作了有效。我有另一个版本可以使用。我认为问题可能是,在这个程序中,sizeof(ofn)是76,而在一个有效的程序中,它是88。我曾尝试在include for windows.h和Commdlg.h前面放置一个#define _WIN32_WINNT 0x0500,但没有效果。在我的rc文件中似乎有一个include windows.h,所以可能会优先?我在StdAfx.h中添加了一个#define _WIN32 _winnt0x0500,现在sizeof(ofn)是88,但我仍然得到了CDERR_对话框failure.:-(好的,我将对话框更改为具有剪辑兄弟的子对话框,并删除了所有其他样式,现在它可以工作了。我有另一个版本可以工作。我认为问题可能是大小(ofn)在这个程序中是76,而在一个有效的程序中是88。我曾尝试在include for windows.h和Commdlg.h前面放一个#define(定义)WINNT 0x0500,但没有用。我的rc文件中似乎有一个include windows.h,所以可能优先?我在StdAfx.h中添加了一个#define(定义)WIN32(WINNT 0x0500,现在是sizeof(ofn)是88,但我仍然得到CDERR_对话框失败:-(好的,我将对话框更改为具有剪辑兄弟姐妹的子对话框,并删除了所有其他样式,现在它可以工作了。