Dilinjer |
28-08-2007 16:45 634311 |
Как узнать из Bat-ника версию *.DLL, *.ax и т.п.
Народ, есть ли какиенить консольные тулзы позволяющие узнать версию *.dll,*.ax и т.п. ?
Например, есть зарегестрированный divxdec.ax .
1. Как узнать из батника Путь\divxdec.ax ?
2. Как узнать версию divxdec.ax ?
Хочу написать батничек, регистрирущий и копирующий в %SystemRoot%\system32 библилотеки в случае их отсутствия, иначе необходимо сравнивать версии зарегистрированной и устанавливаемой библиотек и т.д.
Возможо ли такое ?
|
Dilinjer |
28-08-2007 17:07 634324 |
По поводу версии файла один из вариантов: filever.exe /v %systemroot%\\system32\divxdeс.ax
А вот как узнать путь к зарегестрированной библиотеке ?
З.Ы. filever.exe расположен: Дистрибутив Хрюши\SUPPORT\TOOLS\SUPPORT.CAB
|
amel27 |
29-08-2007 02:57 634565 |
Цитата:
Цитата Dilinjer
как узнать путь к зарегестрированной библиотеке ?
|
Код:
@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 634730 |
amel27, я дико извеняюсь если задаю глупые вопросы, но как винда подгружает(находит) определенную библиотеку ?
Например, я кликаю мышью на фильм.avi (закодированный при помощи DivX), загружаеться плеер и декодеры(зарегестрированные библиотеки) звука и изображения (divxdec.ax), т.е. мот кто разъяснит как все это происходит ?
И еще, как тогда с помощь батничка из библиотеки GUID выцепить ?
У разных версий divxdec.ax (либо какихто других библиотек разных версий) GUID одинаковый или разный?
И еще проблема divxdec.ax может назвываться, например: divxd.ax ,т.е. отличаться от внутреннего имени файла, тогда ваш вариант не поможет (:
|
Цитата:
Цитата Dilinjer
Хочу написать батничек, регистрирущий и копирующий в %SystemRoot%\system32 библилотеки
|
Как показал amel27 написание подобных bat'ников весьма нетривиально. Ко всему прочему ряд консольных утилит windows не работает со стандартными потоками, т.е. бывает попросту невозможно организовать перенаправление вывода.
Для этих задач гораздо больше подходит WSH (Windows Script Host).
|
Dilinjer |
29-08-2007 12:25 634759 |
Должна же быть консольная тулза, читающая GUID из библиотеки ! Если ее найти, то проблем с написанием моего батничка невозникнет....
Busla, WSH изучать ради простейшей задачи - некатит :) Хотя знание WSH - весч нужная !
|
amel27 |
29-08-2007 12:45 634775 |
Dilinjer
Во-первых, на один файл может быть несколько GUID... Во вторых, путь не существует отдельно от имени, отсюда и проблема - без перебора все равно не обойтись, а перевести GUID в путь и обратно можно кучей способов, например через WMI.
Цитата:
Цитата Dilinjer
как винда подгружает(находит) определенную библиотеку ?
|
расширение --> класс (GUID) --> путь - все в ветке HKCR
Цитата:
Цитата Dilinjer
divxdec.ax может назвываться, например: divxd.ax ,т.е. отличаться от внутреннего имени файла
|
не понял, "путь" он и есть "путь": http://msdn2.microsoft.com/en-us/library/ms682390.aspx
З.Ы. Проблема может быть в другом - некоторые системные библиотеки не включают полный путь для \System32, например ole32.dll, для учета этой возможности придется немного усложнить батник.
|
Dilinjer |
29-08-2007 13:02 634794 |
Я имел ввиду след. например: Есть зарегистрированная библиотека (декодер DivX) C:\program files\123\123.ax(тоист взяли тупо еге переименовали с divxdec.ax в 123.ax) , я незнаю(точнее bat'ник) не имени не месторосположения данной библиотеки. Имею в наличии divxdec.ax последней версии.
Так вот bat'нику надо узнать путь и имя этой библиотеки для сравнения версий и в случае наличия свежей деинсталяции старой и установки новой библиотеки?
|
amel27 |
30-08-2007 11:17 635476 |
Цитата:
Цитата Dilinjer
взяли тупо еге переименовали с divxdec.ax в 123.ax
|
В таком случае я вижу только два варианта - либо сравнивать библиотеки по GUID, либо по внутреннему имени... Первый хорош для DLL/OCX но не подходит для AX-файлов (они не имеют TLB-блока), поэтому остается только второй. К сожалению мне неизвестны CMD-утилиты, читающие эту инфу из файлов (есть старая, но она не понимает юникодовых тегов)... разве только через API пытаться.
|
Dilinjer |
30-08-2007 13:10 635593 |
Цитата:
Цитата amel27
читающие эту инфу из файлов (есть старая, но она не понимает юникодовых тегов)...
|
Это Вы про filever.exe или есть еще какието CMD-шные тулзы?
А вообще для незаригистрированных DLL/OCX какой прогой CMD/GUI можно узнать GUID(GUID'ы) класса(классов) ?
З.Ы. Кстати, немного покопав реестр, решил что в ветви HKEY_CLASSES_ROOT\CLSID хранятся не GUID-ы зарегистрированных библиотек а GUID-ы классов зарегистрированных библиотек. Сами GUID-ы зарегистрированных библиотек храняться в в ветви HKEY_CLASSES_ROOT\TypeLib, но если библиотека имеет один класс то упоминание о ней в HKEY_CLASSES_ROOT\TypeLib отсутствует. Ктолибо могет подтвердить или опровергнуть сие ?
|
amel27 |
31-08-2007 04:34 636062 |
Цитата:
Цитата Dilinjer
Это Вы про filever.exe или есть еще какието CMD-шные тулзы?
|
VerInfo от angelfire
Цитата:
Цитата Dilinjer
для незаригистрированных DLL/OCX какой прогой CMD/GUI можно узнать GUID(GUID'ы) класса(классов) ?
|
есть библиотечка из комплекта VS6 TLBINF32.DLL, которая позволяет работать с блоками TLB, ТУТ лежит подробная справка по ней и вообще по теме. Пара простых примеров по ее использованию на 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 636281 |
Вот, нарыл у мелкомягких прикольную GUI'шную тулзу - oleview.exe - полезный вьювер!
|
Время: 19:18.
© OSzone.net 2001-