如何获得嵌入式 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 控件的版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据浏览器在同一页面上嵌入 32 位或 64 位 ActiveX 控件?

如何删除ActiveX控件

非 IE WebBrowser ActiveX 控件

关于activex控件问题

ActiveX控件自动更新,数字签名突破IE安全限制

如何开发ActiveX控件