c++ - IShellDispatch NameSpace-call 失败,不知道为什么
问题描述
第一次从 C++ 使用 COM,之前一直在使用 C# 和 Delphi。
所以这是代码
HRESULT Result;
Result = CoInitialize(nullptr);
if (!SUCCEEDED(Result))
return Result;
IShellDispatch* API;
Result = CoCreateInstance(CLSID_Shell, nullptr, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&API);
if ((!SUCCEEDED(Result)) || (nullptr == API))
goto Cleanup;
VARIANT Source1, Source2, Destination, Options;
VariantInit(&Destination);
Destination.vt = VT_BSTR;
Destination.bstrVal = SysAllocString(OutFile.c_str());
Folder* PDestination;
Result = API->NameSpace(Destination, &PDestination);
if (!SUCCEEDED(Result))
goto Cleanup;
VariantInit(&Source1);
VariantInit(&Source2);
Source1.vt = VT_BSTR;
Source2.vt = VT_BSTR;
Source1.bstrVal = SysAllocString(InFile1.c_str());
Source2.bstrVal = SysAllocString(InFile2.c_str());
VariantInit(&Options);
Options.vt = VT_I4;
Options.lVal = FOF_NO_UI;
PDestination->CopyHere(Source1, Options);
Sleep(1000);
PDestination->CopyHere(Source2, Options);
Sleep(1000);
PDestination->Release();
API->Release();
Cleanup:
CoUninitialize();
return Result;
OutFile、InFile1 和 InFile2 是 wstring 类型,因为程序(大部分)是 C++。我设法创建了一个空的 ZIP 文件,这不是问题。问题是我收到一个异常,声称 Pdestination 是 nullptr。
如果有帮助,变体本身似乎可以工作。在调试器中检查它们会产生我提供的路径。我注意到 NameSpace 调用如何返回 S_FALSE。有谁知道我能做些什么?
使用库并不完全有效,它是公司代码,并且在链接外部代码时有一些真正严格的规则,因此使用 Windows API 是最简单的方法。
解决方案
推荐阅读
- java - 如何从 EAR 中存在的战争中排除 jar 文件
- python - 如何编写没有节的ini文件?
- c# - 在 .NET 5.0 引用的 netstandard2.0 库中使用 WinRT API 并进行 IsOSPlatform 检查
- autodesk-forge - 衍生 API Java 客户端角色枚举
- build - Angular 10.2 构建:本地化包生成失败:无法读取未定义的属性“值”
- c++ - std::shared_ptr 怎么可能
强制转换为 std::shared_ptr 而没有编译器错误? - jenkins - GitHub Webhook 未触发 Jenkins 流水线
- c# - 如何在一个平台具有同步代码而另一个平台具有异步代码的情况下正确实现 DependencyService
- javascript - 如何仅从全局变量中获取值?
- javascript - 结合最新。出错后继续观察