red*_*oah 16 windows-store java-9 desktop-bridge
我有一个Java 9应用程序,我正在尝试为Windows应用商店打包.奇怪的是,当我直接运行exe-launcher时,它按预期工作,但是当我通过APPX包运行启动器时,我得到以下奇怪的错误:
Exception in thread "Swing-Shell" java.lang.InternalError: Could not
initialize COM: HRESULT=0x80010106
at java.desktop/sun.awt.shell.Win32ShellFolderManager2.initializeCom(Native Method)
at java.desktop/sun.awt.shell.Win32ShellFolderManager2$ComInvoker$1.run(Unknown Source at java.base/java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
HRESULT=0x80010106意味着RPC_E_CHANGED_MODE我猜意味着COM以某种方式已经在MTA模式初始化.但为什么这只是Windows Bridge沙箱中的一个问题?pre-initialize出于某种原因,Windows桥以某种方式某种程度上是COM吗?
我不确定这是Java 9问题,还是Desktop Bridge问题,或两者兼而有之.有没有人对如何确定问题的原因或解决方法有任何想法?
我已经制作了一个最小的示例项目来重现该问题
应用程序在直接执行时有效,但在通过APPX启动程序执行时无效.为什么?
小智 2
依赖于 COM 初始化的 JDK 部分(D3DPipeline、声音和 Windows shell 文件夹访问)都遵循相同的模式:
CoInitialize被称为CoUnitialize调用这与 MSDN 为 COM 保留的文档一致,并且分析是正确的,错误表明 COM 子系统已初始化为 MTA 线程。
因此,我修改了 java 启动器 ( jvm.dll ),并将调试语句插入到os_windows.cpp中的一些本机方法中。我专注于线程方法。我发现的是这样的:
create_main_thread, create_os_thread,pd_start_thread全部在 COM 尚未初始化的情况下运行thread_native_entry) 已在 COM 初始化的情况下运行我进行了更多研究_beginthreadex,确实我终于在 stackoverflow 上找到了线索。这让我找到了threadex.c的源代码,它是 Visual Studio 2013 Express 安装的一部分。
您会发现,它_beginthreadex并不直接启动提供的线程函数,而是_threadstartex首先运行库初始值设定项 ( )。该初始化程序的部分内容如下:
_ptd->_initapartment = __crtIsPackagedApp();
if (_ptd->_initapartment)
{
_ptd->_initapartment = _initMTAoncurrentthread();
}
_callthreadstartex();
Run Code Online (Sandbox Code Playgroud)
_crtIsPackagedApp通过内核函数检测应用程序是否作为“PackagesApp”(即 AppX 包)运行,如果是,则
RoInitialize调用该函数,根据我的理解,它就像 CoInitialize 的老大哥一样。
长话短说:如果您的应用程序是使用 Visual Studio 2013 构建的并作为打包应用程序运行,您将得到一个损坏的环境。
经确认,Oracle JDK 的工作版本是使用 VS2010 SP1 构建的,损坏的版本是使用 VS2013SP4 构建的。
通过以上信息google终于找到了一个参考资料,支持分析:
https://blogs.msdn.microsoft.com/vcblog/2016/07/07/using-visual-c-runtime-in-centennial-project/
引用那篇文章:
请注意,在 Windows 8 时间范围内创建的现有 VC++ 12.0 库具有运行时检查,以确定应用程序是否在应用程序容器下运行。当桌面应用程序作为打包应用程序运行时,这些检查可能会限制桌面应用程序的功能或导致其行为类似于 UWA(通用 Windows 应用程序)(限制文件系统访问或创建初始化 MTA 等的线程)。我们已在这些框架包中包含的 VC++ 库中修复了此行为,从而消除了桌面应用程序中的现代应用程序限制。
因此,我看到了修复应用程序的选项,这些应用程序应作为 AppX 包分发:
msvcr120.dll与 Java 9(我假设也是 Java 10)捆绑的版本替换为更新包中的固定版本我会选择第二个版本,并对此进行了测试。从干净的最新 Windows 10 系统开始,我安装了 JDK 9.0.4,克隆了提供的测试用例,使用本地安装的 JRE(不是 JDK!)对其进行修改并构建 appx 包。运行这个,我重现了这个问题。然后,我将msvcr120.dll系统安装的 JRE 文件夹中的 替换为 APPX 容器中包含的文件夹:
https://www.microsoft.com/en-us/download/details.aspx?id=53176
提示:*.appx 只是带有附加签名的 ZIP 文件,因此您只需重命名它们并提取内容即可。
我重建了测试用例,它正常工作(不再出现 COM 初始化错误)。
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |