News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

Macros for function pointers.

Started by xanatose, March 19, 2009, 05:26:40 PM

Previous topic - Next topic

xanatose

I use this ones for functions that I want to declare as global functions but cannot simply use a .lib for them. For example openGL extensions that are standard, but not in the opengl32.dll

One is used to create the function pointer in the data segment, the other to declare the function pointer in a header.

Here are the macros and and example of use.

;#############################################################################
; @brief Example of use of the macro GFUNPTR
; @author Ricardo J. Santos <aka xanatose>
;#############################################################################
.386
.model flat,stdcall
option casemap:none

;#############################################################################
; INCLUDES
;#############################################################################
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc

;#############################################################################
; LIBRARIES
;#############################################################################
includelib \masm32\lib\kernel32.lib

;#############################################################################
; MACROS
;#############################################################################

;===========================================================================
; Creates a global function pointer.
; This one is used in the data? segment.
; @param name Name of function
; @param arg1 Function parameters.
;===========================================================================
GFUNPTR MACRO name:REQ,argl:VARARG
LOCAL nameProto
LOCAL namePtr
nameProto TEXTEQU<&name>
nameProto CATSTR nameProto,<_proto>
nameProto TYPEDEF PROTO argl
namePtr TEXTEQU<&name>
namePtr CATSTR namePtr,<_ptr>
namePtr TYPEDEF PTR nameProto
name namePtr ?
ENDM

;===========================================================================
; Declares a global function pointer.
; This one is used in an include.
; @param name Name of function
; @param arg1 Function parameters.
;===========================================================================
GFUNPTR_DECLARE MACRO name:REQ,argl:VARARG
LOCAL nameProto
LOCAL namePtr
nameProto TEXTEQU<&name>
nameProto CATSTR nameProto,<_proto>
nameProto TYPEDEF PROTO argl
namePtr TEXTEQU<&name>
namePtr CATSTR namePtr,<_ptr>
namePtr TYPEDEF PTR nameProto
EXTERNDEF name:namePtr
ENDM

;#############################################################################
.const
;#############################################################################
szUser32DLL db 'user32.dll',0
szMessageBoxA db 'MessageBoxA',0
szCaption db 'Hello!',0
szMessage db 'MessageBoxA called via pointer',0

;#############################################################################
.data?
;#############################################################################
hUser32 dd ?

GFUNPTR MessageBox,hwnd:HWND,lpText:LPCSTR,lpCaption:LPCSTR,uType:UINT

;#############################################################################
.code
;#############################################################################

;===========================================================================
start:
;===========================================================================
invoke LoadLibrary,offset szUser32DLL
mov [hUser32],eax

invoke GetProcAddress,eax,offset szMessageBoxA
mov [MessageBox],eax

invoke MessageBox,0,offset szMessage,offset szCaption,0

invoke FreeLibrary,[hUser32]
invoke ExitProcess,0

;#############################################################################
END start
;#############################################################################


The example uses LoadLibrary, and GetProcAddress, but wglCreateProcAddress should be used instead in the case of openGL functions.

drizz

Hi,

Little offtopic question if you don't mind.

What tool do you use for document generation, I see you use "@author", "@param", ... it must be for that purpose yes?
I haven't found anything that supports MASM syntax.
The truth cannot be learned ... it can only be recognized.

Vortex

Hi xanatose,

Nice work. I have my own macro set for similar purpose.