CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z kompatybilnością

Problem z kompatybilnością

dział ogólny

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » środa, 30 listopada 2011, 13:42

Skoro wersja pliku jest wyświetlana prawidłowo we właściwościach pliku to już wiemy, że błąd występuje w funkcjach pobierających wersje pliku, a nie w zasobach programu.
Tobie nic to nie daje. Musisz zainstalować poprawkę, bez tego nic już nie da się zrobić...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez polymorphism » środa, 30 listopada 2011, 14:32

Może niech pitek udostępni aplikację, żeby można było sprawdzić u siebie zawartość zasobów.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Pitek » środa, 30 listopada 2011, 14:41

Ok, poprawka w drodze zobaczymy czy to pomoże, dam znać :)
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Pitek » czwartek, 1 grudnia 2011, 21:51

No niestety mimo wgrania wersji Update 2 dalej wersja przez program nie jest wyświetlana, czy muszę coś zmienić w tej funkcji ?
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez polymorphism » czwartek, 1 grudnia 2011, 22:38

Dawaj exeka.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Pitek » piątek, 2 grudnia 2011, 00:02

Proszę bardzo :)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Komputer służy do tego aby ułatwić Ci pracę, której bez niego w ogóle byś nie miał.
E.Murphy
http://piotrekprogramy.pl
Avatar użytkownika
Pitek
Kreacjusz
Kreacjusz
 
Posty: 290
Dołączył(a): środa, 14 października 2009, 14:53
Lokalizacja: Rybnik/Wrocław
Podziękował : 43
Otrzymał podziękowań: 5
System operacyjny: Win 7 Ultimate 64bit SP1 / Ubuntu 19.04 LTS 64bit
Kompilator: Embarcadero RAD Studio XE2
SKYPE: pitek3010
Gadu Gadu: 7060047
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Corvis » piątek, 2 grudnia 2011, 00:40

Jutro sprawdzę u siebie.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 10:23

Zasoby pliku nie są chyba poprawne, gdyż mój program do pobrania wersji pliku, nie potrafi ich odczytać, mimo iż we właściwościach pliku wszystko jest poprawnie.

Problem może stanowić nadany przez Ciebie numer wersji: 1.0.61184.41333
Ja u siebie nie mogę nadać numeru większego niż: 1.0.6118.4133
Każdy z elementów numeru wierszy nie może być większy niż: 32767.32767.32767.32767, a 61184 i 41333 są większe.
Problemem jest więc chyba za wysoki numer wersji. Zastanawia mnie jednak dlaczego XE2 na to pozwala, gdyż w C++Builder 2010 nawet gdybym chciał to nie mogę wpisać większego numeru wersji, gdyż edytor zaraz go poprawia.

Skróć wersję i zobacz czy to działa.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Corvis » piątek, 2 grudnia 2011, 11:00

Ja też nie mogę ustawić takiego numeru 1.0.61184.41333
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Problem z kompatybilnością

Nowy postprzez Corvis » piątek, 2 grudnia 2011, 11:02

Wrzucam jeszcze mój kod który działa poprawnie:

KOD cpp:     UKRYJ  
String __fastcall TVersionInfo::MyGetFileVersionInfo(wchar_t *ModulePath, String KeyName) {
        LPVOID lpStr1 = NULL, lpStr2 = NULL;
        WORD* wTmp;
        DWORD dwHandlev = NULL;
        UINT dwLength;
        wchar_t sFileName[1024] = {0};
        wchar_t sTmp[1024] = {0};
        String sInfo;
        LPBYTE *pVersionInfo;

        if(ModulePath == NULL) GetModuleFileName( NULL, sFileName, 1024);
        else wcscpy(sFileName, ModulePath);

        DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

        if(dwInfoSize) {
                pVersionInfo = new LPBYTE[dwInfoSize];
                if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo)) {
                        if(VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation", &lpStr1, &dwLength)) {
                                wTmp = (WORD*)lpStr1;
                                wsprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).w_str(), *wTmp, *(wTmp + 1));
                                if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) {
                                        sInfo = (LPCTSTR)lpStr2;
                                }
                        }
                }
                delete[] pVersionInfo;
        }
        return sInfo;
}
//---------------------------------------------------------------------------
String __fastcall TVersionInfo::PobierzWersjeAplikacji() {
        return MyGetFileVersionInfo(NULL,L"FileVersion");
}
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 11:06

Tak to wygląda u mnie:

wersja.png




Po naniesieniu poprawek do wersji pliku za pomocą edytora zasobów, numer wersji jest odczytywany prawidłowo.
▼ Plik programu z poprawioną wersją:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez polymorphism » piątek, 2 grudnia 2011, 12:25

