Показать полную графическую версию : Как узнать из Bat-ника версию *.DLL, *.ax и т.п.
Dilinjer
28-08-2007, 16:45
Народ, есть ли какиенить консольные тулзы позволяющие узнать версию *.dll,*.ax и т.п. ?
Например, есть зарегестрированный divxdec.ax .
1. Как узнать из батника Путь\divxdec.ax ?
2. Как узнать версию divxdec.ax ?
Хочу написать батничек, регистрирущий и копирующий в %SystemRoot%\system32 библилотеки в случае их отсутствия, иначе необходимо сравнивать версии зарегистрированной и устанавливаемой библиотек и т.д.
Возможо ли такое ?
Dilinjer
28-08-2007, 17:07
По поводу версии файла один из вариантов: filever.exe /v %systemroot%\\system32\divxdeс.ax
А вот как узнать путь к зарегестрированной библиотеке ?
З.Ы. filever.exe расположен: Дистрибутив Хрюши\SUPPORT\TOOLS\SUPPORT.CAB
как узнать путь к зарегестрированной библиотеке ?
@echo off
SET LIB_NAME=acelpdec.ax
For /F "tokens=3" %%i In ('REG QUERY HKCR\CLSID /S^|findstr /IEC:"\\%LIB_NAME%"') Do SET LIB_PATH=%%i
Echo %LIB_PATH%
к сожалению, поиск в реестре занимает приличное время... для быстрого нахождения пути нужно знать GUID, а для нахождения GUID нужно знать путь... замкнутый круг однако
Dilinjer
29-08-2007, 11:51
amel27, я дико извеняюсь если задаю глупые вопросы, но как винда подгружает(находит) определенную библиотеку ?
Например, я кликаю мышью на фильм.avi (закодированный при помощи DivX), загружаеться плеер и декодеры(зарегестрированные библиотеки) звука и изображения (divxdec.ax), т.е. мот кто разъяснит как все это происходит ?
И еще, как тогда с помощь батничка из библиотеки GUID выцепить ?
У разных версий divxdec.ax (либо какихто других библиотек разных версий) GUID одинаковый или разный?
И еще проблема divxdec.ax может назвываться, например: divxd.ax ,т.е. отличаться от внутреннего имени файла, тогда ваш вариант не поможет (:
Хочу написать батничек, регистрирущий и копирующий в %SystemRoot%\system32 библилотеки
Как показал amel27 написание подобных bat'ников весьма нетривиально. Ко всему прочему ряд консольных утилит windows не работает со стандартными потоками, т.е. бывает попросту невозможно организовать перенаправление вывода.
Для этих задач гораздо больше подходит WSH (Windows Script Host).
Dilinjer
29-08-2007, 12:25
Должна же быть консольная тулза, читающая GUID из библиотеки ! Если ее найти, то проблем с написанием моего батничка невозникнет....
Busla, WSH изучать ради простейшей задачи - некатит :) Хотя знание WSH - весч нужная !
Dilinjer
Во-первых, на один файл может быть несколько GUID... Во вторых, путь не существует отдельно от имени, отсюда и проблема - без перебора все равно не обойтись, а перевести GUID в путь и обратно можно кучей способов, например через WMI.
как винда подгружает(находит) определенную библиотеку ?
расширение --> класс (GUID) --> путь - все в ветке HKCR
divxdec.ax может назвываться, например: divxd.ax ,т.е. отличаться от внутреннего имени файлане понял, "путь" он и есть "путь": http://msdn2.microsoft.com/en-us/library/ms682390.aspx
З.Ы. Проблема может быть в другом - некоторые системные библиотеки не включают полный путь для \System32, например ole32.dll, для учета этой возможности придется немного усложнить батник.
Dilinjer
29-08-2007, 13:02
расширение --> класс (GUID) --> путь - все в ветке HKCR
Цитата Dilinjer:divxdec.ax может назвываться, например: divxd.ax ,т.е. отличаться от внутреннего имени файла
не понял, "путь" он и есть "путь": http://msdn2.microsoft.com/en-us/library/ms682390.aspx Я имел ввиду след. например: Есть зарегистрированная библиотека (декодер DivX) C:\program files\123\123.ax(тоист взяли тупо еге переименовали с divxdec.ax в 123.ax) , я незнаю(точнее bat'ник) не имени не месторосположения данной библиотеки. Имею в наличии divxdec.ax последней версии.
Так вот bat'нику надо узнать путь и имя этой библиотеки для сравнения версий и в случае наличия свежей деинсталяции старой и установки новой библиотеки?
взяли тупо еге переименовали с divxdec.ax в 123.ax
В таком случае я вижу только два варианта - либо сравнивать библиотеки по GUID, либо по внутреннему имени... Первый хорош для DLL/OCX но не подходит для AX-файлов (они не имеют TLB-блока), поэтому остается только второй. К сожалению мне неизвестны CMD-утилиты, читающие эту инфу из файлов (есть старая, но она не понимает юникодовых тегов)... разве только через API пытаться.
Dilinjer
30-08-2007, 13:10
читающие эту инфу из файлов (есть старая, но она не понимает юникодовых тегов)...
Это Вы про filever.exe или есть еще какието CMD-шные тулзы?
А вообще для незаригистрированных DLL/OCX какой прогой CMD/GUI можно узнать GUID(GUID'ы) класса(классов) ?
З.Ы. Кстати, немного покопав реестр, решил что в ветви HKEY_CLASSES_ROOT\CLSID хранятся не GUID-ы зарегистрированных библиотек а GUID-ы классов зарегистрированных библиотек. Сами GUID-ы зарегистрированных библиотек храняться в в ветви HKEY_CLASSES_ROOT\TypeLib, но если библиотека имеет один класс то упоминание о ней в HKEY_CLASSES_ROOT\TypeLib отсутствует. Ктолибо могет подтвердить или опровергнуть сие ?
Это Вы про filever.exe или есть еще какието CMD-шные тулзы?VerInfo от angelfire (http://www.angelfire.com/va3/winmem/other_prog.html)
для незаригистрированных DLL/OCX какой прогой CMD/GUI можно узнать GUID(GUID'ы) класса(классов) ?есть библиотечка из комплекта VS6 TLBINF32.DLL, которая позволяет работать с блоками TLB, ТУТ (http://download.microsoft.com/download/vstudio60pro/doc/1/win98/en-us/tlbinf32.exe) лежит подробная справка по ней и вообще по теме. Пара простых примеров по ее использованию на VBS:
чтение TLB из файла:sFileName = "C:\WINDOWS\system32\msxml3.dll"
Set oTypeLib = CreateObject("TLI.TypeLibInfo")
If IsObject(oTypeLib) Then
oTypeLib.ContainingFile = sFileName
WScript.Echo "TLB Name:" & vbTab & oTypeLib.Name
WScript.Echo "TLB GUID:" & vbTab & oTypeLib.GUID
WScript.Echo "TLB LCID:" & vbTab & oTypeLib.LCID
WScript.Echo "TLB Ver.:" & vbTab & oTypeLib.MajorVersion & "." & oTypeLib.MinorVersion
WScript.Echo vbCRLF & "CoClasses of Library:"
WScript.Echo "---------"
For Each oTypeLibInfo In oTypeLib.CoClasses
WScript.Echo oTypeLibInfo.GUID & " : " & oTypeLibInfo.Name
Next
End If
чтение TLB из реестра:Lib_GUID = "{F5078F18-C551-11D3-89B9-0000F81FE221}"
Lib_LCID = "0"
Lib_MajorVer = "3"
Lib_MinorVer = "0"
Set oTypeLibApp = CreateObject("TLI.TLIApplication")
Set oTypeLib = oTypeLibApp.TypeLibInfoFromRegistry (Lib_GUID, Lib_MajorVer, Lib_MinorVer, Lib_LCID)
If IsObject(oTypeLib) Then
WScript.Echo "TLB Name:" & vbTab & oTypeLib.Name
WScript.Echo "TLB GUID:" & vbTab & oTypeLib.GUID
WScript.Echo "TLB LCID:" & vbTab & oTypeLib.LCID
WScript.Echo "TLB Ver.:" & vbTab & oTypeLib.MajorVersion & "." & oTypeLib.MinorVersion
WScript.Echo vbCRLF & "CoClasses of Library:"
WScript.Echo "---------"
For Each oTypeLibInfo In oTypeLib.CoClasses
WScript.Echo oTypeLibInfo.GUID & " : " & oTypeLibInfo.Name
Next
End If
запуск:cscript //NoLogo Script.vbs
Dilinjer
31-08-2007, 12:44
Вот, нарыл у мелкомягких прикольную GUI'шную тулзу - oleview.exe (http://download.microsoft.com/download/win2000platform/oleview/1.00.0.1/nt5/en-us/oleview_setup.exe) - полезный вьювер!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.