2010-04-09 3 views
0

Я работаю над получением версии программного обеспечения, которое установлено на компьютере. Я внедрил логику для чтения реестра утилит Uninstall, но я заметил, что некоторые из программ не имеют записей о версии в утине реестра реестра. Но я хочу также показать версию этих программ.Как получить версию программного обеспечения?

Может ли кто-нибудь помочь мне в этом отношении?

ответ

4

Поставка версии программного обеспечения в реестр Windows является добровольной. Если разработчик программного обеспечения, на который вы смотрите, решил не отображать версию там или просто не знал о такой возможности, я не могу указать вам на другое место, которое он предпочтет использовать или знать. Фактически, программное обеспечение может даже не иметь номер версии/имя.

1

Я бы сказал, посмотрите информацию о версии файла. И вы можете найти this article полезную информацию о том, как диалоговое окно «Установка и удаление программ» получает информацию.

+0

+1 Я также установил информацию о версии файла с помощью этого инструмента http://www.elphin.com/downloads/stampver/. – kenny

+0

Спасибо, Мартин, я уже посетил эту статью. Под этим соглашением можно запросить размер установки, частоту использования, но как идти о версии, я не уверен ... – Devloper

3

Задайте себе это: Где еще находится подробная информация о версии программного обеспечения, если нет в реестре? Если он доступен в другом месте, кроме реестра, спросите нас, можете ли вы получить эту деталь с помощью C++. Я думаю, это будет лучшим подходом для решения вашей проблемы.


Добавлена ​​информация ниже, так как OP ищет версию файла

Смотрите, если приведенный ниже код может помочь вам.

CString GetFileVersionInfo(CString strFile, CString strProperty) 
{ 
    int rc; 
    UINT nLen; 
    DWORD nSize; 
    DWORD dwHandle = 0; 
    CString strBuffer; 
    CString strValue; 
    CString strBlock; 
    void *lpPropertyBuffer; 

    struct LANGANDCODEPAGE 
    { 
     WORD wLanguage; 
     WORD wCodePage; 
    } *lpTranslate; 

    nSize = GetFileVersionInfoSize(strFile.GetBuffer(strFile.GetLength()), &dwHandle); 
    ::GetFileVersionInfo(strFile.GetBuffer(strFile.GetLength()), 0, nSize, strBuffer.GetBuffer(nSize)); 

    // Read the list of languages and code pages. 
    if (VerQueryValue(strBuffer.GetBuffer(strBuffer.GetLength()), "\\VarFileInfo\\Translation", (LPVOID *) &lpTranslate, &nLen)) 
    { 
     strBlock.Format("\\StringFileInfo\\%04x%04x\\%s", 
      lpTranslate->wLanguage, 
      lpTranslate->wCodePage, 
      strProperty); 
     rc = VerQueryValue(strBuffer.GetBuffer(strBuffer.GetLength()), strBlock.GetBuffer(nSize), &lpPropertyBuffer, &nLen); 
     if (rc != 0 && nLen > 0) 
     { 
      strncpy(strValue.GetBuffer(nLen + 1), (char *) lpPropertyBuffer, nLen); 
      strValue.ReleaseBuffer(nLen); 
     } 
    } 

    return strValue; 
} 

пользовательский вариант.lib при связывании и вам может потребоваться winver.h для компиляции. Вы можете вызвать функцию как этого

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 

    // initialize MFC and print and error on failure 
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 
    { 
     // TODO: change error code to suit your needs 
     cerr << _T("Fatal Error: MFC initialization failed") << endl; 
     nRetCode = 1; 
    } 
    else 
    { 
     AfxMessageBox(GetFileVersionInfo("shell32.dll", "ProductVersion")); 
    } 

    return nRetCode; 
} 
+0

Я могу получить информацию, если каким-то образом мы сможем узнать местоположение исполняемого файла, прочитав информацию о версии файла. Но путь удаления, присутствующий в реестре, несовместим. – Devloper

+0

Я отредактировал мое сообщение. Посмотрите, полезен ли приведенный выше код. Источник: http://beta.unclassified.de/code/cpp/getfileversion/GetFileVersion.cpp – bdhar

+0

спасибо bdhar. Но как получить путь к файлу. – Devloper

0

Если разработчики программного обеспечения решили не добавлять информации о версии в информацию Uninstall, а затем нет надежного способа получить его.

Вы можете попытаться найти, где приложение было установлено. Но даже если у вас есть путь, приложение может состоять из нескольких файлов .exe, которые могут иметь разные версии и имена продуктов. Если вы добавите библиотеки DLL в список кандидатов для получения информации о версии, ваши результаты станут еще менее предсказуемыми.