ShSetFolderPath适用于win7,不适用于XP

时间:2010-03-21 11:53:52

标签: c# .net pinvoke

我正在尝试在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)); } }


它适用于Win7,但在XP函数中返回-2147024809,这意味着“值不在预期范围内”。
我的猜测是,Dll导入有问题。任何的想法?

2 个答案:

答案 0 :(得分:2)

有趣的事。
我又看了CSIDL list。而且我已经意识到我正在尝试将一些“低级”参考(我猜)更改为桌面:
CSIDL_DESKTOP = 0x0000, // <desktop>
虽然我实际上想改变文件夹位置,但我应该使用它:
CSIDL_DESKTOPDIRECTORY = 0x0010, // <user name>\Desktop
这可行。

它解释了一切。对我感到羞耻。

答案 1 :(得分:1)

不,那不是。转换为十六进制的错误代码是0x80070057。 7表示Windows错误,57表示错误代码87,ERROR_INVALID_PARAMETER,“参数不正确”。

有几个可能的原因。首先,入口点#232实际上不是SHSetFolderPath()的入口点。您可能正在调用另一个函数,它不知道如何处理您传递的参数值。很难说,它是XP版本的shell32.dll的一个未命名的切入点。或者可能是XP对您更改桌面文件夹路径感到不满意。没有那么令人惊讶,有一个heckofalot必须做的实际实现,刷新所有Explorer.exe视图,重建桌面内容和诸如此类的东西。

检查this thread是否有可能获得帮助。