我有一个在IE上使用的VC++的控件,在界面上我想将当前文件的版本显示出来,以便给用户确认版本是否正确。
我一般要在资源里面修改版本信息,然后还需要修改源程序中显示给用户看的版本字符串,这样实在太麻烦了。我希望能够通过程序获取当前文件的版本号,但是我发现使用GetFileVersionInfo函数只能够获得IE进程的版本号,根本就不是我自身的ocx文件的版本。
我一般要在资源里面修改版本信息,然后还需要修改源程序中显示给用户看的版本字符串,这样实在太麻烦了。我希望能够通过程序获取当前文件的版本号,但是我发现使用GetFileVersionInfo函数只能够获得IE进程的版本号,根本就不是我自身的ocx文件的版本。
{
HRESULT hr; struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate; CString strReturn(lpszFile);
TCHAR *pFilename = strReturn.GetBuffer(MAX_PATH); PathStripPath(pFilename);
PathRemoveExtension (pFilename);
strReturn.ReleaseBuffer();
DWORD dwSize = GetFileVersionInfoSize(lpszFile,NULL);
BYTE *pBlock = new BYTE[dwSize];
if (!GetFileVersionInfo(lpszFile,0,dwSize,pBlock))
{
delete[] pBlock;
return strReturn;
}
// Read the list of languages and code pages.
UINT cbTranslate;
VerQueryValue(pBlock,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate); // Read the file description for each language and code page. TCHAR SubBlock[50];
for(int i=0; i < (cbTranslate/sizeof(struct LANGANDCODEPAGE)); i++ )
{
hr = StringCchPrintf(SubBlock, 50,
TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
if (FAILED(hr))
{
delete[] pBlock;
}
LPVOID lpBuffer;
UINT dwBytes;
// Retrieve file description for language and code page "i".
if (VerQueryValue(pBlock,
SubBlock,
&lpBuffer,
&dwBytes))
{
//CString strR((char*)lpBuffer,dwBytes);
strReturn.SetString((TCHAR*)lpBuffer,dwBytes);
delete[] pBlock;
return strReturn;
}
}
return strReturn;
}
{
delete[] pBlock;
}
里面少了一个break;
是啊,那怎么获得ocx的hmodule呢?
GetModuleHandle(NULL)返回的是IE的