Extern Function Name
BlitzMax Forums/BlitzMax Programming/Extern Function Name
| ||
| Am trying to find the correct name to use as Extern "Win32" for FormatMessage? I get an error: undefined reference to `FormatMessage@24' from the linker when using the Function name 'FormatMessage'. Is there a way of telling what the windows name really is? FormatMessageA and FormatMessageW give the same errors |
| ||
| downloads the api-guide, good app will show ya all that stuff |
| ||
| The example below works for me. As far as I can see, you can't use a 'pretty' name (eg. FormatMessage instead of FormatMessageA), but have to use the actual function name, unlike the second example below (Mark?)... (This version gets the function address from "...\BlitzMax\lib\libkernel32.a".) Const FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 Const FORMAT_MESSAGE_IGNORE_INSERTS = 512 Const FORMAT_MESSAGE_FROM_STRING = 1024 Const FORMAT_MESSAGE_FROM_HMODULE = 2048 Const FORMAT_MESSAGE_FROM_SYSTEM = 4096 Const FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 Extern "win32" Function FormatMessageA (flags, source:Byte Ptr, messageid, languageid, buff:Byte Ptr, buffsize, args []) End Extern ' ----------------------------------------------- ' Example... ' ----------------------------------------------- error = 2 ' "File not found" error code... Local message:Byte [255] FormatMessageA (FORMAT_MESSAGE_FROM_SYSTEM, Null, error, 0, message, 255, Null) Print "" Print "Error message: " + String.FromCString (message) Alternative version, accessing DLL directly...
Const FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
Const FORMAT_MESSAGE_IGNORE_INSERTS = 512
Const FORMAT_MESSAGE_FROM_STRING = 1024
Const FORMAT_MESSAGE_FROM_HMODULE = 2048
Const FORMAT_MESSAGE_FROM_SYSTEM = 4096
Const FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192
Global FormatMessage (flags, source:Byte Ptr, messageid, languageid, buff:Byte Ptr, buffsize, args []) "win32"
lib = LoadLibraryA ("kernel32.dll")
If lib
FormatMessage = GetProcAddress (lib, "FormatMessageA")
Else
Print "Dead"; End
EndIf
' -----------------------------------------------
' Example...
' -----------------------------------------------
error = 2 ' "File not found" error code...
Local message:Byte [255]
FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, Null, error, 0, message, 255, Null)
Print ""
Print "Error message: " + String.FromCString (message)
This little routine can be pretty handy if you're writing Win32 API stuff and a function fails for no discernible reason (use Win32\kernel32's GetLastError function for the error code)... The API Guide Mr C refers to is probably this one: http://www.mentalis.org/agnet/apiguide.shtml |