MFC 对话框打开文件失败(GetOpenFileName())

来源:互联网 发布:淘宝白菜价在哪 编辑:程序博客网 时间:2024/05/08 22:50

最近做了一个诊断的上位机(MFC),自己测试的时候没问题,但是发到客户那里打开文件对话框打开文件失败,之前的程序没做错误判断,所以看不到错误码。在公司的电脑上测试,win7,xp台式机,笔记本都试过,都没问题,让人感觉莫名其妙,于是上网寻求帮助,功夫不负有心人,终于搞定。

PRB: GetOpenFileName() 失败如果 lpstrFile 缓冲区不为空终止


展开全部 | 关闭全部

Collapse image症状

与 CommDlgExtendedError 的 CDERR_INITIALIZATION(0x0002),GetOpenFileName 函数将失败。
回到顶端回到顶端 | 提供反馈

Collapse image原因

OPENFILENAME 结构的 lpstrFile 缓冲区不为空终止。
回到顶端回到顶端 | 提供反馈

Collapse image解决方案

根据平台 SDK 文档中,lpstrFile 缓冲区的第一个字符必须为 NULL,如果缓冲区未使用文件名称编辑框中的初始化。
回到顶端回到顶端 | 提供反馈

Collapse image状态

此行为是设计使然。
回到顶端回到顶端 | 提供反馈

Collapse image更多信息

下面的 Win32 应用程序演示此问题:
#include <Windows.h>// If the next line is commented out, GetOpenFileName fails.//#define NULL_TERMINATEint WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,                             LPSTR szCmdLine, int nCmdShow){   longlErrMsg = 0;   OPENFILENAME ofn;   TCHAR sfile[MAX_PATH];   ZeroMemory(&ofn, sizeof(ofn));   ZeroMemory(sfile, sizeof(TCHAR)*MAX_PATH);   #ifndefNULL_TERMINATE   // Not NULL terminated.   {   int i;   for (i = 0; i < MAX_PATH; i++)   sfile[i] = ' ';   }   #else      // NULL terminated.   sfile[0] = '\0';   #endif    // Initialize OPENFILENAME structure.   ofn.lStructSize = sizeof(ofn);   ofn.hwndOwner = NULL;    ofn.lpstrFile = sfile;    ofn.nMaxFile = MAX_PATH;   ofn.lpstrFilter = NULL;   ofn.nFilterIndex = 1;   ofn.lpstrTitle = TEXT("Please Select a File");   ofn.lpstrInitialDir = NULL;   ofn.lpstrCustomFilter = NULL;   ofn.nMaxCustFilter = 0;   ofn.lpstrFileTitle = NULL;   ofn.nMaxFileTitle = 0;   ofn.nFileOffset = 0;   ofn.nFileExtension = 0;   ofn.lpstrDefExt = NULL;   ofn.lCustData = 0;   ofn.lpfnHook = 0;   ofn.lpTemplateName = 0;   ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;   // Call GetOpenFileName().   if (GetOpenFileName(&ofn))   {   MessageBox(NULL, TEXT("GetOpenFileName() Successful"), TEXT("OpenDialog"), MB_OK);   }   else   {      TCHARsErrMsg[256];      lErrMsg = CommDlgExtendedError();      wsprintf(sErrMsg,TEXT("Error %d returned from GetOpenFileName()"), lErrMsg);      MessageBox(NULL, sErrMsg, TEXT("OpenDialog"), MB_OK);   }   return lErrMsg;}
回到顶端回到顶端 | 提供反馈

sfile = '\0'; 这个是必须的,增加这条代码后客户反映程序运行正常,由于自己是小白,自学MFC很多东西还要继续学习,记录学习的点点滴滴。

0 0
原创粉丝点击