I think the main problem is that you expose the type of a particular operating system to what might be inactive code.
One solution, depending on your needs, might be to exclude the GetMutexHandle function from the IMutex interface, but include it in two subinterfaces, IMutexWin32 and IMutexPosix say. You can declare the IMutexWin32 interface only for the code that specifically requested it, and require that code include Windows.h . Any code that actually uses GetMutexHandle for Windows needs Windows.h anyway.
Alternatively, you can make GetMutexHandle return a separate interface class with OS-specific subinterfaces.
A small version of the same topic will be to determine whether Windows.h is enabled ( #ifdef _WINDOWS_ ) or not, and use this to decide whether to declare a Windows-specific subinterface.
The simplest (but ugliest) solution for everyone is to make GetMutexHandle return a pointer to void and trust the caller to use it correctly.
source share