首页 > 解决方案 > 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 是最简单的方法。

标签: c++comshell32

解决方案


推荐阅读