[c++ WINAPI] Funkcje z DLL - błąd

0

Witam!

Chcę użyć funkcji:
SetLayeredWindowAttributes
z User32.dll. Deklaruje w pliku:
WINUSERAPI BOOL WINAPI (*SetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD);
a pózniej wywołuje:

void initTW(void){
	userDLL=LoadLibrary("User32.dll");
	if(!userDLL){
		userOK=FALSE;
		return;
	}
	(FARPROC)SetLayeredWindowAttributes=GetProcAddress(userDLL,"SetLayeredWindowAttributes");
	if(!SetLayeredWindowAttributes){
		userOK=FALSE;
		return;
	}
	userOK=TRUE;
	return;
}

I wszystko było OK. Bo używałem - Borland C++ 4.52, ale pojawiły się problemy z pamięcią i zainstalowałem Borland C++ 5.0 i przy próbie kompilacji wywala:
extern variable cannot be initialized
Z góry dziękuję za odpowiedzi!

0

Po cholerę ładujesz ręcznie bibliotekę?? SetLayeredWindowAttributes() jest w winuser, z tym, że chyba dla WINVER/_WIN32_WINNT >= 0x0500 (w MinGW tak jest)

#define WINVER 0x0600
#include <windows.h>

int main()
{
//...
   SetLayeredWindowAttributes(...);
//...
}

i pozamiatane...

0

Nie działa tak u mnie. W winuser.h w Includach tego kompilatora nawet nie ma deklaracji SetLaye....
A jak próbowałem mu podmienić plik z SDK to wyskakuje mnóstwo błędów. Kompilator robili 1992-1996 więc wiekowy jest trochę :). Ale skoro starszy kompilator mój kod obsługiwał, to zastanawiam się dleczego młodszy nie chce. Szukałem w opcjach, ale nic nie pomogło. Czy sam kodzik u góry jest OK na wygląd?

0

Nie... Nie wygląda OK
Masz rzutowanie po lewej stronie!
To powinno być tak napisane:

	FARPROC ss = GetProcAddress(userDLL,"SetLayeredWindowAttributes");
    	if(!ss){
                userOK=false;
                return;
        }
        SetLayeredWindowAttributes = reinterpret_cast<WINUSERAPI BOOL WINAPI(*)(HWND, COLORREF, BYTE, DWORD)>( ss );
        userOK=true;

W każdym razie załatw sobie lepszy (nowszy) kompilator...

0

hmm..
ale kompilator do tego się nie czepiał
Tylko do deklaracji:
WINUSERAPI BOOL WINAPI (*SetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD);
co nie tak jest z nią?

0

hmm..
ale kompilator do tego się nie czepiał
Tylko do deklaracji:
WINUSERAPI BOOL WINAPI (*SetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD);
co nie tak jest z nią?

Wszystko w porzo, pod warunkiem, że nie jest zadeklarowana już :)
Spróbuj zmienić nazwę wskaźnika na inny...
Na pewno masz błąd z tym rzutowaniem, być może jeszcze gdzieś tkwi błąd, bo to jest tylko fragment programu..

0

Działa - zrobiłem tak:

BOOL CALLBACK (*SetLayeredWindowAttributes)(HWND, COLORREF, BYTE, DWORD);

I funkcja:

BOOL initTW(void){
	userDLL=LoadLibrary("User32.dll");
	if(!userDLL){	
		return FALSE;
	}	
   (FARPROC)SetLayeredWindowAttributes=GetProcAddress(userDLL, "SetLayeredWindowAttributes");
	if(!SetLayeredWindowAttributes){
		return FALSE;
	}
	return TRUE;
}

I śmiga! :):):)

A kompilator próbowałem zmienić. Nawet ściągnąłem sobie Dev'a, ale może słabo szukałem, jakoś nie mogłem znaleźć łatwego robienia dialogów, np. InitCommonControl(); nie ma.
marcinEc pisałeś o MinGW - polecasz? A, mógłbyś wytłumaczyć trochę Twoją wypowiedź:

reinterpret_cast<WINUSERAPI bool WINAPI(*)(HWND, COLORREF, BYTE, DWORD)>

Dzięki za odpowiedzi!</cpp>

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