On-line: Pasha, гостей 1. Всего: 2 [подробнее..]
АвторСообщение
Администратор




Пост N: 635
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.11.07 14:34. Заголовок: Version Control


Поскольку я собираю свой софт, используя dll, и эти dll иногда необходимо обновлять, хотелось бы организовать сабж

У линкера ilink32 есть опция -U - для записи версии

А как затем эту версию проверить ? Например версию harbour.dll, или другой dll ?

Я в winapi увидел такие функции:

VerifyVersionInfo(), GetProcessVersion()

А как ими пользоваться, если они предназначены для этих целей ?

Спасибо: 0 
Профиль
Ответов - 9 [только новые]


модератор




Пост N: 647
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 14.11.07 15:57. Заголовок: Pasha пишет: Я в wi..


Pasha пишет:

 цитата:
Я в winapi увидел такие функции:

VerifyVersionInfo(), GetProcessVersion()


Функция VerifyVersionInfo сравнивает версию установленной операционной системы с тем, что требует Ваше приложение.
Функция GetProcessVersion возвращает старший и младший номер версии системы, в которой предполагается запуск заданного процесса

Pasha пишет:

 цитата:
как затем эту версию проверить ?





static DLLGETVERSIONPROC pDLLGETVERSION = NULL;

HB_FUNC( GETDLLVERSION )
{
typedef HRESULT ( CALLBACK *DLLGETVERSIONPROC ) ( DLLVERSIONINFO * );

HMODULE hModComCtl;
char cLibName[MAX_PATH];

DLLVERSIONINFO dvi = { 0 };

strcpy( cLibName, hb_parc(1) );

hModComCtl = LoadLibrary( cLibName );
if( hModComCtl )
{
pDLLGETVERSION = ( DLLGETVERSIONPROC ) GetProcAddress( hModComCtl, "DllGetVersion" );
if( pDLLGETVERSION )
{
memset( &dvi, 0, sizeof(dvi) ); // clear
dvi.cbSize = sizeof( dvi ); // set size for Windows
if( pDLLGETVERSION(&dvi) == NOERROR )
{
hb_reta( 3 );
hb_stornl( dvi.dwMajorVersion, -1, 1 ); // Major version
hb_stornl( dvi.dwMinorVersion, -1, 2 ); // Minor version
hb_stornl( dvi.dwBuildNumber, -1, 3 ); // Build number
}
else
{
hb_reta( 3 );
hb_stornl( 0, -1, 1 );
hb_stornl( 0, -1, 2 );
hb_stornl( 0, -1, 3 );
}
}
else
{
hb_reta( 3 );
hb_stornl( 0, -1, 1 );
hb_stornl( 0, -1, 2 );
hb_stornl( 0, -1, 3 );
}

FreeLibrary( hModComCtl );
}
else
{
hb_reta( 3 );
hb_stornl( 0, -1, 1 );
hb_stornl( 0, -1, 2 );
hb_stornl( 0, -1, 3 );
}
}



Спасибо: 0 
Профиль
Администратор




Пост N: 636
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.11.07 16:48. Заголовок: gfilatov пишет: ..


gfilatov пишет:

 цитата:



Спасибо ! Я вижу, в Греции как всегда все есть.
Теперь осталось с этим всем научится работать

У меня получается pDLLGETVERSION = ( DLLGETVERSIONPROC ) GetProcAddress( hModComCtl, "DllGetVersion" ); возвращает пустое значение, т.е. процедуры DLLGETVERSIONPROC нет

Может быть надо при создании dll самому делать такую процедуру ?



Спасибо: 0 
Профиль
постоянный участник


Пост N: 316
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 14.11.07 16:55. Заголовок: Pasha пишет: Может ..


Pasha пишет:

 цитата:
Может быть надо при создании dll самому делать такую процедуру ?



Совершенно верно. Включение функции DllGetVersion считается хорошим тоном при написании dll. Хотя стандарта не существует. И много разработчиков ( например MySQL, SQLITE, UnRAR, 7zip, SCIED) используют "свою" функцию. Главное чтобы это было документировано.

Спасибо: 0 
Профиль
Администратор




