标签: activation-context-api

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

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

c# webkit exception webkit.net activation-context-api

14
推荐指数
2
解决办法
2万
查看次数

CreateEx导致未处理的异常被停用的激活上下文不是最近激活的激活上下文

itsAnalysisDataTable.CreateEx( WS_EX_CLIENTEDGE, AfxRegisterWndClass( CS_DBLCLKS, LoadCursor( NULL, IDC_ARROW ), (HBRUSH)::GetStockObject( NULL_BRUSH ), NULL ), "AnalysiysTable", WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP, dialogItemRect, this, IDC_ANALYSIS_DATA_TABLE );
Run Code Online (Sandbox Code Playgroud)

这条线花了我两天的努力,没有解决方案.itsAnalysisDataTable是一个自定义窗口控件,CWnd作为其盛大的盛大父级.该控件已成功用于其他步骤,而我们的代码中没有任何问题.是一个CPropertyPage.

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

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

我已经尝试过的:

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

调用堆栈:

ntdll.dll!0000000076f7fd5c()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
kernel32.dll!0000000076df42d3()     
mfc90d.dll!AfxDeactivateActCtx(unsigned long dwFlags=0, unsigned __int64 ulCookie=2077018657900210161)  Line 260 + 0x19 bytes   C++
Run Code Online (Sandbox Code Playgroud)

观察:

  1. 如果我跳过WS_CHILD标志,则不会发生异常,但也不会在控件上调用OnCreate!
  2. 如果我忽略异常并继续,应用程序工作正常,控件也可以正常工作.
  3. 在app init期间调用AfxSetAmbientActCtx(FALSE)会抑制异常.但我认为这是一个黑客攻击,除非我能证明这一点.

c++ mfc exception activation-context-api

6
推荐指数
2
解决办法
9066
查看次数

LoadLibraryEx忽略并排清单

LoadLibraryEx功能是否使用并排清单?我有带有嵌入式SxS清单的bar.dll,并且该清单描述了这个bar.dll的版本,其他dll文件foo.dll有清单,它将bar.dll列为依赖项,具有指定版本.但是当我尝试从foo.dll加载bar.dll时,LoadLibraryEx("bar.dll", NULL, 0)我看到(启用带有gflags的sls)忽略这些清单,并加载它在searchpath中看到的第一个版本的bar.dll,如果我定义ISOLATION_AWARE_ENABLED并使用LoadLibrary它找到正确的版本,但这ISOLATION_AWARE_ENABLED不影响行为LoadLibraryEx,我需要加载正确的版本,LoadLibraryEx因为LoadLibraryEx隐式使用dll的延迟加载.是LoadLibraryEx应该这样的工作,或者是在我的项目配置的一些问题?

foo dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="foo" version="0.1.2.3" type="win32"/>
<dependency>
    <dependentAssembly>
        <assemblyIdentity name="bar" version="0.1.2.3" type="win32" />
    </dependentAssembly>
</dependency>
<file name="foo.dll">
</file>
</assembly> 
Run Code Online (Sandbox Code Playgroud)

bar.dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="bar" version="0.1.2.3" type="win32"/>
<file name="bar.dll">
</file>
</assembly> 
Run Code Online (Sandbox Code Playgroud)

c++ winapi side-by-side loadlibrary activation-context-api

5
推荐指数
1
解决办法
418
查看次数

使用WinForm时激活上下文丢失了吗?

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

简化:

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

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

  3. 让我们说创建A类并在B课之后.

在这个流程中一切顺利.

当我将我的应用程序更改为WinForm时,问题就出现了.当按下"按钮1"时,我像以前一样创建激活上下文,然后创建一个类A的实例.这很有效,流程返回到我的WinForm.但是当按下"按钮2"时,我无法创建B类.我得到一个异常,说无法找到该类!

所以似乎WinForm以某种方式弄乱了我的激活上下文.

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

  • 有办法解决吗?

几点说明:

  • 我尝试使用sxstrace.exe执行激活上下文创建,但它仅记录我的激活上下文创建.

  • 我试着评论出Application.EnableVisualStyles(),但它没有帮助.

  • 如果我使用create和destroy激活上下文将每个调用包装到我的dll,它可以工作,但我自然不想去那里...

windows sxs winforms activation-context-api

5
推荐指数
1
解决办法
320
查看次数

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

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

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

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

我现在想使用 python 中的 reg-free COM(使用 win32com)与我控制的用 C# 编写的 COM 对象交谈(使用 IDispatch),该对象位于 C:\mainapp\ManagedCOMObject.dll


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


尝试 1

#main.py:

import win32com.client
CLSID_ManagedComObject_MyClass = "{zzzzz....}" #This is correct
myclass = win32com.client.Dispatch(CLSID_ManagedComObject_MyClass)
Run Code Online (Sandbox Code Playgroud)

结果

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


尝试 2

#main.py:

