将字符串发送到void

时间:2014-08-29 20:09:45

标签: c++ mfc

我正在使用需要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;)。

1 个答案:

答案 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成员。