Как получить информацию от VS_VERSION_INFO в элементе управления ActiveX - PullRequest
0 голосов
/ 30 марта 2009

Есть ли способ извлечь информацию из VS_VERSION_INFO (например, FILEVERSION) внутри одного и того же приложения? Я знаю, вы, вероятно, думаете на пути:
1. GetModuleFileName (...)
2. GetFileVersionInfoSize (...)
3. GetFileVersionInfo (...)
4. VerQueryValue (...)
НО! Есть «поворот»: мне нужно сделать элемент управления ActiveX, чтобы извлечь его собственную версию. Таким образом, GetModuleFileName не вернет правильное имя файла, это будет имя родительского приложения, поэтому информация о версии будет также из родительского приложения, а не элемента управления activex.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 30 марта 2009

Вот код, который работал для меня (да, это для управления 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 голос
/ 30 марта 2009

На шаге 1 вы можете вызвать GetModuleFileName и передать hModule вашей DLL. Вы получаете hModule в DllMain ():

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DWORD length = ::GetModuleFileName(hInstance, fullFilename, MAX_PATH);
        // ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...