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

Вот оно: http://www.sybase.com/detail?id=1002724
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #34280363
18-я весна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
GetFileVersionInfo ...
    #34283473
Фотография voronk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
GetFileVersionInfo ...
    #36539200
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему.
На PB 11.1 (а я думаю и на других версиях тоже, т.к. и на других версиях видел, что PB криво структуру об информации в файле заполняет)
вызоз с параметром "\VarFileInfo\Translation" возвращает 04091252, однако с такой кодовой страницей информации в файле нет вообще.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36539884
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркПодниму тему.
На PB 11.1 (а я думаю и на других версиях тоже, т.к. и на других версиях видел, что PB криво структуру об информации в файле заполняет)
вызоз с параметром "\VarFileInfo\Translation" возвращает 04091252, однако с такой кодовой страницей информации в файле нет вообще.
Да, это на всех версиях такое.
На самом деле Translation должно быть 040904E4.
Видно что 0x04E4 == 1252.
Т.е. из-за бага где-то внутри PB кодовая страница была дважды декодирована из шестнадцатиричной системы.

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

Ну либо пытаться 1252 рассматривать и как десятичное и как шестнадцатиричное и искать в обоих ветках.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36539969
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36540119
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркУточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
Так а я про что? :)
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36540280
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЛокшин МаркУточню, что здесь имеется ввиду определение информации о exe файле сгенерированным PB.
Так а я про что? :)
Ну из моего первого поста не совсем ясно про что речь идет.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36540498
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тогда такой вопрос. Между данными вызовами
Код: 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
GetFileVersionInfo ...
    #36540566
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркА вот тогда такой вопрос. Между данными вызовами
Код: 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
GetFileVersionInfo ...
    #36540587
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНо если подумать, то так как никаких манипуляций с ls_buf не производится после его заполнения бинарными данными, то в PB9 и ниже все должно отработать без проблем (и работает).

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

Но лучше конечно переделать на блоб, тем более что это тривиально.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36540629
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркPB сократит область памяти занимаемую строкой до первого нулевого байта.
Это происходит только при копировании в другую переменную или преобразовании в другой тип данных.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36541356
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
GetFileVersionInfo ...
    #36542475
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркОднако, как показывает эксперимент, этого не происходит, следовательно между присвоениями s[i] значений происходит перевыделение области памяти, следовательно описанная мной ситуация возможна. Как-то так.
При передаче строки во внешнюю ф-ю по ссылке(ref) никогда не происходит перевыделение памяти. То что ф-я записала в переданный ей буфер, так в нем и остается - никакой доп обработки не производится.

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

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

Чтобы в этом убедиться необходимо видеть код PB...
Вовсе не обязательно. Существует куча косвенных способов.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36542665
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36542753
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркAnatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
Например то что во внешнюю ф-ю передается адрес самой строки (в чем легко убедиться), а не временного буфера из которого потом PB бы копировал в строку, уже на 99% говорит о том что ничего там не обрабатывается после возврата из ф-и.
Оставшийся 1% подтверждается хотя бы тем что мой объект n_cst_dll работает :)
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36542781
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЛокшин МаркAnatoly Moskovsky
Вовсе не обязательно. Существует куча косвенных способов.
Например?
Например то что во внешнюю ф-ю передается адрес самой строки (в чем легко убедиться), а не временного буфера из которого потом PB бы копировал в строку, уже на 99% говорит о том что ничего там не обрабатывается после возврата из ф-и.
Вовсе нет. Ничто не мешает PB проверить длинну строки после возврата и уменьшить выделенную память под нее в случае необходимости.
...
Рейтинг: 0 / 0
GetFileVersionInfo ...
    #36542995
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНичто не мешает 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
GetFileVersionInfo ...
    #36543814
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли бы было так как вы предполагаете, то для работы этого цикла было бы достаточно около 100М.
Однако приложение выделяет себе на каждой итерации дополнительные 100М и вылетает после исчерпания памяти.

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


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