CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - [XE2] GetFileVersionInfoSize - problem

[XE2] GetFileVersionInfoSize - problem

dział ogólny

[XE2] GetFileVersionInfoSize - problem

Nowy postprzez Corvis » poniedziałek, 24 października 2011, 12:19

Witam,

Mam problem mam kody do odczytywania wersji aplikacji który działa mi pod C++ Bubilderem XE jednak nie działa (chociaż się kompiluje) pod XE2.

KOD cpp:     UKRYJ  
AnsiString TFileVersion::myGetFileVersionInfo(char *ModulePath, AnsiString KeyName) {
    LPVOID lpStr1 = NULL, lpStr2 = NULL;
    WORD* wTmp;
    DWORD dwHandlev = NULL;
    UINT dwLength;
    char sFileName[1024] = {0};
    char sTmp[1024] = {0};
    AnsiString sInfo;
    LPVOID* pVersionInfo;

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

    DWORD dwInfoSize = GetFileVersionInfoSize((char*)(LPSTR)sFileName, &dwHandlev);

    if(dwInfoSize) {
        pVersionInfo = new LPVOID[dwInfoSize];
        if(GetFileVersionInfo((char*)(LPCTSTR)sFileName, dwHandlev, dwInfoSize, pVersionInfo)) {
            if(VerQueryValue(pVersionInfo, "\\VarFileInfo\\Translation", &lpStr1, &dwLength)) {
                wTmp = (WORD*)lpStr1;
                sprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).c_str(), *wTmp, *(wTmp + 1));
                if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
            }
        }
        delete[] pVersionInfo;
    }
    return sInfo;
}


Wie ktoś może o co chodzi ??

Tak samo ta linia kodu zawsze zwraca mi 0:

KOD cpp:     UKRYJ  
unsigned long h = 0;
unsigned long size = 0;
size = GetFileVersionInfoSizeW(Application->ExeName.t_str(),&h);


Im nowsze wersje tym gorzej to wszystko działa ;)


EDIT:

GetLasError() zwrca:

"The specified resource type cannot be found in the image file."
"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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » poniedziałek, 24 października 2011, 16:13

Sprawdź czy ten kod będzie Tobie działał:

KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *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};
 UnicodeString sInfo;
 LPVOID* pVersionInfo;

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

 DWORD dwInfoSize = GetFileVersionInfoSize(sFileName, &dwHandlev);

 if(dwInfoSize)
 {
  pVersionInfo = new LPVOID[dwInfoSize];
  if(GetFileVersionInfo(sFileName, dwHandlev, dwInfoSize, pVersionInfo))
  {
   if(VerQueryValue(pVersionInfo, L"\\VarFileInfo\\Translation", &lpStr1, &dwLength))
   {
        wTmp = (WORD*)lpStr1;
        swprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).w_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}


Mapowanie musi być ustawione na wchar_t
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Corvis » wtorek, 25 października 2011, 10:41

Mapowanie ustawione na wchar_t.
Kod nie działa dwInfoSize zawsze jest 0 :| nazwa w sFileName jest poprawna.
"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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » wtorek, 25 października 2011, 18:09

Twoja ostatnia wypowiedź odnosi się do Twojego czy mojego kodu?

Zauważ, że zarówno Twoja jak i moja funkcja zwracają wersję programu własnego, czyli tego z którego zostały uruchomione, by to zadziałało musisz zaznaczyć w opcjach projektu: Project -> Options -> Version info opcję: Include version information in project.

Szukałem jakichś informacji odnośnie tego problemu, ale najwyraźniej nikt jeszcze się z tym nie zetknął. Sprawdź co zwraca funkcja GetModuleFileName.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Corvis » środa, 26 października 2011, 09:55

by to zadziałało musisz zaznaczyć w opcjach projektu: Project Options Version info opcję: Include version information in project.


:oops:

No to szukałem wiatru w polu przez głupotę !!! Dzięki.


EDIT:

Działa do połowy bo odczytuje dwInfoSize. Ale samo sInfo jest NULL.

Używam twojego kodu i wywołuje funkcję tak:

GetFileVersionInfo(0,"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 VistaChrome

Re: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » środa, 26 października 2011, 15:41

Corvis napisał(a):wywołuje funkcję tak:

GetFileVersionInfo(0,"FileVersion");


Pierwszy argument powinien być NULL a nie 0, gdyż:

Cyfrowy Baron napisał(a):else wcscpy(sFileName, (LPTSTR)ModulePath);


Jeżeli chcesz odczytać wersję własnego programu, to zmienna sFileName musi zawierać wartość NULL, a nie 0.

Pamiętaj o nadaniu programowi wersji w opcjach projektu i po nadaniu wersji użyj funkcji Build a nie Compile.

W opcjach projektu: Project -> Options ->Version Info w polu FileVersion musi się coś znajdować, gdyż właśnie to program będzie próbował odczytać.
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Corvis » czwartek, 27 października 2011, 07:51

Baronie wszystko już zrobiłem tak jak mówisz teraz program nie wchodzi w ten warunek

KOD cpp:     UKRYJ  
if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) {
    sInfo = (LPCTSTR)lpStr2;
}
 


Ogólnie zauważyłem dużo błędów w XE2 przykłady:

1. Ustawiamy w ustawieniach projektu -> Application -> Enable runtime themes
2. Kompilujemy projekt
3. Dodajemy nową formę.
4. Kompilujemy projekt -> Runtime themes przestaje działać - żeby zadziałało trzeba popownie wejść i wyłączyć i włączyć pkt. 1


1. Ustawiamy ikonę aplikacji
2. Kompilujemy projekt pare razy -> Ikona znika żeby się pojawiła trzeba ją ponownie ustawić - mimo iż w ustawieniach jest.


1. 3 godziny pracy z kompilatorem
2. W pewnym momencie kompilator zaczyna pokazywać wynik kompilacji jako ERROR i uruchamia projekt. Można wpisać głupoty w kodzie on to skompiluje pokaże ERROR ale się uruchomi. Po prostu kompilator przestaje działać.


1. Ctrl + spacja w edytorze
2. Po pewnym czasie Access Volation - to chyba odziedziczył bo w wersji 2010 XE też tak było.


No i plus kod z XE odnośnie wersji projektu nie działa w XE2

W którą to stronę wszystko idzie ? ;)
"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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez polymorphism » czwartek, 27 października 2011, 09:59

