SHGetFolderPath возвращает строку мусора в распространяемой версии

0
    char desktopPath[MAX_PATH];
    HRESULT r = SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath);
    if (r != S_OK) {
        throw XArch(new XArchEvalWindows());
    }
    m_desktopPath = CString(desktopPath);

Это так странно. Этот фрагмент кода работает в VS2010 как в режимах выпуска, так и в режиме отладки. После того, как я его распространяю и запускаю приложение, я бы получил сообщение об ошибке "Система не может найти указанный файл". Чем страннее то, что мой коллега запускает одно и то же приложение на своей машине, и это работает.

В MSDN говорится, что SHGetFolderPath устарел, поэтому я попытался использовать SHGetKnownFolderPath. Это та же ситуация.

    PWSTR desktopPathW = 0;

    HRESULT hr = SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &desktopPathW);
    if (!SUCCEEDED(hr)) {
        throw XArch(new XArchEvalWindows());
    }
    CoTaskMemFree(static_cast<void*>(desktopPathW));

Любая идея о том, что происходит? Или как я могу отладить это?

Заранее спасибо. Джерри

  • 0
    Не связанные с этим, но вы освободить память вы выделить? И зачем выделять его динамически, просто создайте массив и не беспокойтесь об этом.
  • 0
    Да, я освободил память. Я использовал стек памяти, и это то же самое, поэтому я изменил его в кучу только для тестирования.
Теги:
string
desktop

1 ответ

2
Лучший ответ

В комментариях явно указано, что S_OK является единственным результатом успеха, а коды ошибок включают S_FALSE, E_FAIL и E_INVALIDARG. Вы ошибочно полагаете, что эти 3 являются единственными кодами ошибок.

  • 0
    Спасибо, это очень полезно. Теперь я получил сообщение «Система не может найти указанный файл». Но почему программа работает в режимах выпуска и отладки в VS2010, но не работает после распространения? :(
  • 0
    @Jerry: Вы, вероятно, хотите сократить свою программу до main с помощью этого вызова одной функции. Скорее всего, это что-то не показано здесь. Олицетворение возможно?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню