![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать подключен ли manifest? [WinXP]
Mixer © (2005-10-03 04:04:00)Как мне средствами Windows API в программе узнать как скомпилирована программа, с манифестом или без?
И в случае если программа использует манифест в виде [exefilename].manifest как проверить что она его юзает?
y-soft (2005-10-03 10:24:00) [1]
const
COMCTL32_DLL = 'comctl32.dll';
DLLGETVERSION_NAME = 'DllGetVersion';
MINCOMCTL32_MAJORVERSION = 6;
type
TDllVersionInfo = record
cbSize : DWORD;
dwMajorVersion : DWORD;
dwMinorVersion : DWORD;
dwBuildNumber : DWORD;
dwPlatformID : DWORD;
end;
TDllGetVersion = function(var dvi : TDllVersionInfo) : HResult; stdcall;
function IsThemed : boolean;
var
hMod : HMODULE;
dvi : TDllVersionInfo;
DllGetVersion : TDllGetVersion;
begin
Result := False;
//Если темы используются, то в любом случае
//уже загружена ComCtl32.dll
hMod := GetModuleHandle(COMCTL32_DLL);
if hMod <> 0 then
begin
//ComCtl32.dll должна экспортировать функцию DllGetVersion
DllGetVersion := GetProcAddress(hMod, DLLGETVERSION_NAME);
if assigned(DllGetVersion) then
begin
//Обязательно инициируем запись dvi!!!
dvi.cbSize := SizeOf(dvi);
//Получаем информации о версии загруженной ComCtl32.dll
if SUCCEEDED(DllGetVersion(dvi)) then
begin
//Если используются темы, то версия ComCtl32.dll не менее 6.x.x.x
if (dvi.dwMajorVersion >= MINCOMCTL32_MAJORVERSION) then
Result := True;
end;
end;
end;
end;
Пояснение: Windows не грузит ComCtl32.dll с поддержкой тем, если не находит манифест (в ресурсах или в виде отдельного файла Наименование_приложения.exe.manifest)
y-soft (2005-10-03 10:20:00) [2]Очень просто узнать. Надо проверить версию загруженной CommCtl32.dll (должна быть >= 6)
Opuhshii (2005-10-03 09:50:00) [3]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/7fad7146-edaa-4f8c-865f-1fb09080d75e.asp
вам туда....
+
http://www.delphimaster.ru/articles/themes_xp/index.html
OldNaum (2005-10-03 06:10:00) [4]мне мой ресурсвьювер говорит что тип: XP Manifest +)
искать ресурс с номер один? нет, такое не прокатит, там таких много )
хм... а каким боком через comctl? поясните, пожалуйста. что вообще под comctl имеется в виду? одна из сист. библиотек?
Mixer (2005-10-03 05:01:00) [5]Наверное точнее будет узнать каую версию comctl использует программа.
Вопрос как это сделать?
Mixer (2005-10-03 04:54:00) [6]Если смотреть ресурсэксплорером то манифест в ветке 24/1
и что получается мне искать ресурс с номером 1?
а какого типа этот ресурс не подскажете?
OldNaum (2005-10-03 04:21:00) [7]Не знаю, как средствами WinAPI, особенно если смотреть на первую часть вопроса, но есть пара решений, может пригодятся? щас наверное буду говорить глупости, но вполне реально:
1. если скомпилировано с манифестом - лезем в ресурсы (относительно поиска среди ресурсов смотрим на форуме, недавно ветки были) ищем секцию ресурсов Manifest. Нету - нету и манифеста... возможно )
2. способ извращенский ) только моя больная фантазия могла такое придумать ) берем сурсы дельфийского декомпилятора DeDe. И... узнаем какие модули были подключены при компляции ))) если есть XPMan, то опять же вероятно использовался манифест. правда большинство программеров, как я считаю, не подключают XPMan - причину можно увидеть в его сурсах, там только подключение ресурсов происходит. но вариант имеет право на сущестование как плод моего больного рассудка )
Относительно второй части вопроса сходу ничего даже и не скажу. По-моему если есть [exefilename].manifest, то exe в любом случае будет использовать манифест... Брр... все, спать )