如何获得嵌入式 IE ActiveX 控件的版本?
Posted
技术标签:
【中文标题】如何获得嵌入式 IE ActiveX 控件的版本?【英文标题】:How to get a version of the embedded IE ActiveX control? 【发布时间】:2014-05-03 19:40:10 【问题描述】:我刚刚在我的 C++ (MFC) 应用程序中嵌入了一个 IE/Web 浏览器 ActiveX 控件。我很好奇如何获得用于它的 IE 版本?
【问题讨论】:
从桌面启动 IE 并使用帮助 + 关于。 @HansPassant:非常有趣。 This answer 到相关问题可能会有所帮助。 【参考方案1】:这有点像 hack,但您可以使用 mshtml.dll
,它是任何 IE 控件的 integral part,并检索其版本。接下来是我的一个项目中的代码 sn-p:
#define SIZEOF(f) (sizeof(f) / sizeof(f[0]))
HMODULE hModMshtl = ::GetModuleHandle(L"mshtml.dll");
if(hModMshtl)
TCHAR buffMshtl[MAX_PATH];
buffMshtl[0] = 0;
::GetModuleFileName(hModMshtl, buffMshtl, SIZEOF(buffMshtl));
buffMshtl[SIZEOF(buffMshtl) - 1] = 0;
CString strProdName;
VS_FIXEDFILEINFO vi;
if(GetFileVersionAndProductName(buffMshtl, &vi, &strProdName))
//Got it
_tprintf(L"%s v.%d.%d.%d.%d",
strProdName.GetString(),
(DWORD)((vi.dwProductVersionLS & 0xFFFF0000) >> 16),
(DWORD)(vi.dwProductVersionLS & 0xFFFF),
(DWORD)((vi.dwProductVersionMS & 0xFFFF0000) >> 16),
(DWORD)(vi.dwProductVersionMS & 0xFFFF)
);
您可以通过以下方式获得它的版本:
BOOL GetFileVersionAndProductName(LPCTSTR pFilePath, VS_FIXEDFILEINFO* pOutVersionInfo, CString* pOutProductName)
BOOL bRes = FALSE;
CString strFilePath = pFilePath;
LPCTSTR pDescBuf = NULL;
struct LANGANDCODEPAGE
WORD wLanguage;
WORD wCodePage;
;
CString strProdName;
BYTE* pData = NULL;
if(!strFilePath.IsEmpty())
//Get size needed
DWORD dwDummy;
DWORD dwSz = ::GetFileVersionInfoSize((LPTSTR)strFilePath.GetString(), &dwDummy);
if(dwSz > 0)
//Reserve mem
pData = new (std::nothrow)BYTE[dwSz];
if(pData)
//Retrieve version info
if(::GetFileVersionInfo((LPTSTR)strFilePath.GetString(), NULL, dwSz, pData))
UINT nczBufLn;
VS_FIXEDFILEINFO* pVi = NULL;
if(VerQueryValue(pData, _T("\\"), (VOID**)&pVi, &nczBufLn))
if(pVi &&
nczBufLn >= sizeof(*pVi) &&
pVi->dwSignature == 0xFEEF04BD)
//Got it
bRes = TRUE;
if(pOutVersionInfo)
*pOutVersionInfo = *pVi;
struct LANGANDCODEPAGE
WORD wLanguage;
WORD wCodePage;
*lpTranslate = NULL;
// Read the list of languages and code pages.
UINT cbTranslate;
if(VerQueryValue(pData, L"\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate))
//Get first language
if(lpTranslate &&
cbTranslate >= sizeof(*lpTranslate))
//Retrieve product name
CString strBlock;
strBlock.Format(L"\\StringFileInfo\\%04x%04x\\ProductName",
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
UINT dwProdLn = 0;
VOID* lpBufferName = NULL;
if(VerQueryValue(pData, strBlock, &lpBufferName, &dwProdLn))
//Get name
memcpy(strProdName.GetBufferSetLength(dwProdLn), lpBufferName, dwProdLn * sizeof(TCHAR));
strProdName.ReleaseBuffer();
if(pOutProductName)
*pOutProductName = strProdName;
//Free mem
if(pData)
delete[] pData;
return bRes;
【讨论】:
以上是关于如何获得嵌入式 IE ActiveX 控件的版本?的主要内容,如果未能解决你的问题,请参考以下文章