只有一两个程序,能够正确显示其版本号。大多数程序得到的均为" 屯屯屯……"的乱码。
原先在VC6上编译的项目,在VS2008中加载,项目字符类型为“多字节字符类型”相关代码如下: UpdateData();
m_ctlPath = dlg.GetPathName();
m_ctlName = dlg.GetFileName();
SetDlgItemText(IDC_EDIT_PATH,(LPCSTR)&m_ctlPath);
UpdateData(FALSE);
CHAR name[126];
memset(name,0,126);
lstrcpy(name,m_ctlName);
CString ver = ReadFileVersion((LPTSTR)name);
MessageBox(ver);
CString CUpdateTocDlg::ReadFileVersion(LPTSTR m_lpszImageName)
{
CString m_strImage; 
DWORD m_dwHandle; 
DWORD m_dwSize; 
LPVOID m_lpBuffer; 
LPVOID m_lpData; 
UINT m_uiDataSize;  m_dwHandle = 0;   
m_uiDataSize = 80;    m_lpData = malloc(m_uiDataSize);   
   
m_dwSize = ::GetFileVersionInfoSize(m_lpszImageName, &m_dwHandle);   
m_lpBuffer = malloc(m_dwSize);    ::GetFileVersionInfo(m_lpszImageName, 0, m_dwSize, m_lpBuffer);     CString strFileVer;        ::VerQueryValue(m_lpBuffer,   
                     TEXT("\\StringFileInfo\\080404B0\\FileVersion"),
                     &m_lpData,
                     &m_uiDataSize);  strFileVer.Format("%s",m_lpData);
 strFileVer.Replace(",",".");
 free(m_lpBuffer);  return strFileVer; }

解决方案 »

  1.   

    为什么不用Unicode的字符类型呢?
      

  2.   

    在项目中使用了几个第三方的类,vc6中用正常。如果在VS08中选成UNICODE类型,会出现大量错误,所以就懒了没有修改。
      

  3.   


    尝试过MultiByteToWideChar,但不知如何使用才能得到正确结果,依然得到乱码。
      

  4.   

    /*
    *UNICODE下 CString转换成Char*
    *@param StrChar: 转换后的char*
    *@param CStr:待转换的CString
    *@param CharLen:Char数组的长度
    */
    void wideTOmul(char* StrChar, const CString CStr, int CharLen)
    {
     char* pTargetData = NULL;
     int   targetLen=WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,0,NULL,NULL);                                      
     pTargetData = new char[targetLen+1];                      
     memset(pTargetData,0,targetLen+1);                                  
     WideCharToMultiByte(CP_ACP,0,CStr,-1,pTargetData,targetLen,NULL,NULL);   
     sprintf(StrChar, "%s", pTargetData);// CharLen:.net才需要CharLen作为第二个参数
     delete []pTargetData;
    }//UNICODE下 Char*转换成CString//功能:将char* 转换为CString
    //参数:待转换的char*
    //返回值:转换后的CString
    CString mulTOwide(char* result)
    {
        //将char 转换为 CString字符
        DWORD dwNum = MultiByteToWideChar(CP_ACP, 0, result, -1, NULL, 0);
        wchar_t *pwText;
        pwText = new wchar_t[dwNum];
        if(!pwText)
        {
            delete []pwText;
            return _T("");//暂时这样处理
        }
        MultiByteToWideChar (CP_ACP, 0, result, -1, pwText, dwNum);// 开始转换
        CString cstr=pwText;
        return cstr;
    }
      

  5.   


    感谢回复,如果我想使用.Net的部份托管代码,报错怎么处理呢.我在项目属性中已添加/clr选项,在源文件加入了#using <System.dll>和#using <mscorlib.dll>
    并 using namespace System;
    可好像并没有成功导入该命名空间。System::Diagnostics::FileVersionInfo ^pFile=System::Diagnostics::FileVersionInfo::GetVersionInfo((String)StrFileName);
    String ^Info=pFile->GetFileVersion();在这两条语句中仍然报错