【发布时间】: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