MrHappyAsthma
MrHappyAsthma

Reputation: 6522

Lua Alien - Defined variables in the Win32 API WaitForSingleObject function

I am using Alien for Lua to reference the WaitForSingleObject function in the Windows Kernel32.dll.

I am pretty new to Windows programming, so the question I have is about the following #defined variables referenced by the WaitForSingleObject documentation:

If dwMilliseconds is INFINITE, the function will return only when the object is signaled.

What is the INFINITE value? I would naturally assume it to be -1, but I cannot find this to be documented anywhere.

Also, with the following table, it mentions the return values in hexadecimal, but I am confused as to why they have an L character after the last digit. Could this be something as simple as casting it to a Long?

Chart

The reason I ask is because Lua uses a Number data type, so I am not sure if I should be checking for this return value via Hex digits (0-F) or decimal digits (0-9)?

Upvotes: 6

Views: 2169

Answers (2)

kevinarpe
kevinarpe

Reputation: 21319

I tried to Google for the same information. Eventually, I found this Q&A.

I found two sources with: #define INFINITE 0xFFFFFFFF

For function WaitForSingleObject, parameter dwMilliseconds has type DWORD.

From here: https://learn.microsoft.com/en-us/windows/win32/winprog/windows-data-types

I can see: DWORD A 32-bit unsigned integer.

Thus, @RemyLebeau's comment above looks reasonable & valid:

`4294967295` is the same as `-1` when interpreted as a signed integer type instead.`

In short: ((DWORD) -1) == INFINITE

Last comment: Ironically, this "infinite" feels similar to the Boeing 787 problem where they needed to reboot/restart the plane once per 51 days. Feels eerily close / similar!

Upvotes: 0

MrHappyAsthma
MrHappyAsthma

Reputation: 6522

The thought crossed my mind to just open a C++ application and print out these values, so I did just that:

#include <windows.h>
#include <process.h>
#include <iostream>

int main()
{
    std::cout << INFINITE;
    std::cout << WAIT_OBJECT_0;
    std::cout << WAIT_ABANDONED;
    std::cout << WAIT_TIMEOUT;
    std::cout << WAIT_FAILED;
    system("pause");
    return 0;
}

The final Lua results based off my findings is:

local INFINITE = 4294967295
local WAIT_OBJECT_0 = 0
local WAIT_ABANDONED = 128
local WAIT_TIMEOUT = 258
local WAIT_FAILED = 4294967295

Upvotes: 8

Related Questions