Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / GetFileVersionInfo ... / 23 сообщений из 23, страница 1 из 1
24.01.2007, 20:51
    #34280297
voronk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Доброго всем дня.
Есть такой вопросик, точнее есть .dll нужно из скрипта узнать её версию.
Я тут покапался, нашёл на sybase, работает да уж больно много букв ...
Попроше никак нельзя?
Заранее благодарен.

Вот оно: http://www.sybase.com/detail?id=1002724
...
Рейтинг: 0 / 0
24.01.2007, 22:16
    #34280363
18-я весна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
voronkДоброго всем дня.
Есть такой вопросик, точнее есть .dll нужно из скрипта узнать её версию.
Я тут покапался, нашёл на sybase, работает да уж больно много букв ...
Попроше никак нельзя?
Заранее благодарен.

Вот оно: http://www.sybase.com/detail?id=1002724
А что тут сложного-то? Скопировал себе исходник и все :)

Ладно, вот то же самое, только проще :):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
$PBExportHeader$n_cst_dll.sru
forward
global type n_cst_dll from nonvisualobject
end type
end forward

global type n_cst_dll from nonvisualobject autoinstantiate
end type

type prototypes
function ulong GetFileVersionInfoSize(ref string as_Dll, ref ulong zero)  alias for "GetFileVersionInfoSizeA" Library "version.dll"
function boolean GetFileVersionInfo(ref string as_Dll, ref ulong ignore, ulong ai_len, ref string as_buf)  alias for "GetFileVersionInfoA" Library "version.dll"
function boolean VerQueryValue(ref string as_buf, ref string as_valuename, ref ulong ai_valueaddr, ref ulong ai_len)  alias for "VerQueryValueA" Library "version.dll"


end prototypes

forward prototypes
public function string of_getversion (readonly string as_dll)
end prototypes

public function string of_getversion (readonly string as_dll);
/**************************************************************************
* of_GetVersion returns version of as_dll or "!" if any error occures     *
* (C) Anatoly Moskovsky  avm@sqlbatch.com                                 *
**************************************************************************/

String ls_buf, ls_dll, ls_valname, ls_value
ls_dll = as_dll 
ulong li_bufsize, li_zero, li_addr, li_len 
li_bufsize = GetFileVersionInfoSize(ls_dll, li_zero)
If li_bufsize =  0  Then
	Return "!"
End IF
ls_buf = space(li_bufsize)

ls_valname = "\StringFileInfo\040904E4\FileVersion"
If Not GetFileVersionInfo(ls_dll, li_zero, li_bufsize, ls_buf) Then
	Return "!"
End IF

If Not VerQueryValue(ls_buf, ls_valname, li_addr, li_len) Then
	Return "!"
End IF
ls_value = String(li_addr, "address")
Return ls_value

end function

on n_cst_dll.create
TriggerEvent( this, "constructor" )
end on

on n_cst_dll.destroy
TriggerEvent( this, "destructor" )
end on
...
Рейтинг: 0 / 0
25.01.2007, 20:33
    #34283473
voronk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
24.03.2010, 12:28
    #36539200
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Подниму тему.
На PB 11.1 (а я думаю и на других версиях тоже, т.к. и на других версиях видел, что PB криво структуру об информации в файле заполняет)
вызоз с параметром "\VarFileInfo\Translation" возвращает 04091252, однако с такой кодовой страницей информации в файле нет вообще.
...
Рейтинг: 0 / 0
24.03.2010, 15:06
    #36539884
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркПодниму тему.
На PB 11.1 (а я думаю и на других версиях тоже, т.к. и на других версиях видел, что PB криво структуру об информации в файле заполняет)
вызоз с параметром "\VarFileInfo\Translation" возвращает 04091252, однако с такой кодовой страницей информации в файле нет вообще.
Да, это на всех версиях такое.
На самом деле Translation должно быть 040904E4.
Видно что 0x04E4 == 1252.
Т.е. из-за бага где-то внутри PB кодовая страница была дважды декодирована из шестнадцатиричной системы.

Поскольку во всех версиях используется одна и таже кодовая страница, то можно забить на "\VarFileInfo\Translation" и всегда искать в 040904E4

