Problem z podstawą WinAPI

Problem z podstawą WinAPI
roman_300
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Witam ma problem. Gdy kompiluję ten nadzwyczaj skomplikowany kod:

Kopiuj
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdLine, int nCmdShow)
{
	MessageBox (NULL, "Oto nasz pierwszy program w Windows!","Komunikat", NULL);
	return 0;
}
 

Zawsze pojawia się bląd:

1>d:\roman300\c++\projects----\base.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [37]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Oczywiście gdy zamiast tekstu damy NULL, wszystko działa.

Kod pochodzi z jednego z wielu kursów C++

Jbc środowisko to XP visual 8 Exprees Edition

Czy problem może powodować to że wersja Exprees nie posiada wszystkich możliwości płatnego kompilatora??

Proszę o pomoc. Jak można to jakiś kod który zadziała ;D

L1
  • Rejestracja: dni
  • Ostatnio: dni
0

Sprobuj w ten sposób:

Kopiuj
 MessageBox (NULL, L"Oto nasz pierwszy program w Windows!",L"Komunikat", NULL); 
  • Rejestracja: dni
  • Ostatnio: dni
0

Komunikat mówi że nie zgadzają się typy. Nie znam się na WinAPI, ale wiem że jest w MSDN opis typów napisów dla WinAPI. *const char ** to typ napisu dla zwykłych programów C++, nie tych WinAPI. O ile pamiętam dobrze, LPCWSTR to wskaźnik do stałego napisu o elementach typu wchar_t. Czyli pewnie wystarczy zamiast "napisHelloWorld" napisać: L"napisHelloWorld".

MR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
0

MessageBox to tak na prawdę albo MessageBoxA (stringi oparte o typ char) albo MessageBoxW (stringi oparte o typ wchar_t). O ile się nie mylę to chyba da się gdzieś w ustawieniach projektu wybrać domyślną wersję MessageBoxa. Możesz też jawnie użyć wersji MessageBoxA.

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Wszystko zależy od ustawienia makra UNICODE. Domyślnie jest ono ustawione i tego typu makra będą wskazywały na funkcje z końcówką W. I tak powinno być, ANSI to relikt czasów Windowsa 98 i tam powinien pozostać.

Można również pisać kod, który skompiluje się dla obydwu ustawień, tj. korzystać z MessageBox zamiast MessageBoxW czy literały tekstowe wrzucać w makro TEXT("literał"), które doda prefiks L, gdy ustawione będzie UNICODE. Jako wskaźnik na ciąg tekstowy używa się typów LPTSTR i LPCTSTR (const), a funkcje do obsługi tekstu z biblioteki standardowej C w formie _tcslen (prefiks _t oznacza tutaj str albo wcs i zostanie użyte strlen albo wcslen). Trzeba dołączyć nagłówek <tchar.h>.
Oczywiście nikt też raczej nie będzie robił problemów, gdy ktoś napisze program, który skompiluje się tylko z zadeklarowanym UNICODE.

roman_300
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Mógłby ktoś podpowiedzieć gdzie ustawić to makro???

Gdy dodam to 'L' nadal jest błąd.

Kopiuj
MessageBox (NULL, L"Oto nasz pierwszy program w Windows!",L"Komunikat", NULL); 

Tym razem coś innego ;D

1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>D:\ROMAN300\C++\Projects--\Debug--.exe : fatal error LNK1120: 1 unresolved externals

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0

Kiedy tworzysz nowy projekt zaznacz tam "stworz nowy pusty projekt".

roman_300
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Zawsze zaczynam z Empty Project...

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.