【问题标题】:Send string to void将字符串发送到 void
【发布时间】: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 你是对的,我犯了一个本应迅速解决的愚蠢错误,但由于某种原因,花了太长时间才弄清楚。

标签: c++ mfc


【解决方案1】:

const char* x = (LPCTSTR) 文件名;

这种类型转换仅在您的项目针对 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 文件名 = 路径名 + 图像 + 计数器 + 图像类型;

因此,此声明:

m_statusWnd.SetWindowText(pathName);

应该显示一个空白字符串。

因此filename 将永远不会收到SHBrowseForFolder() 选择的路径。它的值将从 image 变量开始,使生成的 fileName 值相对于调用进程的当前工作目录,这解释了为什么文件相对于 VS 解决方案的文件夹被保存。

你需要改变这一行:

CString pathName = szPathName;

改为:

pathName = szPathName;

因此您将szPathName 分配给CGrabDlg 类的pathName 成员。

【讨论】:

  • 谢谢,我犯了一个愚蠢的错误。我还必须在文件名后面加上 pathName + "\\" + image + counter + imageType;但现在可以了!
  • 看看PathAddBackslash()PathCombine()PathAppend()等相关函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2015-07-02
相关资源
最近更新 更多