VS2019 i problem z TCHAR

VS2019 i problem z TCHAR
ID
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:18
0

Staram się użyć w programie struktury, kłopot mam z VisualStudio19.

Kopiuj
static const struct {
	TCHAR *pszText;
	int cx;
}
columnMap[] = {
	{ _T("Tytul1"), 150 },
	{ _T("Tytul2"), 60  },
	{ _T("Tytul3"), 120 },
	{ 0 }
};

static const struct {
	TCHAR *pszName;
	TCHAR *pszPriority;
	int iProgress;
}
taskMap[] = {
	{ _T("Zmienna1"),         _T("Zmienna2"),   15 },
	{ 0 }
};

Błąd który otrzymuje:
Error (active) E0144 a value of type "const wchar_t *" cannot be used to initialize an entity of type "TCHAR *" Przyklad E:\Programowanie\VisualStudio\VC2019-Projekty\Przyklad\Source\WinApplication.cpp 43

Nie mam problemu z tym kawałkiem kodu w CodeBuilder.
Mam wrażenie że muszę coś ustawić we właściwościach projektu.
Zmieniałem Character Set z 3 opcjami, ale nie zaskoczyło.

Cała moja piaskownica:

Kopiuj
#include <Windows.h>

#include <tchar.h>
#include <commctrl.h>
#include <string.h>
#include <stdio.h>

#include <fstream>
#include <iostream>

using namespace std;
/*
static struct {
    TCHAR* pszText;
    int cx;
}
columnMap[] = {
    { _T("Tytul1"), 150 },
    { _T("Tytul2"), 60  },
    { _T("Tytul3"), 120 },
    { 0 }
};

static const struct {
    TCHAR* pszName;
    TCHAR* pszPriority;
    int iProgress;
}
taskMap[] = {
    { _T("Zmienna1"),         _T("Zmienna2"),   15 },
    { 0 }
};
*/
class Plik
{
private:
    fstream fileStream;
    string SciezkaDoPliku;
    streampos RozmiarPliku;
    streampos WczytanychBajtow;

public:

    Plik(const std::string _SciezkaDoPliku)
        : SciezkaDoPliku{ _SciezkaDoPliku },
        RozmiarPliku{ 0 },
        WczytanychBajtow{ 0 }
    {
        this->SciezkaDoPliku = _SciezkaDoPliku;
        fstream fileStream(SciezkaDoPliku.c_str());
    }

    ~Plik() {
        if (fileStream.is_open()) {
            Close();
        }
    }

    void Close()  //Zamkniecie lacza z plikiem.
    {
        if (fileStream.is_open())
            fileStream.clear();
        fileStream.close();
    }

    int Open(HWND hwnd)
    {
        fileStream.open(SciezkaDoPliku.c_str(), ios::in | ios::binary | ios::ate);
        if (!fileStream.is_open()) {
            SetWindowText(hwnd, TEXT("Nie udalo sie otworzyc pliku.\r\n"));
            return 1;
        }
        return 0;
    }

};


