【问题标题】:GetIDsOfNames always fails with RPC_E_SERVERCALL_RETRYLATER for getting a property ID in PhotoshopGetIDsOfNames 总是以 RPC_E_SERVERCALL_RETRYLATER 在 Photoshop 中获取属性 ID 失败
【发布时间】:2021-03-29 04:20:05
【问题描述】:

我编写了以下 C++ 代码,尝试执行一些 OLE 自动化任务 对于当前运行的 Photoshop:

    IUnknown* unk = NULL;
    IDispatch* disp = NULL;

    CLSID clsId;
    if (FAILED(CLSIDFromProgID(L"Photoshop.Application", &clsId)))
        goto err;
    puts("CLSIDFromProgID succeeded");

    if (FAILED(GetActiveObject(&clsId, NULL, &unk)))
        goto err;
    puts("GetActiveObject succeeded");

    if (FAILED(IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp)))
        goto err;
    puts("QueryInterface succeeded");

    DISPID dispId;
    HRESULT resultOfGettingId = IDispatch_GetIDsOfNames(disp, &IID_NULL,
        (LPOLESTR[1]){L"ActiveDocument"}, 1,
        LOCALE_USER_DEFAULT, &dispId);
    if (FAILED(resultOfGettingId))
    {
        //The code always goes here.
        //The result code is printed as 0X8001010A,
        //which is RPC_E_SERVERCALL_RETRYLATER.
        printf("GetIDsOfNames for <ActiveDocument> failed. Result code: %#lX.\n",
            resultOfGettingId);
        goto err;
    }
    puts("GetIDsOfNames for Selection succeeded");

上面的 C++ 代码总是打印以下文本(每当我运行它时):

GetIDsOfNames 失败。结果代码:0X8001010A。

搜索RPC_E_SERVERCALL_RETRYLATER后发现错误码 似乎意味着应用程序正忙。但是 Photoshop 刚刚打开,并且 根本没有被操纵,只包含一个空文档。 怎么老是忙呢?

以及为什么等价的C#代码如

try
{
    activeDocument.activeLayer.textItem.font = "FZCYJW--GB1-0";
}
catch(e)
{
    ...
}

工作正常吗?

Photoshop 只是碰巧每次都很忙是没有意义的 当 C++ 程序尝试连接时。

除了所谓的忙碌之外,必须隐藏一些问题 在细节中,但我只是不知道。

编辑:

已发行重获!

我找到了“忙”的罪魁祸首。如果 Photoshop 处于选择某些文本的状态,则失败,否则成功。 So when some text is selected, Photoshop is in a state where it thinks handleing COM call-ins out of process isn't a good idea.

【问题讨论】:

  • 目前 Windows 还没有从 C 开始的官方 OLE 支持。请添加 C++ 标签以获得更好的响应。
  • @RewCie 谢谢你的标签。但我相信C#代码的底层接口也是COM/OLE。
  • C# 与 C++ 不同。由于实现问题,它可以在 C# 中工作,但不能在 C++ 中工作。如果任何对 C++ 中的 OLE 有想法的人会看你的问题,\他会回答你的问题。
  • @rew 这完全是错误。 OLE即COM,COM has 2 requirements:创建指针结构,通过指针调用函数。很明显,C 两者都可以。
  • @RewCie - 你应该删除你的编辑。它是 C,而不是 C++,这个问题与 C++ 与 C 无关。

标签: c++ windows com photoshop ole


【解决方案1】:

我找到了“忙”的罪魁祸首。如果 Photoshop 处于选择某些文本的状态,则失败,否则成功。 So when some text is selected, Photoshop is in a state where it thinks handling COM call-ins out of process isn't a good idea.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2018-07-16
    相关资源
    最近更新 更多