WinAPI pod VC++ 2005

0

Ostatnio zacząłem naukę WinAPI. Postanowiłem, że przy tej okazji warto przesiąść się na jakieś "poważniejsze" IDE. Postawiłem na Visual C++ 2005 Express Edition. Ponieważ "w zestawie" nie ma bibliotek do programowania Winzgrozy, pobrałem Platform SDK do WinXP SP2. Teraz w VC++ directories wrzucam katalogi include i lib z PSDK. Następnie piszę prościutki programik pod WinAPI...

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	MessageBox (NULL, TEXT ("Ala ma kota."), TEXT ("Okno Ali"), 0) ;
	return 0 ;
}

kompiluję i...

1>E:\PSDK\Include\unknwn.h(397) : error C2146: syntax error : missing ')' before identifier '_pRpcMessage'
1>E:\PSDK\Include\unknwn.h(397) : warning C4229: anachronism used : modifiers on data are ignored
1>E:\PSDK\Include\unknwn.h(397) : error C2182: 'AsyncIUnknown_Begin_QueryInterface_Stub' : illegal use of type 'void'
1>E:\PSDK\Include\unknwn.h(397) : error C2078: too many initializers
1>E:\PSDK\Include\unknwn.h(397) : error C2275: 'PRPC_MESSAGE' : illegal use of this type as an expression
1>        E:\PSDK\Include\rpcdcep.h(51) : see declaration of 'PRPC_MESSAGE'

...dostaję 103 błędy i 45 ostrzeżeń o treści mniej-więcej takiej jak powyżej. Ogólnie rzecz biorąc są to błędy z dziesiątek plików nagłówkowych, ale prawdę mówiąc, nie mam pojęcia czego dotyczą. :/ Czy ktoś jest w stanie mi po wiedzieć o co tutaj chodzi? Czy może występuje jakiś brak zgodności pomiędzy VC++ 2005 EE a WinXP SP2 PSDK? A może to kwestia konfiguracji VC? Bardzo proszę o pomoc! Jakakolwiek wskazówka będzie dla mnie bardzo ważna!

0

idz do opcje projektu -> C++ -> preprocessor -> preprocessor definitions
i sprawdz czy masz cos w stylu "WIN32;_WINDOWS;STRICT;_DEBUG"
na pewno potrzebujesz miec zdefiniowane WIN32 oraz _WINDOWS

0
quetzalcoatl napisał(a)

idz do opcje projektu -> C++ -> preprocessor -> preprocessor definitions
i sprawdz czy masz cos w stylu "WIN32;_WINDOWS;STRICT;_DEBUG"
na pewno potrzebujesz miec zdefiniowane WIN32 oraz _WINDOWS

Zrobiłem tam jak napisałeś (brakowało _WINDOWS), ale nadal sypie się w ten sam sposób... :( W każdym razie dziękuję za pomoc.

0

Jesteś pewien że prawidłowo dodałeś PSDK do VC++

http://wiki.gamedev.pl/Instalacja_Visual_CPP_2005_Express

microsoft

0

Więc tak... zainstalowałem PSDK do Windows Vista. Zmieniłem VC++ Directiories na nowe include'y, lib'y etc. Poprzednie błędy "zniknęły". Teraz coś nowego... ;]

1>Linking...
1>main.obj : error LNK2001: unresolved external symbol "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z)

Czuję, że zbliżam się do celu. ;] Jak tylko dowiem się czego dotyczy ten błąd to będę w niebie...

0

No dotyczy tego, ze nie sa dolaczone odpowiednie biblioteki do importowania funkcji z dll, w tym przypadku prawdopodobnie user32.lib, a w naglowkach masz tylko deklaracje.

0

Hmm... dziwna sprawa. Najpierw sam konfigurowałem VC++, potem użyłem narzędzia z PSDK, które samo zajęło się konfiguracją VC. Zarówno w pierwszym jak i w drugim przypadku pojawia się ten sam błąd (dwa posty wcześniej) - "unresolved external symbol (...)".

Już nie mam pojęcia co z tym zrobić. :/ W dokumentacji PSDK nie znalazłem żadnej wskazówki. Czy ktoś ma jeszcze jakiś pomysł...?

0

Pół dnia nad tym dzisiaj siedziałem. Jedyny wniosek do jakiego doszedłem to typ projektu. Otóż tworząc mój projekt wybrałem typ Empty Project. Ktoś zapyta, dlaczego nie Win32 Project? Otóż w oknie nowego projektu NIE MA takiego projektu. Przegrzebałem pół netu w poszukiwaniu takiego szablonu... MSDN, CodeGuru, różne wiki, gogle męczyłem, ale NIC.