ac = ActivationContext("C:\mainapp\myapp.manifest", asm_dir="C:\mainapp")
with ac.activate():
    #The above two lines fill in a ACTCTX structure, call CreateActCtx, and call ActivateActCtx 
    import win32com.client
    CLSID_ManagedComObject_MyClass = "{zzzzz....}" #This is correct
    myclass …
Run Code Online (Sandbox Code Playgroud)

com clr .net-assembly activation-context-api

5
推荐指数
1
解决办法
996
查看次数

Win32的.在dll中启用视觉样式

我没有使用C++和Win API的经验,很抱歉,如果这个问题没有问题.例如,我有DLL创建一些组件MessageBox.我添加了pragma注释以启用视觉样式并且它不起作用(它应该不是我从这个答案中知道的:在Internet Explorer工具栏上的组合框的Windows 7样式,怎么样?

DLL代码(省略导出等):

#include "stdafx.h"
#include "my-dll.h"
#include <Windows.h>
#pragma comment(linker,"\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*'    publicKeyToken='6595b64144ccf1df' language='*'\"")

MYDLL_API int fnmydll(void)
{
   MessageBox(NULL, L"Message", NULL, 0);
   return 42;
}
Run Code Online (Sandbox Code Playgroud)

然后我从我的应用程序调用此dll函数:

#include <iostream>
#include <Windows.h>
#include "my-dll.h"

int WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    fnmydll();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而且我的消息框却没有视觉风格.据我所知,我应该在调用我的dll时激活上下文,但MSDN没有示例如何做到这一点.你能不能给我这样的例子或者至少解释一下更多细节?因为我甚BOOL GetCurrentActCtx(_Out_ HANDLE *lphActCtx);至无法理解为什么函数接收指针ACTCTX但具有某种HANDLE类型的签名.

c++ dll winapi visual-styles activation-context-api

4
推荐指数
1
解决办法
1356
查看次数

将激活上下文API与不同位置的许多dll一起使用

我在运行于位置A的.Net客户端中使用激活上下文API,以在WS2008上的位置B(与A完全不同的位置,而不是同一台机器上的同级/后代等)中加载无注册限制的COM组件。通过传入ACTCTX中的位置B,它可以正常工作。

但是,我现在需要对另一个COM dll做同样的事情,而后者又依赖于生活在完全不同位置的几个.Net COM程序集。

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

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

com side-by-side regfreecom activation-context-api

4
推荐指数
1
解决办法
1041
查看次数

将程序集清单直接加载到应用程序上下文中是否正确?

我目前正在尝试使用免注册 COM 来运行一个相当复杂的方案。

并不是说它不起作用,而是我遇到了一种令人困惑的情况,似乎我应该直接在应用程序上下文中激活程序集依赖项的清单,而不是让应用程序上下文指向依赖程序集。

通过MS 自己发布的示例项目很容易解释:

通常,您有一个应用程序、一个应用程序清单、一个(服务器)dll 及其程序集清单。这些对应于示例给出的内容:

  • 客户端程序
  • client.exe.manifest (这一个指向SideBySide.X 作为dependentAssembly
  • 并排.dll
  • SideBySide.X.manifest

现在,一种标准情况是将客户端应用程序清单嵌入到客户端可执行文件中,然后使用 DLL 及其外部清单文件。

现在,如果出于某种原因在编译时无法知道正确的应用程序清单,您可以在运行时通过Activation Context API加载清单文件。

这就是令人困惑的地方:

根据该文章,客户端应用程序现在直接将激活上下文切换到程序集清单:

如果您查看 client.cpp 中的 _tmain 函数...初始化激活上下文的新代码部分如下:

actCtx.lpSource = "SideBySide.X.manifest";
Run Code Online (Sandbox Code Playgroud)

我对此进行了交叉检查,它还可以动态加载包含来自 的信息的文件client.exe.manifest,即只是对 SideBySide.X 的引用,并继续此激活上下文 - 这也对应于我们嵌入时使用的 ActCtx将正确的应用程序清单写入可执行文件中。

也就是说,actCtx.lpSource = "client.exe.manifest";也可以。

TL;DR直接激活应用程序代码中“包含”程序集清单的激活上下文意味着什么(如果有)。

从文件加载清单时应该这样做吗?(如果是这样,为什么我们不能直接将程序集清单嵌入到可执行文件中,因为它在编译时已知。)


注意:(这确实应该是对@Eric Brown 答案的评论,但它变得相当冗长)

链接的文章很好地解释了这两种RT_MANIFEST资源类型,但对于 regFreeCOm,它留下了一些未解决的问题。我将引用一些让我震惊的引言:

ISOLATIONAWARE_MANIFEST_RESOURCE_ID 主要用于 DLL。如果 dll …

winapi side-by-side regfreecom visual-c++ activation-context-api

4
推荐指数
1
解决办法
2640
查看次数