ShSetFolderPath работает на win7, не на XP - PullRequest
2 голосов
/ 21 марта 2010

Я пытаюсь использовать функцию ShSetFolderPath в C #. Я работаю на Win7, мне удалось использовать ShSetKnownFolderPath, и он отлично работает.
Поскольку эта функция недоступна в WinXP, я попытался вызвать ShSetFolderPath. Поскольку я не знаком с вызовом, я провел поиск и нашел кое-что на каком-то французском форуме. Я не говорю по-французски, но это объявление имеет смысл (как написано в Замечаниях документации по функции в библиотеке MSDN ):

[DllImport( "Shell32.dll", CharSet = CharSet.Unicode, EntryPoint = "#232" ) ]
private static extern int SHSetFolderPath( int csidl, IntPtr hToken, uint flags, string path );

Я называю это так:

<code>
private static int CSIDL_DESKTOP = 0x0000;</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));
    }
}

Он работает в Win7, но в XP функция возвращает -2147024809, что означает «Значение не попадает в ожидаемый диапазон».
Я думаю, что это не так с импортом Dll. Любая идея?

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Забавно.
Я еще раз взглянул на Список CSIDL .И я понял, что пытался изменить какую-то «низкоуровневую» ссылку (я полагаю) на рабочий стол:
CSIDL_DESKTOP = 0x0000, // <desktop>
Хотя я действительно хотел изменить только местоположение папки, и я должен был использовать это:
CSIDL_DESKTOPDIRECTORY = 0x0010, // <user name>\Desktop.
И ЭТО работает.

Это все объясняет.Мне стыдно.

1 голос
/ 21 марта 2010

Нет, это не так. Код ошибки, преобразованный в шестнадцатеричный код, равен 0x80070057. 7 указывает на ошибку Windows, 57 - это код ошибки 87, ERROR_INVALID_PARAMETER, «Параметр неверен».

Пара возможных причин. Во-первых, точка входа # 232 на самом деле не является точкой входа для SHSetFolderPath (). Возможно, вы вызываете другую функцию, она не знает, что делать с передаваемыми значениями аргументов. Трудно сказать, это безымянная точка входа в версию shell32.dll для XP. Или, может быть, XP просто не рада, что вы изменили путь к папке на рабочем столе. Неудивительно, что для реализации этого есть чертовщина, которая обновляет все представления Explorer.exe, перестраивает содержимое рабочего стола и так далее.

Проверьте эту ветку на возможную помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...