[C++] WinApi Visual Studio 2008 Expres

0

Witam

Mam problem, mam gotowy przyklad z msdn'a

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

                   LPSTR lpszCmdLine,   int nCmdShow)

{

   MessageBox(
        NULL,
        (LPCWSTR)L"Resource not available\nDo you want to try again?",
        (LPCWSTR)L"Account Details",
        MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
    );

   return 0;

}

i ciagle wywala mi jakies bledy

np.
1>.\main.cpp(14) : error C2664: 'MessageBox' : cannot convert parameter 2 from 'LPCWSTR' to 'LPCTSTR'

po zmianie kodowania znaków wywala mi inne bledy, 2 godziny googlowania, kroki które innym pomagaly mi nie chca pomoc ;/ macie jakis pomysł

próbowałem tez wersje

MessageBoxW oraz MessageBoxA

0
**(LPCWSTR)**L"Resource not available\nDo you want to try again?",

Nie mów, że takie paskudne nawiasy rzutujące są w example'u, sam je dopisałeś jak się nie kompilowało, oj lepiej się przyznaj :>

new_user napisał(a)

1>.\main.cpp(14) : error C2664: 'MessageBox' : cannot convert parameter 2 from 'LPCWSTR' to 'LPCTSTR'

Rozwiązanie:

   MessageBox(
        NULL,
        /*(LPCWSTR) wywal w cholere te nawiasy*/ TEXT("Resource not available\nDo you want to try again?"),
        /*(LPCWSTR) i daj TEXT() zamiast tych L */ TEXT("Account Details"),
        MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2
    );
0

nie dziala

 1>main.obj : error LNK2028: unresolved token (0A000028) "extern "C" int __stdcall MessageBoxA(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBoxA@@$$J216YGHPAUHWND__@@PBD1I@Z) referenced in function "extern "C" int __cdecl MessageBox(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PBD1I@Z)
1>main.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall MessageBoxA(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBoxA@@$$J216YGHPAUHWND__@@PBD1I@Z) referenced in function "extern "C" int __cdecl MessageBox(struct HWND__ *,char const *,char const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PBD1I@Z)

a do spekulacji ze sam dopisalem , proponuje zajerzeć pod link
http://msdn.microsoft.com/en-us/library/ms645505%28VS.85%29.aspx

0

hmm, faktycznie, zwracam honor :>

po wpisaniu treści erroru w google od razu pojawił się bliźniaczy temat:
http://www.codeguru.com/forum/archive/index.php/t-478934.html

gościu pisze że rozwiązał go poprzez zaznaczenie dziedziczenia ustawień, w zakładce Linker -> Comand Line musisz to zaznaczyć, sprawdź
poza tym masz przy okazji wyjaśnione czym jest to tajemnicze makro TEXT()

w każdym razie masz skopsane ustawienia projektu, albo skopsane SDK, co jest mniej prawdopodobne :>
bo kod masz poprawny

0

źle ci powiedziałem nie w Command Line :> zrób tak jak tam ma :> wtedy zobaczymy

0

kurde, przeszukalem z 15 tematow a tego co podales nie znalazlem, jak bys mogl tylko mi powiedziec o co chodzi z tym linkerem (co on rzekomo ma dziedziczyc ? ) bo jak dla mnie to najtrudniejsze jest ustawienie tego visuala :/ w java nigdy takich problemow nie ma :/ czy innym jezyku a ten kompilator/srodowisko jest dobijajacy

0

Czy ty przypadkiem nie stworzyłeś pustego projektu, do którego dodałeś plik z WinMain? Jeśli tak, to odpowiedź jest prosta: dodaj do projektu wszystkie niezbędne biblioteki LIB. W przypadku MessageBoxa będzie to User32.lib. A jeszcze lepiej będzie, jeśli po prostu stworzysz projekt aplikacji Win32, wybierając odpowiednia opcję w kreatorze.

0

zobacz czy masz tak ustawione "Additional Dependencies" w "Input": http://img522.imageshack.us/img522/1649/wowbm.png

msimg32.lib ci nie potrzebne, ale w tym ciemniejszym niższym edicie powinieneś mieć trochę libek i musisz mieć zaznaczone to "inherit parent coś tam..."

0

Ludzie, nauczcie się tworzyć prawidłowy typ projektu i korzystać z dokumentacji?

@Nobody, Twoje rady tylko wprowadzają w błąd.
@new_user, stwórz projekt z grupy Win32, pewnie Console Application, i ew. potem w kreatorze daj Empty Project dodając potem sobie plik .cpp. Na chwilę obecną opcja Precompiled Headers powinna być odznaczona, przynajmniej póki nie opanujesz podstaw. Kod jest pod unicode, co jest domyślnym kodowaniem projektów Visuala, powinien pójść od razu. Zajrzyj do dokumentacji i przeczytaj wprowadzenie skoro sobie nie radzisz.

0

witam

dzięki za zainteresowanie

a więc tak

@deus , owszem działa jeżeli dałem win32 aplikacje , nie działało w sytuacji gdy dalem aplikacje CLR - moj blad. Nie czytalem dokumentacji bo nie wiedzialem ze to takie wszystko jest pokrecone, w innych jezykach jak Java nie ma takich problemow - moj drugi blad, ale skad moglem wiedziec ze visual az tak utrudnia zycie taka duza ilościa konfiguracji

@Nobody , twoje rady pomogly, zapomnailem rano odpisac ze pomogl tamten artykul, jezeli zmienilem 'adidional dependices' to zadzialalo :)

@_0x666_ owszem, bylby taki problem gdybym nie includowal pliku windows.h, i gdyby kompilator nie includowal tych bibliotek, naszczescie te biblioteki sa automatycznie includowane/linkowane przez kompilator

reausumując, dowiedziałem sie ze w zaleznosci od tego jaki wybiore projekt to az tyle rzeczy jest pozmienianych w ustawieniach tak wiec dziekuje wszystkim za zainteresowanie i pomoc, pomogło

pozdrawiam

0

No jak wybrałeś projekt CLR to się nie ma co dziwić, tam się pisze w C++\CLI, a to jednak dość zmieniony język w stosunku do czystego C++

0

a z tym kodowaniem to jak to jest? czy przykladowoo bedzie problem z odczytem danych zapisanych w unicode a projekt ma 'charakter set ' -> 'not set'

0

zależy o jakim unicodzie mówisz, UTF-16?

0

To WIndows wspiera natywnie coś innego niż ANSI i UTF-16? Nie mówię o funkcjach do konwersji/konsoli.

0

tak, jezeli nie wybiore mu charecter set to czy bede mogl normlanie zaincludowac plik utf-8 || 16, @deus pisze ze tylko utf-16 wspiera wiec juz nie wiem

bo jezeli np, wybiore character set -> multi-byte , i bede chcial wczytac dane ktore sa zapisane w utf to czy wystarczy uzyć odpowiedniej funkcji/stalej dla funkcji aby poprawnie je wczytac?

czy w jakim celu wybieramy 'character set ' ?

0
new_user napisał(a)

tak, jezeli nie wybiore mu charecter set to czy bede mogl normlanie zaincludowac plik utf-8 || 16, @deus pisze ze tylko utf-16 wspiera wiec juz nie wiem

bo jezeli np, wybiore character set -> multi-byte , i bede chcial wczytac dane ktore sa zapisane w utf to czy wystarczy uzyć odpowiedniej funkcji/stalej dla funkcji aby poprawnie je wczytac?

czy w jakim celu wybieramy 'character set ' ?

To co tam wybierzesz wpływa na obecność makr _UNICODE, UNICODE, które znowu w windows.h wpływają na wybór wersji funkcji której używasz, a masz już 2 wymienione możliwości: ANSI (char*) i UTF-16 (wchar_t*)
Bo przykładowo MessageBox istnieje w 2 wersjach: MessageBoxA(parametry tekstowe w char*) i MessageBoxW(parametry txt w wchar_t*) (wszystkie UTF kończą się na W, ANSI na A) i ty pisząc w kodzie MessageBox nieświadomie korzystasz z jednej z nich, a która to będzie definiuje makro UNICODE czyli opcja którą ustawisz...

Do UTF-8(np. wczytywanego tekstu) i innych konwersji możesz użyć WideCharToMultiByte/MultiByteToWideChar, gdyż jak zaznaczył deus, tylko(a może aż?) natywnie jak na razie są tylko te 2 możliwości...

0

dzięki :) teraz rozumiem o co te całe zamieszanie

0

No jak wybrałeś projekt CLR to się nie ma co dziwić, tam się pisze w C++\CLI, a to jednak dość zmieniony język w stosunku do czystego C++
Teoretycznie wszystko powinno działać, tzn. program napisany w zwykłym C++ powinien się dać skompilować jako C++/CLI.

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.