Показать сообщение отдельно
Старый 09.04.2007, 18:55     # 5
Bishop
Member
 
Аватар для Bishop
 
Регистрация: 18.08.2004
Пол: Male
Сообщения: 235

Bishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собойBishop Имеются все основания чтобы гордиться собой
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 сам адаптируй
Bishop вне форума