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

文章详细介绍了在使用MFC开发上位机时遇到的打开文件对话框失败问题,并通过分析OPENFILENAME结构的lpstrFile缓冲区不为空终止的原因,提供了有效的解决方案,最终成功解决了问题。

最近做了一个诊断的上位机(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_TERMINATE

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, 
                            LPSTR szCmdLine, int nCmdShow)
{
   long	lErrMsg = 0;
   OPENFILENAME ofn;
   TCHAR sfile[MAX_PATH];

   ZeroMemory(&ofn, sizeof(ofn));

   ZeroMemory(sfile, sizeof(TCHAR)*MAX_PATH);

   #ifndef	NULL_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
   {
      TCHAR		sErrMsg[256];
      lErrMsg = CommDlgExtendedError();
      wsprintf(sErrMsg,TEXT("Error %d returned from GetOpenFileName()"), lErrMsg);
      MessageBox(NULL, sErrMsg, TEXT("OpenDialog"), MB_OK);
   }

   return lErrMsg;
}
				

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值