如何从ActiveX控件内的VS_VERSION_INFO获取信息

时间:2009-03-30 15:03:46

标签: winapi visual-c++ activex

有没有办法从同一个应用程序中的VS_VERSION_INFO(例如FILEVERSION)中提取信息? 我知道,你可能正在思考:    1. GetModuleFileName(...)
   2. GetFileVersionInfoSize(...)
   3. GetFileVersionInfo(...)
   4. VerQueryValue(...)
但!有一个“扭曲”:我需要使用activex控件来提取它自己的版本。因此GetModuleFileName不会返回正确的文件名,它将是父应用程序名称,因此版本信息也将来自父应用程序,而不是activex控件。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这是为我工作的代码(是的,它适用于MFC ActiveX控件):

CString modFilename;
if(GetModuleFileName(AfxGetInstanceHandle(), modFilename.GetBuffer(MAX_PATH), MAX_PATH) > 0)
{
    modFilename.ReleaseBuffer(MAX_PATH);
    DWORD dwHandle = 0;
    DWORD dwSize = GetFileVersionInfoSize(modFilename, &dwHandle);
    if(dwSize > 0)
    {
        LPBYTE lpInfo = new BYTE[dwSize];
        ZeroMemory(lpInfo, dwSize);
        if(GetFileVersionInfo(modFilename, 0, dwSize, lpInfo))
        {
            //// Use the version information block to obtain the FILEVERSION.
                            //// This will extract language specific part of versio resources. 040904E4 is English(US) locale, 
                            //// it should match to your project
            //UINT valLen = MAX_PATH;
            //LPVOID valPtr = NULL;
            //if(::VerQueryValue(lpInfo, 
            //  TEXT("\\StringFileInfo\\040904E4\\FileVersion"),
            //  &valPtr,
            //  &valLen))
            //{
            //  CString valStr((LPCTSTR)valPtr);

            //  AfxMessageBox(valStr);
            //}

                            //// This will extract so called FIXED portion of the version info
            UINT valLen = MAX_PATH;
            LPVOID valPtr = NULL;
            if(::VerQueryValue(lpInfo, 
                TEXT("\\"),
                &valPtr,
                &valLen))
            {
                VS_FIXEDFILEINFO* pFinfo = (VS_FIXEDFILEINFO*)valPtr;

                // convert to text
                CString valStr;
                valStr.Format(_T("%d.%d.%d.%d"), 
                    (pFinfo->dwFileVersionMS >> 16) & 0xFFFF,
                    (pFinfo->dwFileVersionMS) & 0xFFFF,
                    (pFinfo->dwFileVersionLS >> 16) & 0xFFFF,
                    (pFinfo->dwFileVersionLS) & 0xFFFF
                    );

                AfxMessageBox(valStr);
            }
        }
        delete[] lpInfo;
    }
}

答案 1 :(得分:1)

在步骤1中,您可以调用GetModuleFileName并传入DLL的hModule。你得到了DllMain()中的hModule:

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DWORD length = ::GetModuleFileName(hInstance, fullFilename, MAX_PATH);
        // ...
    }
}