Beetje vaag uitgelegd, maar dit is zo ongeveer mijn probleem:
Ik ben op het moment een beetje aan het rommelen met Win32 GUI (CreateWindow) zooi icm. sockets om zo een asynchrone client te maken.
Dit werkt allemaal prima als ik alle connect code in mijn class constructor gooi. Nu vind ik dat sowieso niet een geweldige oplossing, en daar komt nog bij dat ik ook de hwnd van de huidige window mee wil geven aan de class zodat ik WSAAsyncSelect kan callen. Dit is een probleem want dan zal ik mijn class instance moeten definieren in de private scope van de WinMain functie, waardoor ik de class instance bijvoorbeeld niet meer kan bereiken in WndProc (wanneer ik callbacks krijg voor FD_READ etc).
Nu is mijn oplossing hiervoor, dat ik alleen WSAStartup() in mijn class constructor aanroep. Vervolgens definieer ik een class instance in de global scope (zonder parameters), waarna ik vervolgens een nieuwe Connect functie aanroep als WM_CREATE wordt getriggered. Op die manier heb ik namelijk wel een globale class instance, en kan ik hem ook aanroepen met HWND parameter. Ook hier heb ik een probleem, namelijk dat mijn socket() call _altijd_ SOCKET_ERROR returned.
WSAGetLastError() geeft gewoon 0 terug. De class constructor (met WSAStartup) wordt gewoon aangeroepen voordat Connect() wordt aangeroepen, dus in principe wordt precies dezelfde code uitgevoerd als wanneer ik alles in de constructor had.
Pseudo code:
Werkt WEL:
Werkt NIET:
Ik hoop dat het een beetje duidelijk is... Als er nog vragen zijn hoor ik het graag, wordt er onderhand een beetje gek van.
Ik ben op het moment een beetje aan het rommelen met Win32 GUI (CreateWindow) zooi icm. sockets om zo een asynchrone client te maken.
Dit werkt allemaal prima als ik alle connect code in mijn class constructor gooi. Nu vind ik dat sowieso niet een geweldige oplossing, en daar komt nog bij dat ik ook de hwnd van de huidige window mee wil geven aan de class zodat ik WSAAsyncSelect kan callen. Dit is een probleem want dan zal ik mijn class instance moeten definieren in de private scope van de WinMain functie, waardoor ik de class instance bijvoorbeeld niet meer kan bereiken in WndProc (wanneer ik callbacks krijg voor FD_READ etc).
Nu is mijn oplossing hiervoor, dat ik alleen WSAStartup() in mijn class constructor aanroep. Vervolgens definieer ik een class instance in de global scope (zonder parameters), waarna ik vervolgens een nieuwe Connect functie aanroep als WM_CREATE wordt getriggered. Op die manier heb ik namelijk wel een globale class instance, en kan ik hem ook aanroepen met HWND parameter. Ook hier heb ik een probleem, namelijk dat mijn socket() call _altijd_ SOCKET_ERROR returned.
WSAGetLastError() geeft gewoon 0 terug. De class constructor (met WSAStartup) wordt gewoon aangeroepen voordat Connect() wordt aangeroepen, dus in principe wordt precies dezelfde code uitgevoerd als wanneer ik alles in de constructor had.
Pseudo code:
Werkt WEL:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class blah {
private:
WSAData wsa
SOCKET s
public:
constructor(parameters) {
WSAStartup
Maak socket aan
verbind naar (parameters)
}
}
WinMain {
blah instance(parameters);
} |
Werkt NIET:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| class blah {
private:
WSAData wsa
SOCKET s
public:
constructor() {
WSAStartup
}
connect(parameters) {
Maak socket aan
Verbin naar (parameters)
}
};
GLOBAAL: blah instance
WndProc {
WM_CREATE:
instance.Connect(parameters)
break
} |
Ik hoop dat het een beetje duidelijk is... Als er nog vragen zijn hoor ik het graag, wordt er onderhand een beetje gek van.