只有一两个程序,能够正确显示其版本号。大多数程序得到的均为" 屯屯屯……"的乱码。
原先在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; }
原先在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; }
尝试过MultiByteToWideChar,但不知如何使用才能得到正确结果,依然得到乱码。
*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;
}
感谢回复,如果我想使用.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();在这两条语句中仍然报错