Wtrącę się na chwilę.
KOD cpp:     UKRYJ  
String GetFileVersionInfo(char *ModulePath, ...) //<--- const char* powinno być
{
        wchar_t sFileName[1024] = {0};
       
        ...
       
        if(ModulePath == NULL) ...
        else wcscpy(sFileName, (LPTSTR)ModulePath); //<--- !!!
        ...
 

Nie możesz ot tak zrzutować char* na wchar_t* i udawać, że to łańcuch unikodowy. To jest błąd, który może wywalić aplikację.

KOD cpp:     UKRYJ  
pVersionInfo = new LPVOID[dwInfoSize];

Przecież dwInfoSize to liczba bajtów a nie LPVOIDów.

No i tak ogólnie. Trzeba się zdecydować na jakich typach się operuje. Albo na char*, albo wchar_t*, albo LPTSTR. Jeśli wybierzesz któryś z dwóch pierwszych, to trzeba jawnie określić, którą wersję funkcji WinAPI wywołujesz - unikodową czy ansi. Możesz to zrobić dodając na końcu nazwy literę A lub W. Zaś jeśli chodzi o typ LPTSTR, to trzeba być konsekwentny i korzystać tylko z generycznych typów (ów T) zdefiniowanych w SDK systemowym.
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Corvis » czwartek, 27 października 2011, 13:54

Ok poprawiłem. Jednak dalej to nie działa. Albo coś tak zmienili w XE2 albo ja już zgłupiałem.
"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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » czwartek, 27 października 2011, 17:21

W takim razie to błąd bibliotek w XE2 i musisz poczekać na patche. Dlatego ja przechodzę na nowe środowisko dopiero po tym jak pojawi się do niego pakier aktualizacji.

Co do uwag polymorphism:

polymorphism napisał(a):Nie możesz ot tak zrzutować char* na wchar_t* i udawać, że to łańcuch unikodowy. To jest błąd, który może wywalić aplikację.


Błędu nie wywala i działa. Po prostu rzutuję char na LPTSTR a potem za pomocą funkcji przepisuję to do zmiennej typu wchar_t. To rzutowanie zawsze mi działa, gdy chcę zamienić char na wchar_t. Musi działać, gdyż char zmieści się w wchar_t.

polymorphism napisał(a):Jeśli wybierzesz któryś z dwóch pierwszych, to trzeba jawnie określić, którą wersję funkcji WinAPI wywołujesz - unikodową czy ansi


W C++Builder 2010 jawnie to muszę określać tylko funkcje ANSI, gdyż domyślnie kompilator używa funkcji UNICODE.

Co do tych zmiennych to wzięło się to z niedbalstwa. Przerobiłem funkcję ANSI na UNICODE i nie zmieniłem argumentów funkcji. Co się zaś tyczy LPVOID:

Plik pomocy RAD Studio 2010 napisał(a):LPCVOID
Pointer to a constant of any type.
This type is declared in WinDef.h as follows:

typedef CONST void *LPCVOID;


Więc wskaźnik do stałej dowolnego typu. Nie widzę więc problemu w użyciu typu LPVOID zamiast LPBYTE, gdyż funkcja i tak dobierze sobie potrzebny typ.

Tak czy owak poprawiona funkcja:

KOD cpp:     UKRYJ  
String GetFileVersionInfo(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;
        swprintf(sTmp, ("\\StringFileInfo\\%04x%04x\\" + KeyName).w_str(), *wTmp, *(wTmp + 1));
        if(VerQueryValue(pVersionInfo, sTmp, &lpStr2, &dwLength)) sInfo = (LPCTSTR)lpStr2;
   }
  }
  delete[] pVersionInfo;
 }
 return sInfo;
}


No i samo wywołanie:

KOD cpp:     UKRYJ  
String sFileVersion = GetFileVersionInfo(NULL,  L"FileVersion")
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » czwartek, 27 października 2011, 18:08

Sprawdź Corvis jak w Twoim programie wygląda zasób Version Info. U mnie np. ma to taką postać.

Resource Hacker:
KOD text:     UKRYJ  
1 VERSIONINFO
FILEVERSION 2,3,7,728
PRODUCTVERSION 2,3,7,728
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
        BLOCK "041504E2"
        {
                VALUE "CompanyName", "Cyfrowy Baron"
                VALUE "FileDescription", "Katalog filmów - lokalna baza filmowa"
                VALUE "FileVersion", "2.3.7.728"
                VALUE "InternalName", "Babilon"
                VALUE "LegalCopyright", "Copyright © 2009 - 2010 Cyfrowy Baron"
                VALUE "LegalTrademarks", ""
                VALUE "OriginalFilename", "Babilon.exe"
                VALUE "ProductName", "Przeglądarka Babilon"
                VALUE "ProductVersion", "2"
                VALUE "Comments", "Program do przeglądania bazy danych pakietu Babilon"
        }
}

BLOCK "VarFileInfo"
{
        VALUE "Translation", 0x0415 0x04E2
}
}


PE Explorer:
KOD text:     UKRYJ  
Length Of Struc: 03C0h
Length Of Value: 0034h
Type Of Struc:   0000h
Info:            VS_VERSION_INFO
Signature:       FEEF04BDh
Struc Version:   1.0
File Version:    2.3.7.728
Product Version: 2.3.7.728
File Flags Mask: 0.63
File Flags:      
File OS:         WINDOWS32
File Type:       APP
File SubType:    UNKNOWN
File Date:       00:00:00  00/00/0000

     Struc has Child(ren). Size: 868 bytes.

