IShellDispatch NameSpace-вызов не удается, не знаю почему - PullRequest
0 голосов
/ 08 октября 2018

Впервые работая с COM из C ++, раньше использовал 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 является самым простым способом.

...