static HWND button;
static HWND textBoxOutput;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow)
{
    HWND hMainWindow;
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.lpszClassName = L"Main window class";
    wc.hInstance = hInstance;
    RegisterClass(&wc);


    hMainWindow = CreateWindow(wc.lpszClassName, L"Append text main window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, NULL, NULL, hInstance, NULL);

    if (hMainWindow == NULL) return 1;

    button = CreateWindowEx(WS_EX_CLIENTEDGE, L"Button", L"Append", WS_CHILD | WS_VISIBLE | ES_CENTER, 10, 41, 75, 30, hMainWindow, NULL, NULL, NULL);

    textBoxOutput = CreateWindowEx(WS_EX_CLIENTEDGE, L"Edit", TEXT(""), WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY, 10, 81, 450, 150, hMainWindow, NULL, NULL, NULL);


    ShowWindow(hMainWindow, SW_SHOW);

    MSG msg = { };

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_COMMAND:
        if ((HWND)lParam == button)
        {
            Plik p1("d:\\test1.txt");
            p1.Open(textBoxOutput);
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Zakomentowałem wstawione struktury które mi nie działają.

CZ
  • Rejestracja:ponad 8 lat
  • Ostatnio:18 minut
  • Postów:2320
0

https://stackoverflow.com/questions/12446404/tchar-and-unresolved-external-symbol-lnk2019-error-in-c-program

Chyba tam masz odpowiedź. Z tymi Windowsowymi typami są zawsze jakieś jaja.

ID
Mam na pewno to samo o czym tam piszą czyli bałagan w używaniu różnych typów. Spróbuje sobie wszystko ujednolicić.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
2

Windowsowe typy nie mają tu nic do rzeczy.

Dowód: takie coś się również nie skompiluje, z takiego samego powodu:

Kopiuj
static struct {
    char* pszText;
    int cx;
}
columnMap[] = {
    { "Tytul1", 150 },
    { "Tytul2", 60  },
    { "Tytul3", 120 },
    { 0 }
};

E0144 a value of type "const char *" cannot be used to initialize an entity of type "char *"

Nie mam problemu z tym kawałkiem kodu w CodeBuilder.

Pewnie kompilowałeś jako C a nie C++.

edytowany 2x, ostatnio: Azarien
ID
W ustawieniach projektu jest GUI application. Plik main.cpp Gdzie w ustawieniach mogę sprawdzić jak się to kompiluje ? Wydawało mi się że kompiluje C++, w ustawieniach kompilatora jest ptaszek koło c++14
Azarien
ale to nie jest dozwolony kod w C++. musiałoby być const char* pszText czy tam const TCHAR* pszText w twoim przypadku.
ID
Dodanie const w tym miejscu powoduje, że program nie chce się skompilować i aplikacja nie działa.
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
2
Azarien napisał(a):

Dowód: takie coś się również nie skompiluje, z takiego samego powodu:

E0144 a value of type "const char *" cannot be used to initialize an entity of type "char *"

Nie mam problemu z tym kawałkiem kodu w CodeBuilder.

Pewnie kompilowałeś jako C a nie C++.

Dodam, ze zupełnie zbędne i niczemu nie służące "hackerskie" jednolinijkowe zapisy itd (dla mnie w tym przypadku anty-czytelne)...
Żadnego problemu by nie było, gdyby były dwie fazy

  • deklaracja struktury ŚREDNIK
  • definicja i inicjalizacja zmiennej

Ale to takie "banalne" ...


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 2x, ostatnio: AnyKtokolwiek
ID
Nie mam nic przeciw uproszczeniu tej struktury ```cpp static const struct columnMap { TCHAR* pszText; int cx; }; columnMap test = { _T("Tytul1"), 150 }; ``` Uprościłem to do takiej postaci. Pierwotny problem jednak pozostał, plus coś tam jeszcze nie podoba się kompilatorowi.
AK
"plus coś tam jeszcze nie podoba się kompilatorowi" jak długo używasz takich zwrotów, tak długo jeszcze nie zacząłeś programować.
ID
Error (active) E0144 a value of type "const wchar_t *" cannot be used to initialize an entity of type "TCHAR *" Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int Error C2440 'initializing': cannot convert from 'initializer list' to 'int' Ja tylko staram się uruchomić przykład. Nie zacząłem programować.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
3
idepozapalki napisał(a):

Dodanie const w tym miejscu powoduje, że program nie chce się skompilować i aplikacja nie działa.

Wyjaśnij. Bo to co próbujesz zrobić, a co można uprościć do banalnego przykładu

Kopiuj
char *napis = "Test";

Jest dozwolone w C, ale nie jest dozwolone w C++.

C++ wymaga const:

Kopiuj
const char *napis = "Test";

To jest przyczyna twojego problemu.

edytowany 1x, ostatnio: Azarien
ID
Mam kilkanaście testowych "piaskownic" do testów z różnymi ustawieniami (Properties) - takich jak tamta z pierwszego postu. Wstawiałem cały ten kod w nie i w którejś zaskoczył. Ustawiłem te same Properties w tej sprawiającej problemy i zaskoczyło. Dodałem do tych struktur ListView, bo wraz z nim miały one pracować i działa . Pojawiają się Tytul1 itd tam gdzie powinny. Jeżeli zmodyfikuje ten działający kod o: const TCHAR* pszText; To mam błąd: a value of type "const TCHAR *" cannot be assigned to an entity of type "LPWSTR" czyli mam problem z konwersją w ListView.
Azarien
dodałeś const ale usunąłeś gwiazdkę.
ID
Gwiazdka zginęła mi tutaj przy formatowaniu tego komentarza. Jeżeli nie ma gwiazdki to mam taki zestaw błędów: Error (active) E0144 a value of type "const wchar_t *" cannot be used to initialize an entity of type "const TCHAR" Error C2440 'initializing': cannot convert from 'const wchar_t [7]' to 'const TCHAR' Error C2078 too many initializers Error C1506 unrecoverable block scoping error
DA
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 7 godzin
  • Postów:142
1

Jak masz problem z ListView to wypadałoby dodać kod. Jeśli chodzi o wskaźnik pszText w LVITEM lub argument w ListView_SetItemText, to radzisz sobie użyciem const_cast. Taka przypadłość winapi, wynikająca z tego, że LVITEM używana jest do przesyłania danych zarówno do (tu by mogło być const), jak i z (a tu nie może być const) ListView.

edytowany 1x, ostatnio: -daniel-
ID
Właściwie tak, tylko nie wiem czy to jest zgodne z regulaminem, bo na forach najczęściej jest tak, że jeden problem jeden wątek.
DA
Ale chyba wciąż masz problem ze wskaźnikiem TCHAR*, czyli zgodnie z tytułem wątku. Tylko teraz chyba doszedłeś do dualizmu const/not const w starciu z winapi.
ID
Okienko uruchamia się i pokazuje zawartość z TCHAR* w ListView. Praktycznie można by powiedzieć, że niby jest ok, tylko może nie do końca zgodnie ze sztuką. Postaram się to sformatować w zwięzły sposób i tu wrzucić, ale to jutro.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.