问题标签 [activation-context-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
307 浏览

api - 无法在 Windows XP/2003 上的 Excel 2007 插件中使用激活上下文 API?

我使用 VS2008 开发了一个 excel 2007 插件,在插件中我想使用 Activation Context API 来实例化一个 COM 类。

奇怪的是我可以在 Window 7 上成功实例化 COM 类,但在 Windows XP/2003 上 buf 失败。

这是代码片段

COM 是用 C++ 编写的,清单如下所示:

在 Windows 2003/XP 上,我发现加载项在 c:\program files\microsoft Office\Office 12 中查找 ComViewer.dll 而不是我在 lpAssemblyDirectory 中指定的目录。

任何人都可以帮忙吗?提前致谢。

0 投票
1 回答
343 浏览

windows - 使用 WinForm 时丢失激活上下文?

我有一个应用程序在隔离部署中使用本机 COM dll 中的一些类。

简化:

  1. 在运行时,我将带有清单文件的 dll 下载到某个目录而不注册它。

  2. 然后我创建一个指向该目录的激活上下文,然后从 dll 创建类的实例。

  3. 假设创建 A 类,一段时间后创建 B 类。

在这个流程中,一切都很顺利。

当我将应用程序更改为 WinForm 时,问题就开始了。当按下“按钮 1”时,我像以前一样创建激活上下文,然后创建类 A 的实例。这很好,流程返回到我的 WinForm。但是,当按下“按钮 2”时,我无法创建 B 类。我收到一个异常,说找不到该类!

所以看起来 WinForm 以某种方式弄乱了我的激活上下文。

  • 这是为什么?那里发生了什么?

  • 有办法解决吗?

几点注意事项:

  • 我尝试使用 sxstrace.exe 跟踪激活上下文创建,但它只记录了我的激活上下文创建。

  • 我尝试注释掉 Application.EnableVisualStyles() 但它没有帮助。

  • 如果我用 create 和 destroy Activation Context 包装对我的 dll 的每个调用,它可以工作,但我自然不想去那里......

0 投票
1 回答
1254 浏览

com - 在不同位置使用带有许多 dll 的 Activation Context API

我在位置 A 运行的 .Net 客户端中使用 Activation Context API 在 WS2008 上的位置 B(与 A 完全不同的位置,而不是同一台机器上的兄弟/后代等)加载一个无注册的 COM 组件通过在 ACTCTX 中的位置 B 传递,它工作正常。

但是,我现在需要对另一个 COM dll 执行相同的操作,该 COM dll 又依赖于位于完全不同位置的几个 .Net COM 程序集。

我已将依赖的 .Net 程序集添加到清单中,并将清单和 COM dll 放在位置 B,但我必须将依赖的 .Net 程序集放在位置 A(客户端运行的位置)以使其工作。实际上,他们将生活在与位置 A 和位置 B 完全不同的目录中。

我正在尝试做的事情是否可能,即是否可以使用激活上下文 api 在不同的不相关目录中加载多个 COM 组件?

0 投票
1 回答
363 浏览

c++ - 在 C++ 组件中使用激活上下文 API

我是 ac# 开发人员,目前正在开发一些遗留的 c++ com 组件。我正在尝试将激活上下文 api 代码添加到 com 组件,以便无需注册即可调用其他 com 组件。

我写了一个虚拟的 C++ 项目来玩激活上下文的东西,它没有问题。但是,当我将相同的代码添加到旧版 com 组件中时,我什至无法编译它: Error 1 error C2065: 'ACTCTX' : undeclared identifier

我没有在我的虚拟项目中添加任何特殊的标题,但它工作得很好,所以我不确定为什么会这样。希望这对于经验丰富的 c++ 开发人员来说是微不足道的......

0 投票
5 回答
9369 浏览

c++ - CreateEx Causes Unhandled exception 被停用的激活上下文不是最近激活的

这条线花了我两天的时间没有解决方案。itsAnalysisDataTable 是一个自定义的 Windows 控件,以 CWnd 作为它的祖父。该控件已成功用于其他方面,而我们的代码没有问题。是一个 CPropertyPage。

我遇到的问题是行导致(并且每次都会这样做)MyProduct (x64).exe 中 0x76f7fd5c 处的未处理异常:0xC015000F:被停用的激活上下文不是最近激活的。

异常也发生在 32 位中。我在 Windows 7 x64,VS 2008 上。

我已经尝试过的:

  1. 在调试器中启用对 win32 异常的中断。没有异常发生(除了在我们的代码中有很多并且没有影响的第一次机会异常)
  2. 重新编译整个项目
  3. 调试异常控件的 OnCreate 处理程序。

调用堆栈:

观察:

  1. 如果我跳过 WS_CHILD 标志,则不会发生异常,但也不会在控件上调用 OnCreate!
  2. 如果我忽略异常并继续,应用程序工作正常,控件也工作正常。
  3. 在应用程序初始化期间调用 AfxSetAmbientActCtx(FALSE) 会抑制异常。但我认为这是一个 hack,除非我能证明它是合理的。
0 投票
2 回答
16828 浏览

c# - WebKit.Net 和 OpenWebKitSharp 错误:无法初始化激活上下文

我同时使用 WebKit.Net 和 OpenWebKitSharp。但是,当我尝试实例化 WebKitBrowser 时,我收到一个错误:无法初始化激活上下文 有人知道这是什么吗?

0 投票
1 回答
1182 浏览

com - 使用来自另一个目录的 dll 的 COM 并排程序集?

我很确定答案是否定的,但以防万一:

对于具有适当 SxS 清单的独立 exe,是否可以使用相对路径引用 COM DLL 或从不是当前目录的目录加载它们?

我们在一个网格环境中运行,该环境使用一个公共文件夹作为根来部署各种包(即 zip 文件)。多个应用程序希望从一个公共位置引用一个公共 COM Api(带有 DLL 清单)。然而,由于网格环境是沙盒环境,我们不能安装到 Windows SxS 目录,也不能带外(即不由网格部署)。

我是否希望从..\SomeCommonDir\COM.dllC:\Program Files\SomeCommonDir\COM.DLL 加载 COM.DLL

作为私人集会,一切正常。

0 投票
4 回答
8279 浏览

c++ - 这个 Windows API 调用 WaitForSingleObject 有什么问题?

该进程在 Windows 7 中不稳定地崩溃。我使用!analyze -v命令 inWinDbg进行异常分析。它告诉以下信息。异常实际上是由WaitForSingleObject调用的函数抛出的IrsSim!IrsNet_BlockOutput。WinDbg 的异常分析告诉我这是INVALID_POINTER_READ错误的。

对于调用代码,pChannel->hMutexis not NULL。我已经倾倒它并检查了它的价值。

<<<<<===========

FAULTING_IP: IrsSim!Channel::SendIrsMessage+285 [s:\som5\ics\scsv\isv\test.u\irssim\irsiftransport.cpp @ 539] 00520ed5 8b06 mov eax,dword ptr [esi]

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 77db4639 (ntdll!RtlDeactivateActivationContextUnsafeFast+0x00000058)
ExceptionCode: c0150010 ExceptionFlags: 00000001 NumberParameters: 3 Parameter[0]: 00000000 Parameter[1]: 07befc58 Parameter[2]: 00000000

DEFAULT_BUCKET_ID:INVALID_POINTER_READ

PROCESS_NAME:IrsSim.exe

ERROR_CODE: (NTSTATUS) 0xc0150010 - 被停用的激活上下文对于当前执行线程不活动。

EXCEPTION_CODE: (NTSTATUS) 0xc0150010 - 被停用的激活上下文对于当前执行线程不活动。

EXCEPTION_PARAMETER1:00000000

EXCEPTION_PARAMETER2:07befc58

EXCEPTION_PARAMETER3:00000000

STACK_TEXT: 07d2fce0 00520ed5 irssim!Channel::SendIrsMessage+0x285 07d2fd1c 00521072 irssim!CChannelArray::SendIrsMessage+0x132 07d2fd50 0052208a irssim!CNetLibInterface::SendIrsMessage+0xba 07d2fd78 005c01b6 irssim!CSendActivity::Execute+0x76 07d2fdac 005e0b3f irssim!SimulationThreadState::ExecuteOneActivity +0x11f 07d2fdf8 005cc937 irssim!CSimulationSubThreadState::ExecuteState+0x267 07d2fe8c 005ccf02 irssim!ThreadFctSubSimulation+0xf2 07d2fec4 73b1e3ee mfc90u!_AfxThreadEntry+0xf2 07d2ff4c 739f3433 msvcr90!_endthreadex+0x44 07d2ff84 739f34c7 msvcr90!_endthreadex+0xd8 07d2ff90 767d339a kernel32!BaseThreadInitThunk+0xe 07d2ff9c 77d69ed2 ntdll !__RtlUserThreadStart+0x70 07d2ffdc 77d69ea5 ntdll!_RtlUserThreadStart+0x1b

=================================

之后,我使用 !teb 命令尝试获取更多堆栈信息。

0:011> k L=07beec2c 100 ChildEBP RetAddr 07bef54c 76be0bdd ntdll!NtWaitForMultipleObjects+0x15 07bef5e8 767d1a2c KERNELBASE!WaitForMultipleObjectsEx+0x100 07bef630 767d4208 kernel32!WaitForMultipleObjectsExImplementation+0xe0 07bef64c 767f80a4 kernel32!WaitForMultipleObjects+0x18 07bef6b8 767f7f63 kernel32!WerpReportFaultInternal+0x186 07bef6cc 767f7858 kernel32! WerpReportFault+0x70 07bef6dc 767f77d7 kernel32!BasepReportFault+0x20 07bef768 77da21d7 kernel32!UnhandledExceptionFilter+0x1af 07bef770 77da20b4 ntdll!__RtlUserThreadStart+0x62 07bef784 77da1f59 ntdll!_EH4_CallFilterFunc+0x12 07bef7ac 77d76ab9 ntdll!_except_handler4+0x8e 07bef7d0 77d76a8b ntdll!ExecuteHandler2+0x26 07bef7f4 77d76a2d ntdll!ExecuteHandler +0x24 07bef880 77d40143 ntdll!RtlDispatchException+0x127 07bef880 77db4639 ntdll!KiUserExceptionDispatcher+0xf 07befc34 76be0ad7 ntdll!RtlDeactivateActivationContextUnsafeFast+0x58 07befc38 76be0abc KERNELBASE!WaitForSingleObjectEx+0xde 07befc98 767d1194 KERNELBASE!WaitForSingleObjectEx+0xc3 07befcb0 767d1148 kernel32!WaitForSingleObjectExImplementation+0x75

07befcc4 005e3b6e kernel32!WaitForSingleObject+0x12

07befcd4 00520d3b IrsSim!IrsNet_BlockOutput+0x1e

07befd14 00521072 IrsSim!Channel::SendIrsMessage+0xeb 07befd48 0052208a IrsSim!CChannelArray::SendIrsMessage+0x132 07befd70 005c01b6 IrsSim!CNetLibInterface::SendIrsMessage+0xba 07befda4 005e0b3f IrsSim!CSendActivity::Execute+0x76 07befdf0 005cc937 IrsSim!SimulationThreadState::ExecuteOneActivity+0x11f 07befe84 005ccf02 IrsSim!CSimulationSubThreadState::ExecuteState+0x267 07befebc 73b1e3ee IrsSim!ThreadFctSubSimulation+0xf2 07beff44 739f3433 mfc90u!_AfxThreadEntry+0xf2 07beff7c 739f34c7 msvcr90!_endthreadex+0x44 07beff88 767d339a msvcr90!_endthreadex+0xd8 07beff94 77d69ed2 kernel32!BaseThreadInitThunk+0xe 07beffd4 77d69ea5 ntdll!__RtlUserThreadStart +0x70 07beffec 00000000 ntdll!_RtlUserThreadStart+0x1b

=====================================>>>>>>

0 投票
1 回答
1035 浏览

com - 创建无 reg 的托管 COM 对象时,如何让 CLR 查看与主应用程序的可执行文件不同的目录?

这是一个复杂的问题,涉及与 COM、CLR 和无注册 COM 相关的一些神秘领域。

首先,我的主要应用程序是用 python 编写的。因此,它的代码库(开发中)位于 C:\mainapp\main.py。

当然,在windows上,执行程序的是C:\Python27\python.exe。

我现在想使用 python 中的无注册 COM(使用 win32com)与我控制的用 C# 编写的 COM 对象对话(使用 IDispatch),该对象位于 C:\mainapp\ManagedCOMObject.dll


注意:如果您不会说 python / pythoncom,请注意对 Dispatch() 的调用最终归结为 CoCreateInstance()。


尝试 1

结果

失败,因为对象不在注册表中(如预期的那样),而且我没有提到任何关于清单文件的内容,python.exe 的清单显然不知道我的对象。


尝试 2

-

请注意,ManagedCOMObject 有一个嵌入式清单,它使用 clrClass 标记声明 COM 对象。

结果

ActicateActCtx 调用成功并正确解析了 myapp.manifest 和 ManagedComObject.dll 的清单 - 我使用 sxstrace.exe 验证了这一点。

在探测 C:\Python27\ManagedComObject.dll 后,对 CoCreateInstance 的调用失败并出现 FileNotFound。融合日志声称 PrivatePath 未设置(推测是因为 python.exe.config 不存在),并且根本没有在 C:\mainapp 中查找 C# 对象。

问题

  1. 为什么会失败?我相信这是因为 CLR COM 加载程序存根无法导入我的 C# 程序集。如果在这一步之前失败,CLR 甚至不会加载,所以它正在探测和创建融合日志这一事实让我相信这是因为 CLR 找不到 ManagedCOMObject.dll。

  2. 请注意,CLR 已加载 - 我相信这意味着 COM 已成功查看当前激活上下文以找到注册。我不确切知道 clrClass 在清单中做了什么,但大概它成功加载了 CLR。

  3. 我现在假设问题是 CLR 在加载程序集时没有注意 ActCtx。如果我正在编写托管代码,我可以挂接到 AppDomain.CurrentDomain.AssemblyResolve 事件并自己找到 DLL。由于我正在编写非托管代码,并且仅隐式托管 CLR,我可以以某种方式更改我的应用程序 PrivatePath 和/或如何探测程序集吗?

0 投票
1 回答
461 浏览

winapi - 我需要在哪里切换激活上下文?

我面临的问题基本上在这里描述,即:

  • 我有一个使用第 3 方进程内 COM 组件 dll 的 DLL。
  • 我想将免注册 COM 与该进程内组件一起使用。
  • 我想在这个 DLL(而不是主 EXE)中嵌入并使用一个 manfest,以便我可以以无注册的方式使用第 3 方组件。
  • 我从组件中使用的接口是通过调用来激活的CoCreateInstance
  • 第 3 方 COM 组件没有任何进一步的 (COM) 依赖项,并且不依赖或不需要隔离。

我看到简单地将清单嵌入到我的 DLL 中是行不通的,如链接问题中所述,我需要手动切换激活上下文。

我不明白的是我需要在何时地切换激活上下文:我是否只需要将我的调用包装CoCreateInstance在 (*) 之类的东西中CActCtxActivator ScopedContext,还是需要将所有调用包装到第 3 方组件中?(据我所知,这ISOLATION_AWARE_ENABLED是应该提供帮助的。)

那么,在使用免注册 COM 时,需要在哪里切换Activation Context呢?


(*) :AFX_MANAGE_STATE(AfxGetStaticModuleState());(**) 或其他。


(**):实际上,AFX_MANAGE_STATE以前可以工作,但在“较新”的 MFC 版本中不再有效。参见,例如VS2012:删除了对 MFC 中活动上下文切换的支持?

我们从 MFC 中删除了所有激活上下文支持,因为我们......我们在 MFC 本身内部使用了 Windows 隔离感知 API。

// 发布者:Pat Brenner,Visual C++ 库开发:2013 年 6 月 5 日,星期三,晚上 11:10