Пост N: 637
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.11.07 17:26. Заголовок: Надо использовать фу..


Надо использовать функцию GetFileVersionInfo()

Спасибо: 0 
Профиль
Администратор




Пост N: 639
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.11.07 09:12. Заголовок: Вчера написал функци..


Вчера написал функцию, но она что-то не сработала. Посмотрите, может кто-то увидит ошибку

Вызов GetFileVersionInfoSize почему-то дает 0

#include <windows.h>
#include "hbapi.h"
#include <stdio.h>
#include <string.h>
#include <shellapi.h>


HB_FUNC( FILEVERSION )
{

char *szFileName = hb_parc(1);
DWORD dwArg;
DWORD dwInfoSize = GetFileVersionInfoSize( szFileName, &dwArg);
BYTE* lpBuff = NULL;
VS_FIXEDFILEINFO *vInfo;
UINT uInfoSize;
BOOL bError = FALSE;

if(dwInfoSize)
lpBuff = hb_xgrab( (int) dwInfoSize);
else
bError = TRUE;

if(! lpBuff)
{
bError = TRUE;
}

if(! bError && ! GetFileVersionInfo( szFileName, 0, dwInfoSize, lpBuff))
{
bError = TRUE;
}


if(! bError && ! VerQueryValue(lpBuff, TEXT(""), (LPVOID*) &vInfo, &uInfoSize))
{
bError = TRUE;
}

if(! bError && ! uInfoSize)
{
bError = TRUE;
}


if(! bError)
{
hb_reta( 2 );
hb_stornl( HIWORD(vInfo->dwFileVersionLS), -1, 1 );
hb_stornl( LOWORD(vInfo->dwFileVersionLS), -1, 2 );
}
else
{
hb_reta( 2 );
hb_stornl( 0, -1, 1 );
hb_stornl( 0, -1, 2 );
}
if( lpBuff )
hb_xfree(lpBuff);
}



Спасибо: 0 
Профиль
постоянный участник


Пост N: 318
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 15.11.07 10:53. Заголовок: Да все работает норм..


Да все работает нормально,
только если пользоваться GetFileVersionInfo() нельзя забывать о


1 VERSIONINFO
FILEVERSION 1,0,1,0
PRODUCTVERSION 1,0,0,0
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
BLOCK "040904b0"
{
VALUE "FileDescription", "Simple Bmp File Viewer\000"
VALUE "FileVersion", "1.0.1.0"
VALUE "InternalName", "BmpViewer\000"
VALUE "LegalCopyright", "Copyright й 2003-2006 by Grigory Filatov\000"
VALUE "LegalTrademarks", "Harbour"
VALUE "OriginalFilename", "BmpViewer.exe"
VALUE "CompanyName", ""
VALUE "ProductName", "MiniGUI Utility\000"
VALUE "ProductVersion", "1.0.0.0"
VALUE "Comments", "Created by Grigory Filatov <gfilatov@freemail.ru>\000"
}
}

BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409 0x04B0
}
}


Спасибо: 0 
Профиль
Администратор




Пост N: 640
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.11.07 14:06. Заголовок: Спасибо, ТЕПЕРЬ все ..


Спасибо, ТЕПЕРЬ все заработало !
btw эту функцию можно добавить в minigui, не помешает


Спасибо: 0 
Профиль
модератор




Пост N: 648
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 15.11.07 14:41. Заголовок: Pasha пишет: эту фу..


Pasha пишет:

 цитата:
эту функцию можно добавить в minigui


Паша, подобная функция существует в примерах библиотеки (папка Samples\Applications\PROCESS_KILLER).
Она возвращает необходимые данные для заданного файла в виде массива.
Пример использования:
aInfo := { "FileDescription", "CompanyName", "LegalCopyright", "FileVersion" }
aFileInfo := FileVersInfo( aInfo, GetInstance(), cExeName )



Спасибо: 0 
Профиль
Администратор




Пост N: 641
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 15.11.07 14:53. Заголовок: Понятно Я не заметил..


Понятно
Я не заметил, поскольку выполнял поиск строки "Version" в сырцах *.с


Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 108
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет