-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Using winapi with winim #37
Comments
import winim/lean
import strformat except `&`
proc main =
var sc = OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE)
if sc != 0:
defer: CloseServiceHandle(sc)
const
srvType = SERVICE_WIN32
srvState = SERVICE_STATE_ALL
var bytesNeeded, srvCount, resumeHandle: DWORD
# Use nil pointer in first call to avoid realloc the buffer later
EnumServicesStatus(sc, srvType, srvState, nil, 0, &bytesNeeded, &srvCount,
&resumeHandle)
# Use string for the buffer, or you can use alloc() and then dealloc() later.
var buffer = newString(bytesNeeded)
# Cast the pointer to what EnumServicesStatus want.
# Here &buffer = addr buffer[0]
let lpService = cast[LPENUM_SERVICE_STATUS](&buffer)
# We can access the low level c array easily by using Nim's UncheckedArray.
let services = cast[ptr UncheckedArray[ENUM_SERVICE_STATUS]](lpService)
EnumServicesStatus(sc, srvType, srvState, lpService, bytesNeeded,
&bytesNeeded, &srvCount, &resumeHandle)
echo fmt"Count of NT Services using EnumServicesStatus: {srvCount}"
for i in 0..<srvCount:
echo fmt"{services[i].lpServiceName}: {services[i].lpDisplayName}"
when isMainModule:
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hello I am just trying to get some help as I am trying to use winim to use winapi in my program. So I am basically trying to port the following code in Nim.
Can you help me understand how the types/casting the types work with winim and how should I do it ?
The text was updated successfully, but these errors were encountered: