问题标签 [winsxs]

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 回答
785 浏览

dll - 使用 Microsoft.VC90.CRT 摆脱 DLL 地狱?

我已经构建了一个 inproc com 服务器 dll,我可以通过构建实用程序 py2exe 将其打包为一个或多个文件。当我允许所有依赖项保持外部时,我没有问题,但捆绑为 1 个文件会产生问题。

当使用 dll 时(注册它或从中实例化一个 com 对象),无论我做什么,它都会立即MSVCR90.DLL从路径加载,我无法改变它。c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6871_none_50944e7cbcb706e5\MSVCR90.DLL我找不到任何信息(使用 Dependency Walker)来指示导致加载的原因。它只是神奇地发生...

然后,稍后它通过显式调用LoadLibraryA("MSVCR90.dll")(某些 py2exe 黑盒的一部分?)再次加载该 dll,但这次它不查看winsxsmanifests / 目录。相反,它会查看系统路径和/或将遵守 dll 重定向。这就是问题发生的时候。如果我将系统路径设置为从它开始,c:\windows\winsxs\x86_microsoft.vc90.crt...\它将加载完全相同的 dll 并且很高兴 - 但如果使用任何其他文件 - 包括完全相同的 dll 的副本 - 但在不同的路径 - 那么整个事情就会爆炸. 它无法处理使用两个不同的文件。

我怎样才能解决这个问题?理想情况下,我喜欢让 dll 的初始魔法加载基于私有程序集,但无论我对清单或 .dll.local 等做什么,在第二次加载 dll 之前,它都不会尊重这一点。

请注意,对于非捆绑 dll(外部依赖项),它始终使用 winsxs MSVCR90.DLL。

我可以通过强制系统路径加载winsxs副本来“修复”我无法使用dll的问题,但这对于可部署的com服务器来说毫无用处!

0 投票
1 回答
29 浏览

windows-10 - windows 10中执行windows程序的流程是什么?

操作系统:Windows 10 LTSB(64 位)

目前我正在研究白名单程序。

这是我的问题。

  • 我在 c:\Windows\System32\notepad.exe 中有 notepad.exe
  • 它的哈希值为 [9cd1c3d00ae15068...74a]

  • 我在 c:\Windows\WinSxS\amd64 中有另一个记事本...

  • 它的哈希值为 [da0acee8f60a460...10a]

所以基本上它们是我的白名单中的不同程序。但无论如何,我将它们都添加到了我的白名单中。

我试图编辑一个批处理文件,该文件触发了 notepad.exe 的执行。但是我的白名单程序阻止了 notepad.exe 的执行,因为 notepad.exe 来自 c:\windows\system32\notepad.exe 但哈希值为 [da0acee8f60a460...10a]。

但是如果我再次检查System32中notepad.exe的哈希值,它和之前一样,是[9cd1c3d00ae15068...74a]。

似乎 winSxS 中的 notepad.exe 在触发时已被复制到 system32。这是它对系统程序的工作方式吗?

顺便说一句,32位的windows7没有发生这种情况

0 投票
0 回答
91 浏览

windows - 如何跟踪 sxstrace 未显示的 SxS 绑定问题?

我对 SxS 绑定有一些奇怪的问题。我有依赖于 VC9 的 CRT、MFC 和 OpenMP 的供应商 DLL。最初这些 DLL 指向旧的 CRT (21022.8),但我更新了它们的清单以指向最新版本 (30729.6161)。我需要这些 DLL 在客户端机器上工作,而无需安装 VC9 可再发行组件(即非管理员安装)。很难在我的开发者机器上进行测试,因为我无法完全摆脱 VC9 可再发行组件:太多的应用程序正在使用它(例如 Everything 搜索、Google 备份)。我可以从 winsxs 中删除 MFC 和/或 OpenMP(以及随附的策略/清单文件)。

当我删除 OpenMP 时,我得到一个 SxS 配置错误,该错误显示在事件查看器中,我可以使用sxstrace.exe. 这样做导致我将一个Microsoft.VC90.OpenMP.manifest文件与 vcomp90.dll 一起放在我的应用程序旁边,这允许该应用程序使用本地 OpenMP。

但是当我删除 MFC 时,我没有收到并排错误。相反,我得到一个弹出对话框说The program can't start because mfc90.dll is missing from computer.。即使将文件提供给我的应用程序Microsoft.VC90.MFC.manifest,它也不会在可执行文件旁边找到 mfc90.dll。因为这不是一个并排错误,sxstrace.exe所以没有告诉我任何事情。

