问题标签 [sxs]

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 投票
2 回答
2173 浏览

com - 为进程外 ActiveX 模拟 SideBySide

我们正在调整我们的客户端相对复杂的应用程序(ActiveX / .net / Delphi / C++ / COM )以使用 SxS 来实现非管理员部署和与我们产品的旧版本隔离。

我们能够通过编写一个描述我们进程使用的所有库的清单文件,而无需注册,几乎可以为我们所有的 in proc 组件实现这个目标,例如我们的 .net ui、Delphi ui 和我们在 proc 中使用的 COM 服务器在任何组件的客户端上(几乎)。

这几乎是部分:目前,我们的应用程序调用(从它的 c++ 部分)一个 out of proc ActiveX 服务器(Delphi ActiveX EXE),它本身又调用另一组 out of proc ActiveX 服务器(第三方插件,任何东西都在这里,Delphi,C++,任何东西只要它不在proc ActiveX EXE中并实现我们的接口)。

正如我们所知,SxS 不支持进程外 ActiveX 服务器。而且我们不能像在我们的主进程中的 proc com 服务器中那样使用这些对象,因为这将需要对我们的应用程序进行重大重写,甚至更糟糕的是,需要中断第三方工具和供应商使用的面向公众的 API,一个 api我们不能允许的中断。

我们偶然发现了这篇文章,该文章描述了如何从在单独进程中运行的 Internet Explorer 窗口中提取 IHTMLDocument2。这让我们想到了这种方法:

我们将创建一个辅助卫星应用程序/进程,它将像进程服务器一样运行 ActiveX。然后我们将使用LresultFromObjectObjectFromLresult将 ActiveX 对象的引用从卫星应用程序传输到主应用程序进程。卫星应用程序将拥有它自己的清单文件,这将允许它在 SxS 模式下运行。

此 Delphi ActiveX EXE 和第三方 AciveX EXE 插件之间将采用相同的方法进行通信

有一个替代解决方案,目前我们不喜欢上面提出的解决方案,即使用 .net 远程处理和 .net com 代理类通过将 com 请求转换为 .net 来打开两个进程之间的通信通道远程处理,然后在第二个过程中返回 com。

那么问题来了:

  1. 您如何看待这种方法?
  2. 您看到问题的更好解决方案了吗?
0 投票
1 回答
556 浏览

com - 以隔离方式注册和使用进程外 COM 服务器 (SxS)

我们有以下配置:IE->Creates new process->Process uses out-of-proc COM server

我们希望并排享受部署在隔离文件夹中的新进程和进程外 COM 服务器。我们认为使用相对路径的 COM 注册,但看起来在尝试加载 COM 服务器时,svchost.exe 正在尝试从其工作目录加载它 - 这是 C:\Windows\System32。

现在的问题是:

1)进程外是否可以使用相对路径注册?

2) 进程外 COM 服务器是否支持并行?如果是这样,怎么做?

谢谢,奥列格。

0 投票
2 回答
3031 浏览

visual-studio - 由于 msvcr90.dll 尝试加载 FlsAlloc 导致的 XP 部署问题

我在 Windows 7 x64 上使用 VS2008 SP1a (9.0.30729.4148) 构建了一个不想在 XP 下启动的应用程序。

消息是The application failed to initialize properly (0x80000003). Click on OK to terminate the application.。我检查depends.exe并发现msvcr90.dll确实尝试FlsAlloc从 KERNEL32.dll 加载 - 而 FlsAlloc 仅从 Vista 开始可用。我确定它没有被应用程序使用。

如何解决问题?

SxS 包已经安装在目标机器上 - 事实上我有 9.0 SxS 的所有 3 个版本(初始版本、sp1 和 sp1+安全补丁)

应用程序是用_BIND_TO_CURRENT_VCLIBS_VERSION=1

我还定义了正确的目标 Windows 版本stdafx.h

清单文件

依赖的结果

