IShellDispatch NameSpace调用失败,不知道为什么

时间:2018-10-08 15:16:13

标签: c++ com shell32

第一次使用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是最简单的方法。

0 个答案:

没有答案