Ну либо пытаться 1252 рассматривать и как десятичное и как шестнадцатиричное и искать в обоих ветках.
...
Рейтинг: 0 / 0
24.03.2010, 15:32
    #36539969
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Уточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
...
Рейтинг: 0 / 0
24.03.2010, 16:00
    #36540119
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркУточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
Так а я про что? :)
...
Рейтинг: 0 / 0
24.03.2010, 16:40
    #36540280
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyЛокшин МаркУточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
Так а я про что? :)
Ну из моего первого поста не совсем ясно про что речь идет.
...
Рейтинг: 0 / 0
24.03.2010, 17:50
    #36540498
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
А вот тогда такой вопрос. Между данными вызовами
Код: plaintext
1.
2.
3.
4.
If Not GetFileVersionInfo(ls_dll, li_zero, li_bufsize, ls_buf) Then
	Return "!"
End IF

If Not VerQueryValue(ls_buf, ls_valname, li_addr, li_len) Then
сдается мне что есть возможность порчи буффера ls_buf? Может быть лучше ее объявлять как blob?
...
Рейтинг: 0 / 0
24.03.2010, 18:13
    #36540566
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркА вот тогда такой вопрос. Между данными вызовами
Код: plaintext
1.
2.
3.
4.
If Not GetFileVersionInfo(ls_dll, li_zero, li_bufsize, ls_buf) Then
	Return "!"
End IF

If Not VerQueryValue(ls_buf, ls_valname, li_addr, li_len) Then
сдается мне что есть возможность порчи буффера ls_buf? Может быть лучше ее объявлять как blob?
В принципе да, там должен быть блоб.
Я не помню уже почему я строку использовал (наверно в 97-98 годах, когда я этот код писал, я еще не особо ориентировался в PB). Сейчас бы я блоб использовал.
Но если подумать, то так как никаких манипуляций с ls_buf не производится после его заполнения бинарными данными, то в PB9 и ниже все должно отработать без проблем (и работает).
А вот если будет PB10+ и модификатор ";ansi" то тогда при передаче во вторую ф-ю значение ls_buf испортится.
...
Рейтинг: 0 / 0
24.03.2010, 18:24
    #36540587
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyНо если подумать, то так как никаких манипуляций с ls_buf не производится после его заполнения бинарными данными, то в PB9 и ниже все должно отработать без проблем (и работает).

Ну вообще-то, как мне кажется, PB сократит область памяти занимаемую строкой до первого нулевого байта. Ну и соответственно в оставшуюся часть с полным спокойствием что-нибудь еще записать сможет по случаю.
...
Рейтинг: 0 / 0
24.03.2010, 18:42
    #36540627
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркНу вообще-то, как мне кажется, PB сократит область памяти занимаемую строкой до первого нулевого байта. Ну и соответственно в оставшуюся часть с полным спокойствием что-нибудь еще записать сможет по случаю.
Если бы это было так, то приведенный код бы не работал, так как в указанном буфере хранятся строки в формате юникод, а там нулевых байтов - через один.

Но лучше конечно переделать на блоб, тем более что это тривиально.
...
Рейтинг: 0 / 0
24.03.2010, 18:43
    #36540629
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркPB сократит область памяти занимаемую строкой до первого нулевого байта.
Это происходит только при копировании в другую переменную или преобразовании в другой тип данных.
...
Рейтинг: 0 / 0
25.03.2010, 09:36
    #36541356
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyЛокшин МаркНу вообще-то, как мне кажется, PB сократит область памяти занимаемую строкой до первого нулевого байта. Ну и соответственно в оставшуюся часть с полным спокойствием что-нибудь еще записать сможет по случаю.
Если бы это было так, то приведенный код бы не работал, так как в указанном буфере хранятся строки в формате юникод, а там нулевых байтов - через один.

Не факт. Если область за первым нулевым байтом освобождена, но еще никем не занята, то то, что там есть спокойно может читаться. Ошибка только может возникнуть если PB для каких-либо целей захочет выделить блок памяти который придется на освобожденный и что-то туда запишет в промежутках между выховами функций, но если изменение размера памяти, выделенной под строку происходит только при копировании в другую переменную или преобразовании в другой тип, то конечно такая ситуация невозможна. Зато, если PB так обращается с памятью, то тривиально написать программу, которая съест всю память фактически заняв пару десятков байт.
Код: plaintext
1.
2.
3.
4.
5.
6.
long i
string s[ 20 ]

for i =  1  to  10 
	s[i] = space( 1024 * 1024 * 100 )
	s[i] = " "
next
Однако, как показывает эксперимент, этого не происходит, следовательно между присвоениями s[i] значений происходит перевыделение области памяти, следовательно описанная мной ситуация возможна. Как-то так.
...
Рейтинг: 0 / 0
25.03.2010, 15:03
    #36542475
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркОднако, как показывает эксперимент, этого не происходит, следовательно между присвоениями s[i] значений происходит перевыделение области памяти, следовательно описанная мной ситуация возможна. Как-то так.
При передаче строки во внешнюю ф-ю по ссылке(ref) никогда не происходит перевыделение памяти. То что ф-я записала в переданный ей буфер, так в нем и остается - никакой доп обработки не производится.

Ваш пример - совершенно другая ситуация.
При присвоении в строковую переменную другого значения всегда происходит выделение нового блока памяти (и освобождение старого), даже если новое значение меньше старого.
...
Рейтинг: 0 / 0
25.03.2010, 15:23
    #36542544
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyТо что ф-я записала в переданный ей буфер, так в нем и остается - никакой доп обработки не производится.

Чтобы в этом убедиться необходимо видеть код PB...
...
Рейтинг: 0 / 0
25.03.2010, 15:35
    #36542597
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркAnatoly MoskovskyТо что ф-я записала в переданный ей буфер, так в нем и остается - никакой доп обработки не производится.

Чтобы в этом убедиться необходимо видеть код PB...
Вовсе не обязательно. Существует куча косвенных способов.
...
Рейтинг: 0 / 0
25.03.2010, 15:54
    #36542665
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
...
Рейтинг: 0 / 0
25.03.2010, 16:19
    #36542753
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркAnatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
Например то что во внешнюю ф-ю передается адрес самой строки (в чем легко убедиться), а не временного буфера из которого потом PB бы копировал в строку, уже на 99% говорит о том что ничего там не обрабатывается после возврата из ф-и.
Оставшийся 1% подтверждается хотя бы тем что мой объект n_cst_dll работает :)
...
Рейтинг: 0 / 0
25.03.2010, 16:27
    #36542781
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyЛокшин МаркAnatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
Например то что во внешнюю ф-ю передается адрес самой строки (в чем легко убедиться), а не временного буфера из которого потом PB бы копировал в строку, уже на 99% говорит о том что ничего там не обрабатывается после возврата из ф-и.
Вовсе нет. Ничто не мешает PB проверить длинну строки после возврата и уменьшить выделенную память под нее в случае необходимости.
...
Рейтинг: 0 / 0
25.03.2010, 17:40
    #36542995
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркНичто не мешает PB проверить длинну строки после возврата и уменьшить выделенную память под нее в случае необходимости.
Это как раз легко проверить и убедиться что это не так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
long ll_i
String ls_arr[]
For ll_i =  1  To  100 
  ls_arr[ll_i] = space( 1024 * 1024 * 100 )
  // это внешняя ф-я которая копирует второй аргумент в первый завершая  0 
  modstr(ls_arr[ll_i], " ")  
Next
Если бы было так как вы предполагаете, то для работы этого цикла было бы достаточно около 100М.
Однако приложение выделяет себе на каждой итерации дополнительные 100М и вылетает после исчерпания памяти.
Тогда как следующий цикл спокойно завершается:
Код: plaintext
1.
2.
3.
4.
5.
6.
long ll_i
String ls_arr[]
For ll_i =  1  To  100 
  ls_arr[ll_i] = space( 1024 * 1024 * 100 )
  ls_arr[ll_i] = " "
Next
...
Рейтинг: 0 / 0
26.03.2010, 10:02
    #36543814
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Anatoly MoskovskyЕсли бы было так как вы предполагаете, то для работы этого цикла было бы достаточно около 100М.
Однако приложение выделяет себе на каждой итерации дополнительные 100М и вылетает после исчерпания памяти.

Ну сейчас так, а в очередном билде китайцы решат оптимизировать работу с памятью
...
Рейтинг: 0 / 0
26.03.2010, 10:54
    #36543959
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GetFileVersionInfo ...
Локшин МаркНу сейчас так, а в очередном билде китайцы решат оптимизировать работу с памятью
Вообще-то я всего лишь, как вы пожелали, продемонстрировал, что не нужно видеть исходники PB чтобы для любой конкретной версии выяснить происходит ли какая-нибудь обработка после возврата из внешней ф-и или нет. В том числе это можно будет сделать и для вашей китайской версии.
Это все никак не отменяет тот факт, что для бинарных данных надо использовать блоб, а не строку.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / GetFileVersionInfo ... / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]