Windows API Translation

Walter Bright newshound2 at digitalmars.com
Tue Feb 8 15:33:24 PST 2011


Andrew Wiley wrote:
> I'm trying to use the Windows file change notification API from D, and
> I'm having trouble translating Microsoft's macro-laden signatures into
> D. I thought I had it figured out, but optlink says otherwise:
> The original function is this:
> 
> HANDLE WINAPI FindFirstChangeNotification(
>   __in  LPCTSTR lpPathName,
>   __in  BOOL bWatchSubtree,
>   __in  DWORD dwNotifyFilter
> );
> 
> I translated it into:
> 
> extern(Windows) {
> uint FindFirstChangeNotification(
> 	const(char)* lpPathName,
> 	bool bWatchSubtree,
> 	uint dwNotifyFilter
> );
> }
> 
> Optlink is giving me undefined symbol errors, but I can't seem to
> figure out what I have wrong. Any help would be appreciated.

Here is the declaration from \dm\include\win32\winbase.h:

WINBASEAPI
HANDLE
WINAPI
FindFirstChangeNotificationA(
     LPCSTR lpPathName,
     BOOL bWatchSubtree,
     DWORD dwNotifyFilter
     );
WINBASEAPI
HANDLE
WINAPI
FindFirstChangeNotificationW(
     LPCWSTR lpPathName,
     BOOL bWatchSubtree,
     DWORD dwNotifyFilter
     );
#ifdef UNICODE
#define FindFirstChangeNotification  FindFirstChangeNotificationW
#else
#define FindFirstChangeNotification  FindFirstChangeNotificationA
#endif // !UNICODE

Note the W postfix and the LPCWSTR arg, which should be wchar* (in D).

With the Digital Mars C compiler, getting the de-macro'd version is easy:

     dmc -c foo.c -e -l

and the macro expanded version will be written to foo.lst. Very handy.


More information about the Digitalmars-d mailing list