在地址 0x00400000 开始“c:\program files\app\app.EXE”(进程 0xA0)。成功挂接模块。在地址 0x7C900000 加载“c:\windows\system32\NTDLL.DLL”。成功挂接模块。在地址 0x7C800000 加载“c:\windows\system32\KERNEL32.DLL”。成功挂接模块。在地址 0x785E0000 加载“c:\program files\app\MFC90.DLL”。成功挂接模块。在地址 0x78520000 处加载了“c:\program files\app\MSVCR90.DLL”。成功挂接模块。在地址 0x7E410000 加载“c:\windows\system32\USER32.DLL”。成功挂接模块。在地址 0x77F10000 加载“c:\windows\system32\GDI32.DLL”。成功挂接模块。在地址 0x77F60000 加载“c:\windows\system32\SHLWAPI.DLL”。成功挂接模块。在地址 0x77DD0000 加载“c:\windows\system32\ADVAPI32.DLL”。成功挂接模块。在地址 0x77E70000 加载“c:\windows\system32\RPCRT4.DLL”。成功挂接模块。在地址 0x77FE0000 加载“c:\windows\system32\SECUR32.DLL”。成功挂接模块。在地址 0x77C10000 加载“c:\windows\system32\MSVCRT.DLL”。成功挂接模块。在地址 0x5D090000 处加载“c:\windows\system32\COMCTL32.DLL”。成功挂接模块。在地址 0x76380000 加载“c:\windows\system32\MSIMG32.DLL”。成功挂接模块。在地址 0x7C9C0000 加载“c:\windows\system32\SHELL32.DLL”。成功挂接模块。在地址 0x77120000 加载“c:\windows\system32\OLEAUT32.DLL”。成功挂接模块。加载“c:

我应该提到我已安装 Windows SDK 7 并将其配置为默认 SDK。

0 投票
0 回答
1396 浏览

visual-studio-2008 - 是否可以使 mt.exe 在 Visual Studio 2008 中正确嵌入清单文件?

我发现mt.exe在 VCPROJ 中运行时无法正确创建清单文件并将其嵌入到可执行文件中。

例如,相同的可执行文件在 Windows 7 上加载良好,但在 Windows XP 上加载失败。清单已嵌入且正确。

它失败的地方在里面crtlib.c

这让我去了http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/2d6af19a-6ead-4c00-a896-871a28c5f7f1

我花了很多时间寻找可能的原因和解决方案我修改了项目设置以在 exe 文件之外生成清单。现在它适用于两个系统。

以下是调试版本的示例。

禁用嵌入:

这是启用嵌入的:

如果将它们进行比较,第二个添加了通用控件(我不知道从哪里开始),并且它与 requestedExecutionLevel 标记的语法略有不同。

现在的问题是是否可以使 mt.exe 正确嵌入清单以及如何?

0 投票
1 回答
638 浏览

.net - .net 调用 COM 是否在使用 SxS 和清单文件时调用其他 .net COM 对象工作

我有一个调用 COM 组件 (C++) 的 .net 应用程序,该组件又调用在 .NET 中实现的另一个 COM 对象。

此应用程序正在使用 Windows SxS 功能,并且不注册它的任何 COM 组件。不是用 C++ 编写的,也不是用 .net 编写的。

对 C++ COM 组件的第一次调用工作正常。但是,当 C++ COM 组件调用 .net 组件时,它会因未注册类而失败。

我尝试使用调用 .net 组件的清单文件创建一个小型 C++ 应用程序,并且它可以工作。似乎当流程是 .net -> COM NATIVE -> .NET COM。然后 SxS 中断并且不起作用。

查看 Fusion Logs(程序集加载日志)时,我发现甚至没有人尝试解析 .NET COM 程序集。

这个 SxS 场景是否应该有效(我认为它应该有效)?如果是,那么我做错了什么?

这些是我正在使用的清单文件。

.net 应用程序的应用程序清单(作为资源嵌入):

