我正在使用需要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 + counter + imageType;)。
答案 0 :(得分:4)
const char * x =(LPCTSTR)fileName;
只有在为ANSI编译项目时才会使用这种类型转换,其中TCHAR
映射到char
。如果改为编译Unicode,TCHAR
将映射到wchar_t
,而您无法将wchar_t*
分配给char*
,则必须使用WideCharToMultiByte()
进行转换从UTF-16到ANSI的数据。
if (NULL != pidl) { ... CString pathName = szPathName; m_statusWnd.SetWindowText(szPathName); }
您正在将szPathName
分配给与此声明中使用的pathName
变量不同的本地临时pathName
变量:
CString fileName = pathName + image + counter + imageType;
就这样,这句话:
m_statusWnd.SetWindowText(pathName);
应显示空白字符串。
因此,filename
永远不会收到使用SHBrowseForFolder()
选择的路径。它的值将从image
变量开始,使得结果fileName
值相对于调用进程的当前工作目录,这解释了为什么文件相对于VS保存的原因解决方案的文件夹。
您需要更改此行:
CString pathName = szPathName;
改为:
pathName = szPathName;
因此,您要将szPathName
分配给pathName
班级的CGrabDlg
成员。