当我使用 Process Monitor 监视 DLL 访问时,我看到它绑定到 winsxs 中的 VC90.CRT(我无法摆脱它,因为它正在使用中)。然后,不看本地目录,在winsxs中找mfc90.dll,没有找到,然后不找其他地方就报错了。

为什么它会这样,我该如何解决?

编辑:我不知道它是否相关,但供应商 DLL 是基于 COM 的,我已使用 Interop DLL 包装/隔离。所以我实际上只The program can't start在它尝试创建 COM 对象时得到错误。

0 投票
0 回答
93 浏览

c++ - 解决C/C++库版本冲突,主要在Linux上

我或多或少有一种情况,如此处所示;它存在于 Windows 和 Linux 上,但我将使用更清晰的 Linux 表示法来绘制它: 在此处输入图像描述

libbar.so.1 和 libbar.so.2 包含具有相同名称和签名但行为不同的过程。如果我“天真地”链接应用程序,那么最后加载的库中的符号将“隐藏”首先加载的库中的符号(至少,如果我正确理解了这个引用),我无法同时使用这两个库同时确定当天实际使用了哪个库的符号。

当然,我在运行时收到的错误消息与这种心理模型是一致的。

现在,如果我可以重新编译所有库,那么如参考中所述,我可以使用该–default-symver选项(至少在使用 gcc 编译和链接时)来完全消除每个库中的符号歧义,并强制 libfoo.so 查找功能baz@@libbar.so.1和应用程序来寻找baz@@libbar.so.2没有歧义的功能。

但是,如果我只能重新编译我的应用程序和 libbar.so.2 怎么办?libfoo.so 是否会忽略该函数baz@@libbar.so.2,或者它只会看起来只是它的baz一部分,并且可能仍然使用它而不是 libbar.so.1 中的那个?

这是一个完整的跨平台应用程序,所以我在 Windows 上也有完全相同的问题要解决。在这里,我有一个暗示,我可以使用 SxS 机制,因为情况与在 VS2019 中编译的应用程序链接到在 VS2013 中编译的库并没有什么不同;这样应用程序需要链接到运行时的一个版本,而库需要链接到另一个版本。但是,虽然我知道如何使用系统库来处理这个问题,但我不太确定如何使用其他库。

0 投票
0 回答
113 浏览

winapi - Windows 似乎无法识别外部清单

我正在为我编写的一个非常简单的程序使用外部清单,program.exe. program.exe.1.manifest我在同一目录中有一个外部清单。这些是内容:

现在,简单程序只需调用LoadLibraryW(L"payload.dll"). 位于payload.dll系统Windows目录中,但是,我正在尝试从桌面上payload.dll调用的文件夹中加载一个版本。source这在我将清单直接嵌入程序时有效,但在它是外部清单时无效。为什么外部清单不起作用?

0 投票
0 回答
115 浏览

c# - STA->MTA 的 COM 注册免费 (SxS) 和代理存根

我正在尝试从 C#(作为插件)使用我的 C++ COM API(加载在 C++ 应用程序中)而无需任何注册。 我按照本教程中的步骤进行操作

所以我所做的是:

  1. 在启动时从我的 C++ 应用程序创建激活上下文。我将我的 COM API 清单文件传递给 CreateActCtx 并通过 ActivateActCtx 启用它
  2. 我的 C# 插件由我的 C++ 应用程序加载(在自定义 AppDomain 内)
  3. 在我的 C# 插件中,我正在尝试 3 种不同的场景。
  • 第一个是在应用程序主线程内创建 COM 对象 --> 这是有效的

  • 第二种是在一个单独的 STA 线程中创建 COM 对象并转换 COM 对象 --> 这是有效的

  • 最后一种情况是在一个单独的MTA线程中创建 COM 对象并强制转换 COM 对象。在这里我有一个问题。我能够创建一个对象,但我无法投射它。我收到了异常,例如:

所以下面,代码是我用来测试的代码

另一个奇怪的行为是如果我取消注释我的 STA 测试。两个测试都可以!所以我不知道会发生什么。看来我有一些没有正确初始化的东西。

你知道发生了什么或我应该检查什么吗?为什么 STA <--> MTA 机制似乎没有加载comInterfaceExternalProxyStub配置?

在此先感谢您的帮助 ;)