- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个具有一些 COM 接口(interface)的 API。问题在于 API 通过一个接口(interface)进行通信,该接口(interface)必须由加载该 API 的项目实现。因此,如果我要使用 API,我会将其加载到我的项目中并创建一个类来实现 API 调用的方法,以通知我某些事情或向我传递结果。
这显然成为编码噩梦。此外,由于还有一些中间对象通过 API 从不同的插件和管理器将调用传递给所有实现要为通知调用的方法的对象,这些对象已将自己注册到 API 通知程序,这在术语上已经失控了的复杂性。
我在想,为了缩短加载API的人需要完成的工作,如果API遵循自由线程模型,MFC生成的类如对话框是否可以实现通知需要 COM 接口(interface)?请记住,需要将此类对象转换为 IStream,然后再转换回 API 端的接口(interface),以便 API 可以调用这些方法。
据我所知,MFC 对话框默认是 STA。有什么方法可以强制他们更改或开始使用 MTA?从 COM 的角度来看,它是否合法?我试图避免创建另一个对象来处理另一个线程中的通知,因为这会使事情复杂化。此 API 需要在多个地方使用,有时在 GUI 中,有时在服务中等。
最佳答案
我的理解是,API 本身并不限于控制线程,您的意图是通过 COM 接收器接口(interface)在后台线程上获取通知。
有几种方法可以解决同时保持 COM 友好的问题。最简单的方法是更改应用程序的全局单元模型,以便将“主”GUI 线程初始化为 MTA。虽然这可能有效,但您可能很快就会发现这与其他东西不兼容,例如使用“Arartment”线程模型注册的 ActiveX 控件。
另一种选择是稍微违反 COM 线程准则,这样 API 就可以直接从后台线程使用接收器接口(interface),而无需对其进行编码(marshal)处理。这将与准备好接收侧线程调用的 MFC 应用程序一起正常工作,并且实际上很容易做到(只需在 API 侧的线程/单元之间自愿传递接收器接口(interface)指针)。当检测跨单元接口(interface)指针使用的 .NET 客户端使用 API 时,稍后可能会出现此问题。
为了使其对 COM 友好并且在 UI 线程上仍然使用 STA 线程,您可以实现以下方案。 API可以是接受直接传入sink接口(interface)的STA组件(STA中MFC类实现的COM对象,或者更简单的如直接在window类上实现的COM接口(interface)等)。 API 编码将接口(interface)指针汇入 MTA 以供工作线程使用(CoMarshalInterThreadInterfaceInStream
和 friend )。 API 使用未编码的指针从 MTA 线程传递通知。这通常包括 threda 切换到您不想要的原始线程,因此为了避免它,MFC 端通知类应该实现自由线程编码(marshal)拆收器。这将改变一些事情,以便未编码的接口(interface)指针直接在工作线程上接收调用,而 MFC 应用程序将负责线程同步(关键部分等)。这是 STA、COM 友好的 API 工作线程,同时高效。
关于c++ - 将 MFC 对话框从 STA 更改为 MTA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18888243/
我有一个 MFC 项目,它链接到第三方 dll。在程序退出时,IDE 会报告“检测到内存泄漏!”并倾倒泄漏物。 这些泄漏来自第三方 dll。我很确定这些是错误的报道。 (Google 的快速检查表明
首先我想要的是:能够显示具有多列的网格,每个单元格都有一个自定义渲染回调。因此,您可以使用这样的控件在游戏中显示您的库存,或者类似于 Google Chrome 中的行为,它会显示您访问的热门页面的网
在新的 MFC 功能(功能包)中,菜单出现在三个地方: 在菜单栏中 (CMFCMenuBar) 在弹出菜单中 (CMFCPopupMenu) 在 CMFCButton 的“下拉菜单”版本中 我想在所有
在我的 MFC 项目中,我想动态生成标签。例如:我必须为它们生成 4 个编辑控件和相应的标签——比如“Label1”“Label2”...... CStatic *label[MAX_THREAD];
我有第一个对话框,上面有一个简单的按钮,单击该按钮时,使用 CDialog::Create(IDD,this) 创建了第二个对话框。我希望在销毁第二个对话框但不向第二个对话框添加任何代码时通知父级,即
我们的代码库中的添加到剪贴板代码非常低级 - 分配全局内存等等。对于简单的情况,我只想将一些纯文本放在剪贴板上,是否有任何例程可以包装所有这些内容? 一个例子是 CRichEditCtrl 具有 Co
我对 mfc 中事件和消息之间的区别有点困惑。 他们是一样的吗? 最佳答案 由于您专门询问 MFC,我假设您指的是可以在 MFC 类的属性窗口中定义的事件处理程序和消息处理程序。 在“事件”下,您可以
如何以编程方式检测我的 MFC 应用程序当前是否正在显示模式对话框或属性表?目前我正在使用以下内容,但我觉得该代码也会触发无模式对话框。 bool HasModalDialog(const CWnd*
我有两个按钮: 单选按钮:“十六进制” 按钮:“A” 我想在用户选中“十六进制”按钮时启用“A”(“A”在创建时的状态为“禁用”),我该怎么做?谢谢大家。 最佳答案 您需要使用 CButton 's
通常情况下,窗口的厚度为 4 个像素,可以通过 GetSystemMetrics 方法获取。我可以更改它的值,例如 2 个像素吗? 非常感谢! 最佳答案 简单的回答:不。不适用于特定窗口。 复杂的答案
我需要打开一个从同一个类实例化的对话框两次。当我尝试这个时 CdelmeDlg dlg; dlg.DoModal(); dlg.DoModal(); 第二个调用只打开对话框一瞬间,然后关闭。我敢打赌消
如何通过代码在 mfc 中减少标题栏的窗口? 最佳答案 用: ModifyStyle (WS_CAPTION, 0); // to hide ModifyStyle (0, WS_CAPTION);
我使用 AfxMessageBox 关键字显示消息框。基本的东西。 但是,由于路径的长度,它显示如下: 有什么方法可以阻止它以这种方式自动换行吗? 抱歉,如果这是一个愚蠢的问题。但如果我只有一个句子,
所以,我有一个 MFC 程序的插件。我正在使用鼠标事件 Hook (来自 SetWindowsHookEx)来捕获点击。主机应用程序可以打开任意数量的(可能重叠的)子窗口,但我只想拦截特定子窗口中的点
我正在尝试将图像添加到现有按钮..我在一定程度上做到了这一点,问题是我可以添加一个所有者绘制的图像,但无法添加我想要的确切图像..示例见下文代码 CButton* pBtn= (CButton*)Ge
我想在对话框的标题栏上放置一些控件。一种可能的解决方案是,我只是从对话框中删除标题栏并绘制自己的标题栏。 但是如果我自己画标题栏,标题栏的外观不会根据窗口的主题而改变。而且我也不得不忍受接近、最小化和
我已经使用 MinGW 开发了 WinAPI 应用程序,没有问题。现在,我可以用 MFC 做同样的事情吗? 最佳答案 你不能。 MFC 代表 Microsoft Foundation Classes,
(我正在使用VS ++ 2005) 我在对话框上放置了编辑框控件(ID为ID_edit_box),并为其关联了两个变量(使用处理程序向导):控件(c_editbox)和值(v_editbox)变量。我
我有一个自定义 MFC 对话框 CMyDialog,使用资源编辑器添加了一个类型为 CMyControl 的自定义控件 - 该对话框有一个控件的成员变量并且有 DDX设置。 该控件正在接收绘制消息,并
直到现在,我从未真正需要我正在开发的大型 MFC(如果重要,则为单文档界面)应用程序的 Winapp ExitInstance()。但现在我这样做了,主要是为了清理内存分配、卸载一些 DLL 等。好吧
我是一名优秀的程序员,十分优秀!