Was zum T... ist HINSTANCE?
-
Ich frage mich was HINSTANCE/WWND etc... ist - ist es ein int oder Structur oder sonst was - ich kann die Definition davon niergendwo finden...
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL,"Hello, Windows 98","Hello World",0);
}
-
Ups ich meinte nicht WWND, sondern HWND... aber oh hier habe ich was gefunden:
http://www.winamp.com/nsdn/winamp3x/sdk/docs/platform_8h.htmlAllerdings bin ich jetzt verwirrt, denn für HWND wurde in VB Long eingesetzt:
Declare Function CloseWindow Lib "user32" Alias "CloseWindow" (ByVal hwnd As Long) As Long
in C++ ist es aber (nach der oberen Liste)
typedef void * HWND
was ist nun richtig?
-
Also, mir ist das eigentlich ziemlich schnuppe. Wenn ein HISTANCE verlangt wird, gebe ich der Funktion/Methode ein HINSTANCE. Wenn ein HWND verlangt oder gebraucht wird, definiere ich eben ein HWND.
Mir ist das eigentlich egal, hab früher mal mit WinAPI programmiert, hat mich aber auch nicht wiklich interessiert.[ Dieser Beitrag wurde am 03.06.2003 um 19:54 Uhr von HAR editiert. ]
-
Windows arbeitet mit sogenannten Handles. Diese gibt es überall, du erkennst sie daran, dass die Datentypen mit einem H anfangen. Nach der Hungarischen Notation folgend ist es üblich, ein h dem Variablennamen anzustellen. Diese Handles findest du überall:
HWND ist
ein HANDLE auf ein Fenster. In Windows wird ein Fenster aus Fenstern aufgebaut. Das bedeutet das nicht nur dein Hauptfenster ein Fenster ist, sondern auch die Steuerelemente (Buttons, Textfelder, Listboxen, usw.), Dialoge, Toolbars, Statusbars und und und.... Das Hauptfenster ist dann das Parentwindow bzw.Elternfenster. Das entscheidene ist jetzt das für jedes Fenster ein HANDLE existiert, über welches ein Fenster eindeutig identifiziert werden kann. Ich habe mir ein HANDLE immer so vorgestellt wie ein Zeiger aber AFAIK ist es kein Zeiger. Allerdings geht es bei einem HANDLE auch um eine Speicheradresse.
HANDLES braucht du übrigens auch noch für weitere Elemente: Beim Multithreading bekommt jeder Thread einen handle, der Datentyp da ist HANDLE, dann gibt es verschiedene weitere handles:
HDC - handle zu einem Gerätekontext
HBITMAP - handle zu einem Bitmap
HIMAGELIST - Handle zu einer ImagelisteDas HINSTANCE ist, wie du schon siehst wiederum ein HANDLE. Der Anfangsprogramm eines jedem Programms ist eine Main- funktion. In einem Windowsprogramm wird diese abgelöst durch eine WinMain - Funktion. Dort wird die Kontrolle über das Betriebssystem dem Programm übergeben. Allerdings ist Windows ja nicht nur Multithreadingfähig (für die Threads ist das Programm selbst verantwortlich), sondern auch multitaskingfähig. Das bedeutet, Windows kann mehrere Anwendungen gleichzeitig laufen lassen. Um nun mit dem Programm kommunizieren kann, bekommt jedes Programm eine Nummer, über die es identifiziert werden kann. HINSTANCE ist dann ein HANDLE auf die vom Betriebsystem zugewiesene Identifikationsnummer.
Also ich will nochmal betonen, ich bin kein Win32- API Experte und wenn andere Antworten kommen dann frag lieber nochmal nach, aber so habe ich es im Kopf. Wenn ich dir noch einen Tipp geben kann, kauf dir lieber ein Windowsbuch. Das von Charles Petzold ist wirklich sehr gut. Also ich wünsche dir noch einen schönen Abend.
-
HINSTANCE ist dann ein HANDLE auf die vom Betriebsystem zugewiesene Identifikationsnummer.
nein, das ist es nicht. aber was es genau ist, weiß ich auch nicht...
-
naja wenn du nicht weisst was es ist solltest du dich vorher auf jedenfall informieren... ich habe meine Quellen und dort ist es so erklärt, wenn ihr was anderes wisst dann lasst es mich wissen.
-
Der eigentliche Wert des hInstExe-Parameters der Funktion (w)WinMain ist die Basisadresse des Speicherbereichs, in den das Betriebssystem die Speicherabbildung der EXE-Datei in den Adressraum des Prozesses geladen hat.
Quelle: Jeffrey Richter: Windows Programmierung für Experten (3-86063-615-4)
Ist übrigens die ideale Ergänzung wenn der Petzold zu wenig ins Detail geht.
-
"Die hInstance-Eigenschaft gibt bei Anwendungen, die mit der 16-Bit-Version von Visual Basic erstellt wurden, einen Wert vom Typ Integer zurück, und bei Anwendungen, die mit der 32-Bit-Version erstellt wurden einen Wert vom Typ Long.
Wenn Sie mit einem Projekt in der Visual Basic-Entwicklungsumgebung arbeiten, gibt die hInstance-Eigenschaft die Zugriffsnummer der Visual Basic-Instanz zurück."
- MSDN"WINDEF.H(253): typedef HINSTANCE HMODULE; /* HMODULEs can be used in place of HINSTANCEs */"
-
Habe in den Headern rumgesucht und was gefunden:
zuerst steht:#ifndef NO_STRICT
#ifndef STRICT
#define STRICT 1
#endif
#endifwobei NO_STRICT nicht existiert, (strict wird auf 1 gesetzt), dann steht:
typedef void *HANDLE;
#ifdef STRICT
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
#else
#define DECLARE_HANDLE(n) typedef HANDLE n
#endifund danach:
DECLARE_HANDLE(HWND);
dann denke ich, dass sowas rauskommt:
typedef struct HWND##__{int i;}*HWND
allerdings macht es für mich keinen Sinn...
-
... sind alles nur Zahlen zur Identifikation.