[C] Handles, WIN32 malloc / GlobalAlloc - Verständnisfrage

Billie

Erfahrenes Mitglied
Hellas!

Also, ich versuche derzeit über JNI in einer Windows-Umgebung über die TWAIN-API ein Bild zu bekommen.

Leider fehlt mir offensichtlich noch das Detail-Verständnis für C und die WIN32-API. Ich habe folgende Zeilen:

C:
		((pTW_CAPABILITY) pData)->hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
		// ((pTW_CAPABILITY) pData)->hContainer = malloc(sizeof(TW_ONEVALUE));

Mit GlobalAlloc läuft das Programm durch und mit malloc stürzt meine JVM ab.

Dann habe ich noch folgenden Code, der funktioniert und der Struktur TW_ONEVALUE Werte zuweist:

C:
pTW_ONEVALUE pval;
// ...
		pval = (pTW_ONEVALUE) GlobalLock(((pTW_CAPABILITY) pData)->hContainer);
		pval->ItemType = TWTY_INT16;
		pval->Item = 1;

Bei folgender Variante crashed aber wieder die JVM:

C:
		((pTW_ONEVALUE) ((pTW_CAPABILITY) pData)->hContainer)->ItemType = TWTY_INT16;
		((pTW_ONEVALUE) ((pTW_CAPABILITY) pData)->hContainer)->Item = 1;

Was genau ist eigentlich ein HANDLE? Ist das jetzt ein normaler Pointer? Warum funktioniert dann malloc nicht und GlobalAlloc schon?

Beste Grüße,
Billie
 
Hi.
Ja, ist ein void-Pointer. Solltest du in den Windows-Headers finden:

C++:
typedef void *HANDLE;
Ja, es ist als void* definiert, aber um was es sich nun im Einzelfall wirklich handelt ist eine ganz andere Sache.

Ein Handle ist grundsätzlich irgendetwas mit dem man eine Resource identifiziert. Es könnte ein Zeiger sein, aber grundsätzlich kann man ja alles mögliche drin speichern.

@Billie: Wann stürzt das Programm denn ab? Direkt bei dem malloc Aufruf?

Ansonsten ist es oftmals notwendig Speicher mit 0 zu initialisieren bevor man ihn mit WINAPI Funktionen nutzt. GlobalAlloc(GHND, ...) tut dies auch, malloc nicht.

Gruß
 
Zurück