WINAPI - wczytanie tekstu z ComboBoxa do stringa
Ostatnio zmodyfikowano 2022-04-11 18:40
Rynko Temat założony przez niniejszego użytkownika |
WINAPI - wczytanie tekstu z ComboBoxa do stringa » 2022-04-09 20:23:38 Witam wszystkich na forum. Od pewnego czasu tworzę aplikację na WINAPI. Aplikację do pewnego momentu tworzyłem w środowisku CodeBlocks i kierowałem się kursem dostępnym na forum - generalnie wszystko szło gładko do momentu, kiedy musiałem z pewnych powodów przenieść tworzenie aplikacji do Visual Studio. Okazało się, że z jakiegoś powodu wiele funkcji działa tutaj inaczej i trafiłem właśnie na pierwszy problem, którego nie udało mi się rozwiązać. Chciałbym przypisać do stringa wartość wybraną na liście rozwijalnej po kliknięciu przycisku. W CodeBlocks wszystko działało dobrze: int condition_name_lenght = ComboBox_GetTextLength( hComboChooseCondition ); LPSTR current_condition_name =( LPSTR ) GlobalAlloc( GPTR, condition_name_lenght + 1 ); ComboBox_GetText( hComboChooseCondition, current_condition_name, condition_name_lenght + 1 );
conditionAllData.condition_name = current_condition_name;
W Visual Studio powyższy kod jest błędny. Spróbowałem czegoś takiego: int programNameLenght = ComboBox_GetTextLength( hComboProgrammingModeObjectSelection ); LPTSTR currentProgramName =( LPTSTR ) GlobalAlloc( GPTR, programNameLenght + 1 ); ComboBox_GetText( hComboProgrammingModeObjectSelection, currentProgramName, programNameLenght + 1 );
programAllData.program_name =( LPSTR ) currentProgramName;
GlobalFree( currentProgramName );
Jednak kiedy chce wyświetlić tekst "programAllData.program_name" to pojawia się wielkie nic. Podejrzewam, że ma to coś wspólnego z komunikatem, który pojawia się przy linijce z "ComboBox_GetText", mianowicie: "Element "currentProgramName" może mieć wartość "0" i jest kopią wartości znalezionej w elemencie "3$Is"" |
|
pekfos |
» 2022-04-11 18:40:54 Okazało się, że z jakiegoś powodu wiele funkcji działa tutaj inaczej To konfiguracja projektu, nie środowisko. W ustawieniach projektu w Visualu jest General/Character set, ustaw "Use Multi-Byte Character Set" żeby mieć poprzednie zachowanie. Nowy kod powinien być pisany pod Unicode, dlatego to domyślne ustawienie, ale będziesz musiał przerobić dużo więcej niż tylko ten jeden kawałek. LPTSTR currentProgramName =( LPTSTR ) GlobalAlloc( GPTR, programNameLenght + 1 );
To jest błędne po przejściu na LPTSTR. Powinno być LPTSTR currentProgramName =( LPTSTR ) GlobalAlloc( GPTR,( programNameLenght + 1 ) * sizeof( TCHAR ) );
W konfiguracji Unicode LPTSTR to LPWSTR. Jeden znak zajmuje 2 bajty (na ogół). Dlatego też nie zadziała te przypisanie do program_name. https://docs.microsoft.com/en-us/windows/win32/intl/conventions-for-function-prototypes |
|
« 1 » |