Автор | Сообщение |
|
| Администратор
|
Пост N: 635
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.11.07 14:34. Заголовок: Version Control
Поскольку я собираю свой софт, используя dll, и эти dll иногда необходимо обновлять, хотелось бы организовать сабж У линкера ilink32 есть опция -U - для записи версии А как затем эту версию проверить ? Например версию harbour.dll, или другой dll ? Я в winapi увидел такие функции: VerifyVersionInfo(), GetProcessVersion() А как ими пользоваться, если они предназначены для этих целей ?
|
|
|
Ответов - 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 ); } }
|
|
|
|
| Администратор
|
Пост N: 636
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.11.07 16:48. Заголовок: gfilatov пишет: ..
gfilatov пишет: Спасибо ! Я вижу, в Греции как всегда все есть. Теперь осталось с этим всем научится работать У меня получается pDLLGETVERSION = ( DLLGETVERSIONPROC ) GetProcAddress( hModComCtl, "DllGetVersion" ); возвращает пустое значение, т.е. процедуры DLLGETVERSIONPROC нет Может быть надо при создании dll самому делать такую процедуру ?
|
|
|
|
| постоянный участник
|
Пост N: 316
Зарегистрирован: 09.10.06
|
|
Отправлено: 14.11.07 16:55. Заголовок: Pasha пишет: Может ..
Pasha пишет: цитата: | Может быть надо при создании dll самому делать такую процедуру ? |
| Совершенно верно. Включение функции DllGetVersion считается хорошим тоном при написании dll. Хотя стандарта не существует. И много разработчиков ( например MySQL, SQLITE, UnRAR, 7zip, SCIED) используют "свою" функцию. Главное чтобы это было документировано.
|
|
|
|
| Администратор
|
Пост N: 637
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.11.07 17:26. Заголовок: Надо использовать фу..
Надо использовать функцию GetFileVersionInfo()
|
|
|
|
| Администратор
|
Пост 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); }
|
|
|
|
| постоянный участник
|
Пост 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 } }
|
|
|
|
| Администратор
|
Пост N: 640
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.07 14:06. Заголовок: Спасибо, ТЕПЕРЬ все ..
Спасибо, ТЕПЕРЬ все заработало ! btw эту функцию можно добавить в minigui, не помешает
|
|
|
|
| модератор
|
Пост 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 )
|
|
|
|
| Администратор
|
Пост N: 641
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.07 14:53. Заголовок: Понятно Я не заметил..
Понятно Я не заметил, поскольку выполнял поиск строки "Version" в сырцах *.с
|
|
|
|