【发布时间】:2014-08-29 20:09:45
【问题描述】:
我正在使用需要 MFC 的 SDK 编写图像采集 GUI。我对 C++ 中的 MFC 不是很熟悉,但我已经足够创建一个目录选择器来保存文件。问题是我制作的 MFC 按钮返回 TCHAR,SDK 需要 const char* 作为输入。当我运行我的程序时,图像被发送到 VS 解决方案所在的目录,而不是我分配路径的位置。
我将包含以下代码:
void CGrabDlg::OnGrab()
{
m_statusWnd.SetWindowText("Grabing...");
if(m_Xfer->Grab())
{
UpdateMenu();
// TODO: Add your control notification handler code here
int m_StartFrame;
const char* m_Options="-format tiff";
int fileCount=1;
while(fileCount<10)
{
CString counter; //file counter
CString image = "image";
counter.Format("%03d",fileCount);
CString imageType = ".tiff";
CString fileName = pathName + image + counter + imageType;
const char* x = (LPCTSTR) fileName;
fileCount++;
m_StartFrame = (m_Buffers == NULL) ? 0 : m_Buffers->GetIndex();
m_Buffers->Next();
m_Buffers->Save(x, m_Options);
m_statusWnd.SetWindowText(pathName);
}
}
}
这是我一起破解的目录选择器:
void CGrabDlg::OnBnClickedChooseDir()
{
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(bi));
TCHAR szDisplayName[MAX_PATH];
szDisplayName[0] = '\0';
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = _T("Please select a folder for storing acquired images :");
//bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.ulFlags = BIF_USENEWUI;
bi.lParam = NULL;
bi.iImage = 0;
CoInitialize(NULL);
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
TCHAR szPathName[MAX_PATH];
if (NULL != pidl)
{
BOOL bRet = SHGetPathFromIDList(pidl,szPathName);
if(FALSE == bRet)
return;
AfxMessageBox(szPathName);
CString pathName = szPathName;
m_statusWnd.SetWindowText(szPathName);
}
}
Window 文本返回正确的路径目录 (m_statusWnd.SetWindowText(szPathName);),但是当我尝试将路径附加到最终输入以保存到图像时,它不存在(CString fileName = pathName + image + 计数器 + 图像类型;)。
【问题讨论】:
-
如果通过程序调试会发生什么?路径片段之间是否存在正确的路径分隔符?
-
pathName中使用的CGrabDlg::OnGrab是什么?它在哪里声明,在哪里初始化?显然,它与CGrabDlg::OnBnClickedChooseDir中的pathName不同 - 一个是局部变量。 -
@Igor 我在头文件中将它声明为公共 CString,这两个函数都在同一个 cpp 文件中。虽然有可能我很密集。
-
CString pathName = szPathName;行定义了一个局部变量,与CGrabDlg::pathName成员变量无关(我假设它存在,尽管您的代码没有显示它)。局部变量已初始化,但之后不再使用。成员变量永远不会被触及,并且可能包含一个空字符串。 -
@Igor 你是对的,我犯了一个本应迅速解决的愚蠢错误,但由于某种原因,花了太长时间才弄清楚。