我一直在尝试编写一些与Photoshop交互的代码,包括添加COM引用和后期绑定。我花了一段时间才意识到代码确实有效,但不是64位版本的Photoshop。
我使用64位Photoshop获得的例外情况如下:
COMException未处理
检索COM类工厂 具有CLSID的组件 {D9389EDE-AEF8-4092-9377-075E94B7CB9A} 由于以下错误而失败: 80080005服务器执行失败 (HRESULT的例外情况:0x80080005 (CO_E_SERVER_EXEC_FAILURE))。
我的应用程序是否可以与64位版本的Photoshop通信?或者仅限于与32位版本进行通信?
我在寻求解决方案的众多尝试中遇到this,但我看不出如何将CLSCTX_ACTIVATE_64_BIT_SERVER
标志用于COM引用或迟到绑定,好吧,假设它是解决方案。
此处发生异常:
Type photoshopType = Type.GetTypeFromProgID("Photoshop.Application");
if (photoshopType != null)
{
object photoshop = Activator.CreateInstance(photoshopType);
答案 0 :(得分:1)
要检查从/到不同环境使用COM的一些事情:
答案 1 :(得分:1)
.NET应用程序可执行文件(.exe)将始终以正在运行的处理器体系结构的本机位运行,如果标记为AnyCPU,则编译为MSIL。因此,在64位平台上运行的任何MSIL程序集都将运行64位,而在32位平台上运行将运行32位。
在你的情况下,你要么想要为AnyCPU编译,但如果你必须强制64位互操作使用x64。当然,这不适用于32位机器。这将从注册表的64位视图本身读取(包括InProc
您还必须小心如何编组指针。如果编写自己的互操作代理,请务必使用IntPtr for handle。
答案 2 :(得分:0)
假设我们提供的信息很少:
引自:When CoCreateInstance returns 0x80080005 (CO_E_SERVER_EXEC_FAILURE)
...如果是客户 无法调用CoRegisterClassObject() 从过程的那一刻起 开始,或没有打电话 完全是CoRegisterClassObjects() 给定的类工厂,然后是 客户将收到 CO_E_SERVER_EXEC_FAILURE错误 CoCreateInstance的(......)。这可能发生 出于各种原因:
1)机器的CPU负载很高 这个过程需要很长时间才能开始 并执行 CoRegisterClassObjects()小于 120秒。
2)COM服务器未注册 正确的班级ID。
3)COM服务器当前 停止并且有竞争条件 在CoCreateInstance和COM之间 服务器停止部分。
4)存在安全问题 启动COM服务器的方式(这个 页面似乎暗示拼写错误 密码或缺少“登录为 批处理作业“特权为”运行方式..“ COM服务器,但无论如何我会 建议重新验证此信息 为您的特定配置)
答案 3 :(得分:0)
我对Photoshop API并不多,所以我会尝试更一般地回答你的问题。
32位应用程序无法将64位代码加载到其地址空间中,反之亦然。这意味着混合它们的唯一方法是通过某种形式的进程间通信。
如果它是进程外COM服务器,COM将为您处理此进程间通信。因此,如果Photoshop COM对象被实现为进程外对象,那么一切都会正常工作。因为它不适合你,我假设他们使用的过程对象不能在32位和64位之间混合。在这种情况下,您需要创建自己的进程外服务器,该服务器包装您要使用的Photoshop对象。然后,您可以使用32位和64位代码的进程外包装器。
另外,为了澄清一些其他帖子,在.NET中,您需要确保将平台目标设置为您尝试完成的所需内容。 x86将使您的代码始终以32位运行。 x64将使其始终以64位运行。任何CPU都将使其在32位操作系统上以32位运行,在64位操作系统上以64位运行。
答案 4 :(得分:0)
答案 5 :(得分:0)
转到组件服务>计算机>“我的电脑”>“ DCOM配置”> Photoshop RGBColor>“身份”>交互式用户。 并在安全标签上设置管理员帐户的权限