Код ниже, полученный из https://docs.microsoft.com/en-us/windows/desktop/shell/folder-info#determining-an-objects-parent-folder,, работает должным образом при компиляции и запуске через Visual Studios 2017:
#include "stdafx.h"
#include <shlobj.h>
#include <shlwapi.h>
#include <objbase.h>
#pragma comment(lib, "shlwapi")
int main()
{
IShellFolder *psfParent = NULL;
LPITEMIDLIST pidlSystem = NULL;
LPCITEMIDLIST pidlRelative = NULL;
STRRET strDispName;
TCHAR szDisplayName[MAX_PATH];
HRESULT hr;
hr = SHGetFolderLocation(NULL, CSIDL_SYSTEM, NULL, NULL, &pidlSystem);
hr = SHBindToParent(pidlSystem, IID_IShellFolder, (void **)&psfParent, &pidlRelative);
if (SUCCEEDED(hr))
{
hr = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &strDispName);
hr = StrRetToBuf(&strDispName, pidlSystem, szDisplayName, sizeof(szDisplayName));
_tprintf(_T("%s\n"), szDisplayName);
}
psfParent->Release();
CoTaskMemFree(pidlSystem);
Sleep(5000);
return 0;
}
Если я заменим CSIDL_SYSTEM
на CSIDL_MYDOCUMENTS
, то вызов метода GetDisplayNameOf
завершится неудачно:
onecore\com\combase\objact\objact.cxx(812)\combase.dll!74EA3270: (caller: 74EA201B) ReturnHr(1) tid(d4c) 800401F0 CoInitialize has not been called.
onecoreuap\shell\windows.storage\regfldr.cpp(1260)\windows.storage.dll!76FE4FA3: (caller: 76E9F7EE) ReturnHr(1) tid(d4c) 80040111 ClassFactory cannot supply requested class
Добавление CoInitialize(NULL);
до вызова SHGetFolderLocation
устраняет проблему.
Почему вызов CoInitialize требуется в одном случае, а не в другом?
Кроме того, кажется, что CoInitialize всегда нужно вызывать, но интересно, что пример кода не вызывает его. Мне любопытно, почему это так. Я не смог получить пример компиляции кода, как есть - <iostream.h>
не удалось найти, поэтому я заменил код печати cout
на вызов _tprintf
... Может быть, это указывает на проблему? Вызывает ли среда выполнения C ++ CoInitialize для вас, и, возможно, VS пытается создать для меня приложение C или что-то в этом роде (например, как в Linux компиляция с помощью gcc и g ++ имеет разные последствия).