Windows API Translation

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Mon Feb 7 23:39:11 PST 2011


On Tue, 08 Feb 2011 01:10:02 -0600, 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.

I think you have to use either the FindFirstChangeNotificationW function 
(Unicode) or FindFirstChangeNotificationA function (ANSI) -- probably the 
former.  Also, if you import core.sys.windows.windows, you can use the 
Windows API types directly:

  import core.sys.windows.windows;

  extern(Windows) HANDLE FindFirstChangeNotification(
      LPCWSTR lpPathName,
      BOOL bWatchSubtree,
      DWORD dwNotifyFilter
  );

Note that I replaced LPCTSTR with LPCWSTR, which is a UTF-16 string, i.e. 
an alias for const(wchar)* and not const(char)*.  This means that you 
have to use the std.utf.toUTF16z() function to convert normal strings 
before passing them to the function.

-Lars


More information about the Digitalmars-d mailing list