Wyciągnięcie hInstance przed wywołaniem maina

0

Hey, jestem w trakcie obudowywania WinApi po swojemu i mam pewną wątpliwość.
Otóż czy jest poprawne zainicjowanie zmiennej globalnej w taki oto sposób:

HINSTANCE g_hInstance = GetModuleHandle(NULL);   //<---------------------???
//...
int APIENTRY _tWinMain(_In_ HINSTANCE przypadkowo_inna_nazwa,   //<----------------!!!
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
//...

}

Chodzi mi o to, że dzięki temu mógłbym mieć globalny uchwyt do instancji nawet jeśli w przyszłości wprowadzę (świadomie lub nie) inną nazwę zmiennej HINSTANCE. Natomiast taką zmienną globalną mógłbym wówczas wykorzystywać w klasach, które obecnie tworzę.

Z góry dziękuję za rozwianie moich wątpliwości

1
/* plik H */ 
class CHInstance
{
public:
	CHInstance() { m_inst = GetModuleHandle(NULL); }
	operator HINSTANCE() { return m_inst; }
private:
	HINSTANCE	m_inst;
};

extern CHInstance g_hInstance;

/* plik CPP (np. WinMain) */
CHInstance g_hInstance;
0

@_0x666_ Dzięki za odpowiedź.
Jeśli pozwolisz to mam dwa pytanka:

  1. Czym w zasadzie różni się Twoje rozwiązanie od mojego? Czy jest jakaś znacząca różnica? Jaka jest przewaga Twojego rozwiązania?
  2. Może to głupie pytanie, ale dlaczego tak można: operator HINSTANCE() - co to w ogóle jest?!

Z góry dzięki za odpowiedź.

1
  1. dałeś wywołanie funkcji poza ciałem jakiejkolwiek innej funkcji - to po prostu nie zadziała.
  2. to jest operator konwersji, dzięki niemu będziesz mógł używać g_hInstance jakby był zwykłym uchwytem typu HINSTANCE (oczywiście read-only).

Generalnie ta klasa jest odpowiedzią wprost na Twoje pytanie, choć jej sens według mnie jest nieco wątpliwy, ponieważ jeśli "obudowujesz WinAPI", sensowniej byłoby stworzyć klasę np. CApp, która poza zabawą z uchwytem HINSTANCE realizowałaby pętlę komunikatów i inne rzeczy niezbędne do działania aplikacji okienkowej.

0

Jeszcze raz dzięki @_0x666_

0x666 napisał(a):

dałeś wywołanie funkcji poza ciałem jakiejkolwiek innej funkcji - to po prostu nie zadziała.

A jednak... Sprawdziłem to i działa ;-) -> stąd moje pytanie i wątpliwości, bo również mnie to zdziwiło i zaciekawiło! Jakby nie działało to nie byłoby pytania ;P. Porównałem również wyniki zmiennej przekazywanej do WinMain ze zmienną, która otrzymała wartość hInstance przez GetModuleHandle(NULL) i wyniki są identyczne.

0x666 napisał(a):

to jest operator konwersji, dzięki niemu będziesz mógł używać g_hInstance jakby był zwykłym uchwytem typu HINSTANCE (oczywiście read-only).

Rzeczywiście, dopiero teraz głębiej zajrzałem do dokumentacji i doszedłem, że HINSTANCE to w rzeczywistości void*. Wcześniej miałem wątpliwość czym to w ogóle jest i zdziwił mnie ten zapis w Twojej klasie ;-) -> teraz już wszystko jasne.

0x666 napisał(a):

Generalnie ta klasa jest odpowiedzią wprost na Twoje pytanie, choć jej sens według mnie jest nieco wątpliwy, ponieważ jeśli "obudowujesz WinAPI", sensowniej byłoby stworzyć klasę np. CApp, która poza zabawą z uchwytem HINSTANCE realizowałaby pętlę komunikatów i inne rzeczy niezbędne do działania aplikacji okienkowej.

Tak, może to i dobry pomysł. Na razie jestem na etapie planowania i uczenia się jednocześnie ;-).

pozdrawiam!

0

@furious programming tak, w zasadzie rozwiązany - można dać plusika. Dzięki!

0

a po co ci taka zmienna globalna?
jak potrzebujesz, to zrób GetModuleHandle(NULL), ale lokalnie w funkcji tam gdzie tego używasz.

0

A jednak... Sprawdziłem to i działa ;-) -> stąd moje pytanie i wątpliwości, bo również mnie to zdziwiło i zaciekawiło!

Masz rację, tutaj mój błąd, a raczej niewiedza. Sprawdziłem w standardzie C++ jak to wygląda, i faktycznie taki zapis jest poprawny i nazywa się dynamic initialization of non local (static) object. Szczerze mówiąc nigdy to do niczego nie było mi potrzebne. Cóż, człowiek uczy się całe życie... ;)

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