shift_on_line,
там описание программы и версия файла.
На C++ это выглядит так (использовался код отсюда и отсюда):
Код:
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <Psapi.h>
#include <strsafe.h>
void PrintProcessNameAndID(DWORD processID)
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
TCHAR szDescription[MAX_PATH];
TCHAR szVersion[MAX_PATH];
// Get a handle to the process.
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID);
// Get the process name.
if (NULL != hProcess)
{
// файл образа
GetModuleFileNameEx(hProcess, NULL, szProcessName, MAX_PATH);
DWORD temp, sizeInfo;
sizeInfo = GetFileVersionInfoSize(szProcessName, &temp);
if (sizeInfo == 0) // не содержит информации о версии
return;
void *pData = new char[sizeInfo];
void *lplpBuffer = new char[sizeInfo];
GetFileVersionInfo(szProcessName, 0, sizeInfo, pData);
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslate;
// список языков, на которых представлена инфа
VerQueryValue(pData,
TEXT("\\VarFileInfo\\Translation"),
(LPVOID*)&lpTranslate,
&cbTranslate);
// описание файла
TCHAR SubStr[50];
StringCchPrintf(SubStr, 50,
TEXT("\\StringFileInfo\\%04x%04x\\FileDescription"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);// хватит одного
VerQueryValue(pData, SubStr, &lplpBuffer, (PUINT)&temp);
if (temp > 0)
wcscpy_s(szDescription, MAX_PATH, (wchar_t *)lplpBuffer);
// версия файла
StringCchPrintf(SubStr, 50,
TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);// хватит одного
VerQueryValue(pData, SubStr, &lplpBuffer, (PUINT)&temp);
if (temp > 0)
wcscpy_s(szVersion, MAX_PATH, (wchar_t *)lplpBuffer);
delete pData;
_tprintf(TEXT("%s %s \n"), szDescription, szVersion);
}
CloseHandle(hProcess);
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
return 1;
cProcesses = cbNeeded / sizeof(DWORD);
for (UINT i = 0; i < cProcesses; i++)
PrintProcessNameAndID(aProcesses[i]);
return 0;
}
Хотя, как-то коряво вышло. Чисто для демонстрации. А на Delphi сам адаптируй :)
|