Child Type:         StringFileInfo
Language/Code Page: 1045/1250
CompanyName:        Cyfrowy Baron
FileDescription:    Katalog filmów - lokalna baza filmowa
FileVersion:        2.3.7.728
InternalName:       Babilon
LegalCopyright:     Copyright © 2009 - 2010 Cyfrowy Baron
LegalTrademarks:    
OriginalFilename:   Babilon.exe
ProductName:        Przeglądarka Babilon
ProductVersion:     2
Comments:           Program do przeglądania bazy danych pakietu Babilon

Child Type:         VarFileInfo
Translation:        1045/1250


Jeżeli nie masz czym, to możesz posłużyć się jednym z tych edytorów zasobów
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez polymorphism » czwartek, 27 października 2011, 18:27

To rzutowanie zawsze mi działa, gdy chcę zamienić char na wchar_t.

Tylko ta "zmiana" nie spowoduje, że ciąg znaków jednobajtowych stanie się nagle ciągiem znaków szerokich. Przy takim rzutowaniu zachodzi jedynie reinterpretacja bloku pamięci, a nie konwersja zawartości.

Musi działać, gdyż char zmieści się w wchar_t.

Nie musi. wcscpy operuje na ciągach znakowych, a nie na jakimś bloku pamięci. A jeśli operuje na ciągach znakowych, zatem działa tak długo, dopóki nie znajdzie null-terminatora - w tym przypadku chodzi o 16-bitową wartość zero. W ciągu ansi terminator, co oczywiste, jest 8-bitowy, zatem pozostałe 8 bitów to czysty przypadek.

W C++Builder 2010 jawnie to muszę określać tylko funkcje ANSI, gdyż domyślnie kompilator używa funkcji UNICODE.

Dobra, ale jak będziesz chciał ten kod skompilować na starszych wersjach środowiska, gdzie domyślnie jest mapowanie ansi, to kod nie zadziała.

Nie widzę więc problemu w użyciu typu LPVOID zamiast LPBYTE, gdyż funkcja i tak dobierze sobie potrzebny typ.

Nie zrozumiałeś mnie. Chodzi mi o to, żeby zamiast obecnego zapisu dać:
KOD cpp:     UKRYJ  
LPBYTE pVersionInfo = new BYTE[dwInfoSize];

pVersionInfo może oczywiście być typu LPVOID, ale nie widzę powodu, żeby zmienna ta nie mogła być typu LPBYTE. Głównie chodziło mi o to, ile tej pamięci alokujesz. LPVOID to cztery bajty na 32-bitowych OSach, czyli niepotrzebnie alokowałeś cztery razy więcej pamięci niż to konieczne.
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » czwartek, 27 października 2011, 18:45

polymorphism napisał(a):Dobra, ale jak będziesz chciał ten kod skompilować na starszych wersjach środowiska, gdzie domyślnie jest mapowanie ansi, to kod nie zadziała.


Nie zadziała i nie powinien, gdyż w starszych wersjach środowiska nie mam zmiennej typu wchar_t ani UnicodeString. Na starszych wersjach wiele trzeba by zmienić.

polymorphism napisał(a):Tylko ta "zmiana" nie spowoduje, że ciąg znaków jednobajtowych stanie się nagle ciągiem znaków szerokich.


Jak więc dokonałbyś konwersji char na wchar_t?
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez polymorphism » czwartek, 27 października 2011, 19:02

Jak więc dokonałbyś konwersji char na wchar_t?

Można dokonać jej przy pomocy chociażby funkcji mbstowcs (lub klasy ctype). Zresztą chyba UnicodeString może dokonać konwersji przyjmując w konstruktorze ciąg ansi.
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: [XE2] GetFileVersionInfoSize - problem

Nowy postprzez Cyfrowy Baron » czwartek, 27 października 2011, 19:05

polymorphism napisał(a):Zresztą chyba UnicodeString może dokonać konwersji przyjmując w konstruktorze ciąg ansi.


Z konwersją AnsiString na UnicodeString nie ma problemu, wystarczy rzutowanie. Pytałem o char na wchar_t. Potem sprawdzę...
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

Nastę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 7 gości