我正在使用WebKit.Net和OpenWebKitSharp.但是,一旦我尝试实例化WebKitBrowser,我就会收到一个错误:无法初始化激活上下文有人知道这是什么吗?
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上.
我已经尝试过的:
调用堆栈:
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)
观察:
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) 我有一个应用程序,它使用隔离部署中的本机COM dll中的一些类.
简化:
在运行时,我将带有清单文件的dll下载到某个目录而不进行注册.
然后,我创建一个指向该目录的激活上下文,然后从dll创建类的实例.
让我们说创建A类并在B课之后.
在这个流程中一切顺利.
当我将我的应用程序更改为WinForm时,问题就出现了.当按下"按钮1"时,我像以前一样创建激活上下文,然后创建一个类A的实例.这很有效,流程返回到我的WinForm.但是当按下"按钮2"时,我无法创建B类.我得到一个异常,说无法找到该类!
所以似乎WinForm以某种方式弄乱了我的激活上下文.
这是为什么?那里发生了什么?
有办法解决吗?
几点说明:
我尝试使用sxstrace.exe执行激活上下文创建,但它仅记录我的激活上下文创建.
我试着评论出Application.EnableVisualStyles(),但它没有帮助.
如果我使用create和destroy激活上下文将每个调用包装到我的dll,它可以工作,但我自然不想去那里...
这是一个复杂的问题,涉及与 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()。
#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 的清单显然不知道我的对象。
#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) 我没有使用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类型的签名.
我在运行于位置A的.Net客户端中使用激活上下文API,以在WS2008上的位置B(与A完全不同的位置,而不是同一台机器上的同级/后代等)中加载无注册限制的COM组件。通过传入ACTCTX中的位置B,它可以正常工作。
但是,我现在需要对另一个COM dll做同样的事情,而后者又依赖于生活在完全不同位置的几个.Net COM程序集。
我已将依赖的.Net程序集添加到清单中,并将清单和COM dll放置在位置B中,但是我必须将依赖的.Net程序集放置在位置A(客户端运行的位置)中,以使其正常工作。实际上,它们将位于与位置A和位置B完全不同的目录中。
我正在尝试做的事情是否可能,即是否可以使用激活上下文api将多个COM组件加载到不同的不相关目录中?
我目前正在尝试使用免注册 COM 来运行一个相当复杂的方案。
并不是说它不起作用,而是我遇到了一种令人困惑的情况,似乎我应该直接在应用程序上下文中激活程序集依赖项的清单,而不是让应用程序上下文指向依赖程序集。
通过MS 自己发布的示例项目很容易解释:
通常,您有一个应用程序、一个应用程序清单、一个(服务器)dll 及其程序集清单。这些对应于示例给出的内容:
dependentAssembly)现在,一种标准情况是将客户端应用程序清单嵌入到客户端可执行文件中,然后使用 DLL 及其外部清单文件。
现在,如果出于某种原因在编译时无法知道正确的应用程序清单,您可以在运行时通过Activation Context API加载清单文件。
这就是令人困惑的地方:
根据该文章,客户端应用程序现在直接将其激活上下文切换到程序集清单:
如果您查看 client.cpp 中的 _tmain 函数...初始化激活上下文的新代码部分如下:
Run Code Online (Sandbox Code Playgroud)actCtx.lpSource = "SideBySide.X.manifest";
我对此进行了交叉检查,它还可以动态加载包含来自 的信息的文件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
c++ ×3
side-by-side ×3
winapi ×3
com ×2
exception ×2
regfreecom ×2
c# ×1
clr ×1
dll ×1
loadlibrary ×1
mfc ×1
sxs ×1
visual-c++ ×1
webkit ×1
webkit.net ×1
windows ×1
winforms ×1