我正在尝试在C#中使用ShSetFolderPath函数。我在Win7上工作,我设法使用ShSetKnownFolderPath,它工作正常 由于此功能在WinXP中无法使用,我试图调用ShSetFolderPath。因为我不熟悉调用,我已经做了一些搜索,并在一些法国论坛上找到了一些东西。我不会说法语,但这个宣言是有意义的(如function documentation in MSDN library的备注中所写):
[DllImport( "Shell32.dll", CharSet = CharSet.Unicode, EntryPoint = "#232" ) ]
private static extern int SHSetFolderPath( int csidl, IntPtr hToken, uint flags, string path );
我称之为:
private static int CSIDL_DESKTOP = 0x0000;
public static void SetDesktopPath(string path)
{
int ret;
ret = SHSetFolderPath(CSIDL_DESKTOP, IntPtr.Zero, 0, path);
if (ret != 0)
{
Console.WriteLine(ret);
Console.WriteLine(Marshal.GetExceptionForHR(ret));
}
}
答案 0 :(得分:2)
有趣的事。
我又看了CSIDL list。而且我已经意识到我正在尝试将一些“低级”参考(我猜)更改为桌面:
CSIDL_DESKTOP = 0x0000, // <desktop>
虽然我实际上想改变文件夹位置,但我应该使用它:
CSIDL_DESKTOPDIRECTORY = 0x0010, // <user name>\Desktop
。
这可行。
它解释了一切。对我感到羞耻。
答案 1 :(得分:1)
有几个可能的原因。首先,入口点#232实际上不是SHSetFolderPath()的入口点。您可能正在调用另一个函数,它不知道如何处理您传递的参数值。很难说,它是XP版本的shell32.dll的一个未命名的切入点。或者可能是XP对您更改桌面文件夹路径感到不满意。没有那么令人惊讶,有一个heckofalot必须做的实际实现,刷新所有Explorer.exe视图,重建桌面内容和诸如此类的东西。
检查this thread是否有可能获得帮助。