Sprawdziłem i ... niezły kwas tu jest. Funkcja podana przez Barona nie działa, bo podaje złą stronę kodową i ID języka - dane w zasobach zapisane są dla języka angielskiego w kodowaniu 1252, co też widać w podglądzie zasobów:
Kod: Zaznacz cały
BLOCK "StringFileInfo"
{
    BLOCK "040904e4" //<--- 0x409 (ID) i 0x4E4 (1252)
    {
        ...
        VALUE "FileVersion", "1.0.0.1029"
        ...
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409, 0x04E4 //<--- !!!
}
 

Teraz pytanie, dlaczego VerQueryValue dla zapytania Translation zwraca ID języka polskiego i kodowanie 1250, przecież tych wartości nie ma w bloku VarFileInfo?! :roll: Następny kwas to to, że wersja pliku zapisana binarnie nie zgadza się z tą zapisaną w formie tekstowej:

  • binarnie -> 1.0.61184.41333
  • tekstowo -> 1.0.0.1029
Która jest właściwa? :P

Tu masz kod, który odczytuje wersję pliku zapisaną binarnie:
KOD cpp:     UKRYJ  
struct FILE_VER
{
        WORD    Major;
        WORD    Minor;
        WORD    Release;
        WORD    Build;
};

BOOL GetFileVersion(const wchar_t *ModulePath, FILE_VER &ver)
{
        DWORD dwInfoSize = GetFileVersionInfoSizeW(ModulePath, NULL);
        if(dwInfoSize == 0)return FALSE;
       
        vector<char> v(dwInfoSize);

        if(!GetFileVersionInfoW(ModulePath, NULL, v.size(), &v[0]))return FALSE;

        LPVOID  ptr;
        UINT    read = 0;

        VS_FIXEDFILEINFO* file_info;

        if(!VerQueryValueW(&v[0], L"\\", (void**)&file_info, &read))return FALSE;


        ver.Major = HIWORD(file_info->dwFileVersionMS);
        ver.Minor = LOWORD(file_info->dwFileVersionMS);
        ver.Release = HIWORD(file_info->dwFileVersionLS);
        ver.Build = LOWORD(file_info->dwFileVersionLS);
        return TRUE;
}


/**** użycie  ****/
FILE_VER v;

if(GetFileVersion(path, v))
{
        cout << v.Major << '.' << v.Minor << '.' << v.Release << '.' << v.Build << '\n';
}
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 12:55

polymorphism napisał(a):Sprawdziłem i ... niezły kwas tu jest. Funkcja podana przez Barona nie działa, bo podaje złą stronę kodową i ID języka - dane w zasobach zapisane są dla języka angielskiego w kodowaniu 1252, co też widać w podglądzie zasobów:


Bynajmniej! Przejrzyj jeszcze raz kod! Strona kodowa jest sprawdzana i przekazywana. Nie bez powodu funkcja VerQueryValue jest wywoływana dwukrotnie.
Też początkowo to zauważyłem i sądziłem, że to problem strony kodowej, ale nie po zmianie w stronie kodowej dla innych testowanych plików, bez zmiany kodu odczytującego, numer wersji jest pobierany prawidłowo.
Poza tym chyba nie przeczytałeś tego:

Cyfrowy Baron napisał(a):Po naniesieniu poprawek do wersji pliku za pomocą edytora zasobów, numer wersji jest odczytywany prawidłowo.


W pliku załączonym przez pitek3010 zmieniłem tylko numer wersji, strona kodowa pozostała ta sama i wersja pliku jest odczytywana prawidłowo.

W załączniku przykładowy program WersjaPliku.exe do odczytywania wersji pliku oraz dwa programy z różną wersją i różnymi stronami kodowymi:

Project1.exe -> Language/Code Page: 1045/1250
Project2.exe -> Language/Code Page: 1031/1252

Sprawdź, że nie ma problemu z pobieraniem informacji z zasobów.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez polymorphism » piątek, 2 grudnia 2011, 13:07

Bynajmniej! Przejrzyj jeszcze raz kod! Strona kodowa jest sprawdzana i nie ma znaczenia jaka jest. Też początkowo to zauważyłem i sądziłem, że to problem strony kodowej, ale nie po zmianie w stronie kodowej dla innych testowanych plików, bez zmiany kodu odczytującego, numer wersji jest pobierany prawidłowo.

Mi nie chodziło o to, że funkcja jest źle napisana, tylko o przyczynę jej niedziałania dla tego konkretnego przypadku. Jest dokładnie tak, jak napisałem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z kompatybilnością

Nowy postprzez Cyfrowy Baron » piątek, 2 grudnia 2011, 13:15

polymorphism napisał(a):Jest dokładnie tak, jak napisałem.


No nie wydaje mi się, gdyż po skróceniu wersji pliku, jest ona odczytywana bez problemu. Poza tym edytor nie pozwala nadawać tak długi wersji pliku.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości