On Tuesday, 16 June 2015 at 12:26:45 UTC, C2D wrote:
Hi,
I encountered the following error:

Error: function files.SHGetFolderPath (void* hwndOwner, int nFolder, void* hToken, uint dwFlags, char* pszPath) is not callable using argument types (typeof(null), int, typeof(null), int, immutable(char)*)

When I'm try to run this code:
...
{
import std.utf : toUTF8;
static string cache;

wchar[MAX_PATH + 2] buf;

BOOL result = SHGetFolderPath(null, 0x23, null, 0, cache.ptr);

return cache;
}
...
extern(Windows) HRESULT SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPTSTR pszPath);

I tried everything I know about D and CPP. What can be the solution?

I don't know what binding to shell32.dll you use. Probably you need set -version=Unicode to compiler flags, so WinAPI aliases refer to W variants of functions.

Personally I prefer to call explicitly W or A variants of WinAPI functions.
Therefore declaration should look like this:

extern(Windows) HRESULT SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, wchar* pszPath)

Or even better

extern(Windows) @nogc @system HRESULT SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, wchar* pszPath) nothrow

to allow using this function in %nogs nothrow code.

Also you may want to take a look at my library [1] where I use SHGetSpecialFolderPath (I know, it's deprecated, but it still works, so why not. I don't really need to bother with access tokens here).


[1] https://github.com/MyLittleRobo/standardpaths/blob/master/source/standardpaths.d#L299

Reply via email to