application.sxs.manifest(常规文件):

PerformanceMonitor 清单(作为资源嵌入 PerformanceMonitor.dll 以解决 XP 中的 .net com 错误):

0 投票
2 回答
1142 浏览

c# - COM 互操作并排程序集

我需要部署同一个 C# .NET 项目的多个版本。项目输出是要在本机应用程序中使用的 COM 互操作程序集。我遇到的问题是我必须并排部署这个程序集的多个版本,但无论我做什么似乎都不会创建不同的版本。相反,这些版本会相互覆盖。

我尝试更改程序集 GUID,尝试更改程序集版本号,尝试重新生成程序集强名称密钥,尝试更改程序集标题和描述。我宁愿不必为了版本控制而更改程序集中各个类型的 GUID 或名称。

如何确保这些版本不会相互覆盖,并且我可以并排查看和部署它们?

提前致谢!

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 投票
2 回答
2643 浏览

c++ - 调试 COM 免费注册 (c++)

我构建了一个使用两个 COM 服务器 dll 的 COM 客户端应用程序;我希望这个应用程序在没有 COM 注册的情况下运行 - 即:winsxs / .manifests

当我尝试从我的客户端应用程序创建我的 COM 对象的实例时,我收到一个(...几乎预期的...)“类未注册”消息。

我以前已经成功过这种配置,但我不知道为什么这个配置会失败。


这里还有一些细节:

  • 我拥有的模块:
    • 一个依赖于 2 个 COM 服务器(dll1.dll 和 dll2.dll)的 MFC 客户端
    • dll1.dll COM 服务器依赖于 dll2.dll
    • dll2.dll 没有 COM 依赖

我拥有的 COM 对象:

  • 在 dll1.dll(.idl 语言)中

-

-

  • 在 dll2.dll 中

-

-

  • 客户电话

-

-

  • client.exe.2.manifest

-

-


在 sxs 激活上下文生成过程中我没有错误: - windows 日志中没有错误(应该意味着我的清单语法是正确的) - sxstrace 没有检测到错误(日志以“信息:激活上下文生成成功。”消息结尾并且不包含错误或可疑消息;此外,我看到我的清单已正确加载)

任何想法?

有没有办法用 sxstrace 更深入地调试 sxs?例如,获取实际注册的 com 或 clr 类的列表???

提前谢谢你

0 投票
2 回答
318 浏览

deployment - 并排显现,炙热还是失宠?

我们最近为我们的客户遇到了一些 .dll 地狱问题,所以我想知道所需的 .dll 和 .ocx 的 SxS 安装是否是个好主意。我读到了它并成功地部署了我们的应用程序,至少它的一些依赖项是通过清单来满足的,但它仍然是推荐的部署方式,还是它是过去几年的一种时尚,现在逐渐被放弃了?

0 投票
2 回答
1225 浏览

c++ - 缺少方法的奇怪案例:SXS 和 Controls.Add 导致“对象不支持此属性或方法”?

我有一个用 VB6 编写的使用 UserControl 的项目,该项目在注册 OCX 时运行良好,但如果我使用并排清单运行同一个项目,则会导致错误。

我可以毫无问题地使用控件,只要它是静态加载的(之前在表单上添加),但是如果我在任何使用新控件(属性或方法)时添加动态控件以形成表单,我会收到此错误:

对象不支持此属性或方法

可以通过这种方式重现此错误:

  1. 在 VB6 中创建 OCX 项目
  2. 添加用户控件
  3. 添加一个方法,例如添加DoSomething到控件中
  4. 创建一个exe项目
  5. 将控件添加到窗体,例如UserControl1
  6. 在事件调用中DoSomething
  7. 动态加载喜欢:

    /li>

我将 WinDbg 中的错误跟踪到IDispatch::GetIDsOfNames在第二种情况下调用时将失败。

任何想法?!

编辑:我的错,这是清单。