- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 C++ DLL 的 C# Windows 窗体应用程序。在 DLL 中,我初始化 COM:
auto hResult = CoInitialize(NULL); // Initialize COM
if (hResult != S_OK && hResult != S_FALSE) {
WSACleanup();
return 1;
}
当我在 BackgroundWorker 进程之外运行 DLL 时,一切正常。但是,如果我这样做,我的应用程序会在 DLL 完成时卡住。所以,我正在尝试使用 BackgroundWorker;但是每当我在 DoWork 函数中运行 DLL 时,我都无法初始化 COM。
请有人解释一下,并就如何在 BackgroundWorker 中运行我的 DLL 提供任何建议吗?
谢谢。
最佳答案
BackgroundWorker
使用线程池线程。 .NET 线程池线程自动初始化为 MTA (CoInitializeEx(NULL, COINIT_MULTITHREADED)
)。您的 DLL 正在尝试将线程初始化为 STA (CoInitialize()
),并且该调用应该返回 RPC_E_CHANGED_MODE
。这是一个失败。
通常,我不会在库中在调用线程 上初始化COM。我认为这是一种反模式。单个客户端应用程序可以使用多个库,并且每个库都可能(尝试)初始化 COM。更好的设计是让每个线程的所有者在该线程上初始化 COM。您的客户端应用程序将为主线程和它拥有的任何后台线程初始化 COM(.NET 为您完成所有这些)。每个库都会(在文档中)指定其入口点的线程/单元要求(例如,“此 DLL 的 FooExport
函数必须从 STA 线程调用。”)。库拥有的线程的单元状态将由库控制。从库中调用 CoInitialize/Ex
的唯一真正好处是尝试检测您的线程当前所处的单元状态,以便以编程方式检查库的单元要求,但有一些场景(中性线程单元),这会成为问题。
针对您的场景:
SetApartmentState
)。还可以考虑删除库中的 CoInitialize
调用。CoInitialize
调用,或使用 CoInitializeEx(NULL, COINIT_MULTITHREADED)
。关于c# - 从 BackgroundWorker C# 调用的 CoInitialize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48282022/
我正在尝试在线程中使用 COM 接口(interface)。根据我所读到的内容,我必须在每个线程中调用 CoInitialize/CoUninitialize 。 虽然这工作正常: procedure
我正在编写一个控制台应用程序,该应用程序将为名为 Client.exe 的主应用程序创建防火墙异常(exception),该应用程序通过 FTP 将一些文档上传到我们的服务器。我从Delphi 7 W
我正在 Delphi XE2 中构建一个多线程 Windows 服务应用程序,它使用 ADO 数据库组件连接到 SQL Server。我用过CoInitialize(nil);在内部线程之前很多次,但
假设我的应用程序在启动时调用 CoInitialize,并在存在之前调用 CoUninitialize。 假设我的应用程序使用了一个第三方组件并执行类似的操作,这会导致某种失败吗? 当调用已经提交时,
假设我的应用程序在启动时调用 CoInitialize,并在存在之前调用 CoUninitialize。 假设我的应用程序使用了一个第三方组件并执行类似的操作,这会导致某种失败吗? 当 CoIniti
这是我的 ThorDetectorSwitch.cpp 文件构造函数的 C++ 代码: ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__u
自创建以来已经有 16 年了,我仍然不知道为什么 CoInitialize 中有一个保留参数。方法。有谁知道(或能够做出明智的猜测)添加此参数的原因以及预期用途是什么? 最佳答案 这实际上不是为了将来
我使用 UniDac 组件连接到 PostgreSQL。我的查询正在单独的线程中运行。现在,当我在线程中使用 CoInitialize 时,我收到以下编译器错误: - [DCC Error] QryT
在具有ADO数据库连接的多线程环境中,我想知道CoInitialize是否已被调用。我该如何检查这个? 最佳答案 通常情况下,您不应该执行此检查,而只需调用 CoInitialize/CoUnInit
下面的代码,源自https://learn.microsoft.com/en-us/windows/desktop/shell/folder-info#determining-an-objects-p
我有一个 .NET 应用程序,它使用 COM Interop 使用 COM 组件,组件实例化自身,接口(interface)指针在 API cal 中返回到 .net 包装器,稍后在应用程序流程中进行
我在 Delphi 程序的线程内使用 TIdHttp 和 TXMLDocument。现在我想知道: 这些类是否使用 COM 对象,因此我需要在此线程中调用 CoInitialize 和 CoUnini
onecore\com\combase\objact\objact.cxx(812)\combase.dll!00007FF8BD322169: (caller: 00007FF8BD320F78)
我正在学习 Python 中的多线程。我正在查看在线示例,并尝试为远程连接到远程计算机的 WMI 模块尝试多线程。但是,当我使用pythoncom.CoInitialize()时,它给我一个错误,指出
-我的问题 我得到 CoInitialize has not been called exption. -我的项目结构 这是我的问题。我有一个用 C# 开发的 COM dll,MCLWrapper.d
为了学习多线程,我在 COM 线程 (TRemoteDataModule) 中创建了一个线程。 这是我的组件工厂: TComponentFactory.Create(ComServer, TServe
我正在开发一个 UI 应用程序,它会一路创建一个 COM 对象。 问题是,我想将这个 COM 对象完全“移动”到另一个线程上。 我要做的是: 创建我想将对象移动到的新线程(使用 CreateThrea
我有一个 XE2 DataSnap 服务器(Windows 服务),它在其方法中使用第 3 方进程外 COM 组件。作为 COM,我知道它需要在语句周围使用 CoInitializeEx 和 CoUn
我有一个使用 C++ DLL 的 C# Windows 窗体应用程序。在 DLL 中,我初始化 COM: auto hResult = CoInitialize(NULL); // Initializ
COM是否需要初始化才能使用SysAllocString、SysFreeString等BSTR处理函数? MSDN 说 You need to initialize the COM library o
我是一名优秀的程序员,十分优秀!