Multiple-OS Header Access

Nick Sabalausky SeeWebsiteToContactMe at semitwist.com
Wed Feb 12 14:29:16 PST 2014


On 2/12/2014 12:21 PM, Malkierian wrote:
> Alright, so I'm making a little utility, and it looks like I'm going to
> need to access OS-specific header functions on each operating system in
> order to make it work, because 1) I want to get a list of all active
> processes and their names and 2) I want to periodically check which
> window currently has focus.  I've already found SetWinEventHook and
> GetForegroundWindow (for checking the foreground window and setting an
> event hook for focus change), and also EnumProcesses for getting the
> list, but these are all Windows specific, not to mention C++ specific on
> Windows, and I can't see any way of making one set of functions that
> would work on Windows, Mac and Linux.
>
> So anyway, my question is, does D have the capability of interfacing
> with Linux and Mac such that those functions are accessible, and/or
> would I be better of working in C++ for this particular venture?  How
> would I go about accessing those functions, and using the information
> they provide in D?

Regarding actually accessing system libraries:
-------------------------------------------

The system APIs on Windows and Linux are in C (and sometimes some C++ on 
Windows), and D is perfectly capable of linking with C (and a certain 
subset of C++), so yes this is possible. All you have to do to access 
these system libraries from D is write the extern declarations as 
described here:

http://dlang.org/interfaceToC.html  (C, for most system calls)
http://dlang.org/cpp_interface.html (C++, in case you happen to need it)

All in all, it's actually quite simple.

There's also a really good series of articles out somewhere that 
explains more about it. Unfortunately I don't have a link to it handy 
right now, but you could maybe search for it, or maybe someone else knows.

OSX might be a little trickier since a lot of its libs are in 
Objective-C instead of straight C, but Objective-C is still 
link-compatible with C just like D is, so it's definitely possible.

Also, keep in mind that a lot of OS-specific calls are already available 
through D's standard library. See std.windows, std.linux, std.c.windows, 
std.c.posix, and I think there's some others.

As for dealing with differences between OSes:
-------------------------------------------

In C/C++, you'd do this with something like #ifdef. In D you use version().

//One way to do it:
version(Windows) void myOwnWrapperFunction(blah blah blah) {
     // Use the Windows API
}

version(linux) void myOwnWrapperFunction(blah blah blah) {
     // Use the Linux API
}

version(OSX) void myOwnWrapperFunction(blah blah blah) {
     // Use the OSX API
}

//Another way to do it:
void myOwnWrapperFunction(blah blah blah) {
     version(windows) {
     	// Do it the Windows way
     }
     else version(OSX) {
         // Do it the Mac way
     }
     else version(Posix) {
         // Do it the Posix way
     }
     else
         static assert(0, "This OS not supported.")
}

Or any combination of the above. This way all the OS-specific 
differences are hidden inside your "myOwnWrapperFunction", and you can 
call it from any OS you've supported.

As for knowing what OS-specific functions to use:
-------------------------------------------

For that, you'd have to look at the documentation for the OS's API.



More information about the Digitalmars-d-learn mailing list