Czy ktoś jest mi w stanie powiedzieć, jak zainstalować w VC++ EE szablon do Win32 Project??

0

w darmowym msvs2005 EE nie ma tego typu projektu po prostu..
edit: tzn, jest - ale zablokowany.. wybierz console application i potem w wizardzie na ktorejs zakladce bedziesz mial kilka typow do wyboru - bodajze empty, console, windows.. i ten ostatni to jest to czego Ci trzeba, ale zablokowany.. nie wiem jak mozna odblokowac

0

A to bambusy! 8/ W takim razie czy pod VC++ 2005 EE jest możliwość pisania w Win32 API?? Czy VC łyknie to bez odpowiedniego szablonu, czy wystarczy samemu skonfigurować projekt?

PS. Ręce opadają przez ten M$... :/ jak tak dalej pójdzie to wrócę do DevCpp. :]

0

... Albo ściągnij sobie nowy VC++ 2008, tam możesz pisać wszystko od podstaw, ja mam wersje Express i wszystko ładnie śmiga :)

0

Działa. :D Ogromne dzięki! Nie wiem jakim cudem nie natrafiłem na tą stronkę... ale wszystko jest tam opisane. Jeszcze raz ogromne dzięki!

No to może jeszcze coś dla potomnych (gdyby mało-miękkiemu zachciało się usunąć tamtą stronkę):

  1. W Tools -> Options -> Projects and Solutions -> VC++ Directories wstawiamy nowe linijki dla Executable files, Library files i Include files w których wpisujemy odpowiednie ścieżki katalogów z PSDK.

  2. Edytujemy plik ...\Microsoft Visual Studio 8\VC\VCProjectDefaults\corewin_express.vsprops:

AdditionalDependencies="kernel32.lib"
zamieniamy na

AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"

  1. Edytujemy plik ...\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1033\AppSettings.htm:
WIN_APP.disabled = true;
WIN_APP_LABEL.disabled = true;
DLL_APP.disabled = true;
DLL_APP_LABEL.disabled = true;

zmieniamy na (dodajemy "//" na początek każdej linijki):

// WIN_APP.disabled = true;
// WIN_APP_LABEL.disabled = true;
// DLL_APP.disabled = true;
// DLL_APP_LABEL.disabled = true;

Teraz wszystko działa, a i w Windows Console Application Wizard można wybrać "Windows Application". A niedowiarków odsyłam do linka w poście powyżej. :)

0
Borsuk napisał(a)

Edytujemy plik ...\Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application\html\1033\AppSettings.htm:

WIN_APP.disabled = true;
WIN_APP_LABEL.disabled = true;
DLL_APP.disabled = true;
DLL_APP_LABEL.disabled = true;

zmieniamy na (dodajemy "//" na początek każdej linijki):

poleglem.. M$ walnal blokade pierwsza klasa. ROTFLLL!!!

0

Dokładnie! _ Konia z rzędem temu, kto mi powie PO KIEGO GRZYBA oni to zrobili?! A tym bardziej, dlaczego, program który dostosowywał VC do PSDK nie usunął tego shit'u?! Tylko pogratulować pomysłowości. Ehh... ;]

0

niedowiarków odsyłam do linka w poście powyżej.

I linków w poście nr. 4 w tym wątku z 27-01-2008 19:12 ;-) .

0

Prawda, prawda! Zwracam honor! :) Jakoś umknął mojej uwadze ten post. Dzięki. ;)

0

amerykę odkryłeś?
przecież dzejo dał Ci link jak to zrobić... trzeba czytać uważnie!

wracając do VC05 to abyś mógł skonsolidować program to należy dokonać takiej zamiany:
MessageBox - >MessageBoxA
mało tego, vc wymaga dodania sdtafx.h do każdego projektu nawet konsolowego

#include "stdafx.h"
#include <windows.h>

int __callback WinMain (HINSTANCE, HINSTANCE, LPSTR , int)
{
        MessageBoxA (NULL, "Ala ma kota.", "Okno Ali", NULL) ;
        return 0 ;
}
0

Hmm... Prawde mówiąc, program, w takiej formie, jak podałem na samym początku, po skonfigurowaniu VC, działa bez najmniejszych zarzutów. Odnośnie reszty, to z tego co się orientuję MessageBoxA / MessageBoxW to zaszłość po Windowsie 98, gdzie Unikod nie był jeszcze tak szeroko stosowany. MessageBox sam "podejmuje decyzję", którą z tych funkcji wywołać. Co do __stdcall, to WINAPI w zupełności je zastępuje...

#define WINAPI __stdcall

...ale mogę się mylić. ;)

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