Problem z podstawą WinAPI

0

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

#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

0

Sprobuj w ten sposób:

 MessageBox (NULL, L"Oto nasz pierwszy program w Windows!",L"Komunikat", NULL); 
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".

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.

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.

0

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

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

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

0

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

0

Zawsze zaczynam z Empty Project...

1 użytkowników online, w tym zalogowanych: 0, gości: 1