ZeroMemory (&psg, sizeof(psg)); Was ist das?

MichiStroi

Erfahrenes Mitglied
Hi,

ich bin eigentlich ein C#-Programierer.
Ich hab eine *.dll gekauft, zu dessen ich ein Code-Beispiel bekommen habe.

In diesem Code kommt häufig "ZeroMemory (&psg, sizeof(psg));" vor.

Auszug aus dem Beispiel:
Code:
// Fill general information
ZeroMemory (&psg, sizeof(psg));

psg.iSize          = sizeof (psg);
psg.iConnection    = HRMCOM_CONNECTION_IR;
psg.bConnectionDlg = TRUE;
psg.hOwnerWnd      = hWnd;	// Owner window handle

// Reset monitor information
ZeroMemory (&psmi, sizeof(psmi));

// Read monitor info from HR monitor using IR
if (!fnHRMCom_ReadMonitorInfo (&psg, &psmi))
{
	// Reading failed, close connection
	fnHRMCom_EndIRCommunication (FALSE);
	break;
}

Die Funktion fnHRMCom_ReadMonitorInfo dürfte eine Callbackfunkion sein.
Hat jemand eine Ahnung, was hier passiert, und wie ich dann an die Daten komme, die die Callbackfunktion zurückgeben sollte?

Danke!
Michi
 
Hi!

MSDN sagt mir zu ZeroMemory:

ZeroMemory

The ZeroMemory macro fills a block of memory with zeros.

To avoid undesired effects of optimizing compilers, use the SecureZeroMemory function.


void ZeroMemory(
PVOID Destination,
SIZE_T Length
);

Parameters
Destination
[in] Pointer to the starting address of the block of memory to fill with zeros.
Length
[in] Size of the block of memory to fill with zeros, in bytes.
Return Values
This function has no return value.

Remarks
This function is defined as the RtlZeroMemory macro. For more information, see Winbase.h and Winnt.h.

Requirements
Client: Requires Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server: Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header: Declared in Winbase.h; include Windows.h.

Sprich: ZeroMemory setzt den gesamten Inhalt von dem "Objekt", das du im ersten Parameter angibst, auf 0. Der zweite Parameter muss die größe des Objektes zurückgeben - damit die Funktion auch weis, wie viele 0'en sie setzen muss.....

Grüße,
Jens
 
Hi,

alternativ geht auch memset( void *, int , size_t );
Parameterliste:
1.Zeiger auf Speicher
2. Wert, mit dem gefüllt werden soll (idR. zum Initialisieren 0 )
3. Größe des Speicherbereichs, z.B. mit sizeof() ermittelt

Gruss TB
 
Hi,

Danke für eure Antworten!

-Was ist der Unterschied zwischen einem Objekt das nur definiert wurde und einem, das 0 gesetzt wurde?

-Was bewirkt das "&" vor der Variable?

-Ist meine Annahme richtig, dass die Funktion zb: (fnHRMCom_ReadMonitorInfo (&psg, &psmi)) die Werte in die beiden Objekte (psg, psmi) einträgt, die ich mitgegeben habe?
Und das "&" Zeichen charakterisiert, dass es sich um eine Callbackfunktion handelt, und die Objekte psg, psmi nicht übernimmt, sondern in diese schreibt?

Vielen Dank!

Michi
 
moin


Wenn du eine Variable mit & davor übergibst, dann übergibst du die Adresse der Variable.

Ein Zeiger hat ein * vor der Variable.


mfg
umbrasaxum
 
moin


@loeffellutscher
*zeiger = &variable;
NEIN genau das nicht!

*zeiger = Wert auf den der Zeiger zeigt
zeiger = Addresse der Varaible im Speicher

@MichiStroi
Ja, da, wie ich eben erwähnt hab, der Zeiger auf einen Wert zeigt und die Adresse halt auf eine Adresse.


mfg
umbrasaxum
 
Ja, da, wie ich eben erwähnt hab, der Zeiger auf einen Wert zeigt und die Adresse halt auf eine Adresse.
Die Antwort ist so gesehen nicht ganz richtig..
Weil eigentlich macht es semantisch keinen Unterschied ob du der Funktion
nun die Addresse des Wertes übergibst, oder einen Pointer auf einen Wert,
der Effekt ist der gleiche, der einzigste Unterschied ist die Aufrufsyntax...

Gruß

RedWing
 
Zurück