c# - ShSetFolderPath适用于win7,不适用于XP

标签 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;<p></p>

<p>public static void SetDesktopPath(string path)
{
    int ret;
    ret = SHSetFolderPath(CSIDL_DESKTOP, IntPtr.Zero, 0, path);<br/>
    if (ret != 0) 
    {
        Console.WriteLine(ret);
        Console.WriteLine(Marshal.GetExceptionForHR(ret));
    }
}
</p>

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

最佳答案

有趣的事情。
我又看了一遍CSIDL list 。我意识到我正在尝试将一些“低级”引用(我猜)更改为桌面:
CSIDL_DESKTOP = 0x0000, // <desktop>
虽然我实际上只想更改文件夹位置,但我应该使用这个:
CSIDL_DESKTOPDIRECTORY = 0x0010, // <user name>\Desktop .
这有效。

它解释了一切。我真丢脸。

关于c# - ShSetFolderPath适用于win7,不适用于XP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2486943/

相关文章:

.net - 日期时间减去.net

c# - 可变 String.Format 长度

c# - 使用 JSON.Net 序列化外语

c# - 如何让 McAfee 从我的工作站发送邮件变得很酷?

c# - 无法将字符串转换为 int。来自 XML 元素的数据。 C#

.net - 如何将字符串转换为安全的 SQL 字符串?

c# - 从网络应用程序调用所需的最低用户权限?

c# - 将函数从 C++ dll 导出到 C# P/Invoke

c# - 我可以在 switch 语句中使用变量吗?

c# - 使用 PInvoke 返回包含 char[] 结构的结构数组