[Windows API] over parameters

Pagina: 1
Acties:

  • DPLuS
  • Registratie: April 2000
  • Niet online
Ik ben bekend met de meeste datatypen zoals:

integers, long, single, double, currency, string, byte, boolean, date enz...

Maar in VB maak ik vaak gebruik van API-calls.
Alleen valt me daar op dat de parameters er vaak zo uit zien:

(ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long)
(ByVal lpszLocalName As String)
(ByVal lpAddress As Long, ByVal dwSize As Long, ByVal dwFreeType As Long)


Mijn vraag is nu: wat betekenen die lp, dw en lpsz nu eigenlijk?
Moeten dat ook data-typen voorstellen?

Verwijderd

Ja. Dit is de Hongaarse notatie en die wordt (werd) door Microsoft gebruikt in hun C++ code. Wat deze notatie voorschrijft, is dat je het type van een variabele in zijn naam verwerkt, door er een korte prefix aan toe te voegen. Lijstje :-
  • lp: Long Pointer. Is ook stom, want een "Long" pointer heeft in een plat geheugenmodel helemaal geen betekenis meer. Is gewoon een pointer dus.
  • dw: Double Word, of DWORD. Een 32-bits integer zonder teken.
  • sz: String Zero-terminated. Een gewone C-string dus.
  • lpsz: een Long Pointer naar een String Zero-terminated. Oftewel een pointer naar een C-string.
  • lpdw: als hierboven, een Long Pointer naar een DWord.
  • h: Handle. Geen native type van C(++), maar aangezien de API vergeven is van de handles krijgen deze een eigen prefix. Eigenlijk zijn handles gewoon integers.
  • Er zijn er vast wel meer. Dit zijn de belangrijkste die ik zo kan bedenken...
Overigens stappen ze hier nu bij Microsoft zelf ook vanaf, voor toekomstige projecten. En terecht ;).

[ Voor 4% gewijzigd door Verwijderd op 21-07-2004 15:48 ]


  • Icelus
  • Registratie: Januari 2004
  • Niet online

Developer Accused Of Unreadable Code Refuses To Comment


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 21 juli 2004 @ 15:47:
Overigens stappen ze hier nu bij Microsoft zelf ook vanaf, voor toekomstige projecten. En terecht ;).
Ze zijn er ook nooit erg consequent in geweest overigens ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 21 juli 2004 @ 15:47:
h: Handle. Geen native type van C(++), maar aangezien de API vergeven is van de handles krijgen deze een eigen prefix. Eigenlijk zijn handles gewoon integers.
Serieus? Wat doen de volgende regels dan in mijn PSDK headers:
C++:
1
2
3
4
5
6
typedef void* HANDLE;
typedef void* HWND;
typedef void* HPEN;
typedef void* HMODULE;
typedef void* HGDIOBJ;
// etc.

;)

Alle handles zijn void-pointers, het zijn namelijk (vrijwel allemaal) intern in Windows pointers naar de achterliggende objecten. Daarnaast hebben void-pointers iets minder hard de neiging om per ongeluk deel te nemen in arithmetische berekeningen als je ergens een foutje maakt :)

En als ik trouwens toch aan het zeiken ben:
Verwijderd schreef op 21 juli 2004 @ 15:47:
Ja. Dit is de Hongaarse notatie en die wordt (werd) door Microsoft gebruikt in hun C++ code.
De hele Win32 API is C, niet C++ :Y)

[ Voor 28% gewijzigd door curry684 op 22-07-2004 00:30 ]

Professionele website nodig?


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

curry684 schreef op 22 juli 2004 @ 00:26:
[...]

Serieus? Wat doen de volgende regels dan in mijn PSDK headers:
C++:
1
2
3
4
5
6
typedef void* HANDLE;
typedef void* HWND;
typedef void* HPEN;
typedef void* HMODULE;
typedef void* HGDIOBJ;
// etc.

;)

Alle handles zijn void-pointers, het zijn namelijk (vrijwel allemaal) intern in Windows pointers naar de achterliggende objecten. Daarnaast hebben void-pointers iets minder hard de neiging om per ongeluk deel te nemen in arithmetische berekeningen als je ergens een foutje maakt :)
In Delphi zijn ze als volgt gedeclareerd:
Delphi:
1
2
3
4
5
6
type
  THandle = LongWord;
  HRSRC = THandle;
  HINST = THandle;
  HMODULE = HINST;
  HGLOBAL = THandle;
En LongWord is in Delphi een native type (een 32-bit unsigned integer), dat gelijkstaat aan DWORD. In feite maakt het ook niets uit of je een handle definieert als DWORD of pointer, voor de compiler is er geen verschil.

Een goede grap mag vrienden kosten.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Totdat je ineens een 64 bits platform gaat targetten ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

.oisyn schreef op 22 juli 2004 @ 01:32:
Totdat je ineens een 64 bits platform gaat targetten ;)
Tegen die tijd zullen we aan de hand van een eventuele herdefiniëring van de Hxxx types weten of een handle nou eigenlijk een pointer of een integer is.

Een goede grap mag vrienden kosten.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23-05 18:13
Het hangt er maar net vanaf hoe je LongWord type gedefineerd is om een 64-bits platform. Als die netjes meeschaalt naar 64 bits is er geen probleem.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

tomatoman schreef op 22 juli 2004 @ 01:54:
[...]
Tegen die tijd zullen we aan de hand van een eventuele herdefiniëring van de Hxxx types weten of een handle nou eigenlijk een pointer of een integer is.
Tegen die tijd? :D
Het kan allang, en ja, het worden pointers van 64 bits :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1