小编Dan*_*gro的帖子

处理用于Java互操作的C++(ATL,MFC或纯C++)中的COM事件

我目前正在尝试构建一个与COM组件接口的C++库(DLL文件),以使其在Java中可用.我的想法是,我构建了一个非常小的C++ DLL,其中包含一个"包裹"COM组件的类,然后使用SWIG导出它.我使用#import语句得到了很多:

#import "ComponentName.dll"
Run Code Online (Sandbox Code Playgroud)

并调用CoInitialize()并创建组件的实例(通过Visual Studio生成的IComponentNamePtr类).这适用于所有正常的COM方法调用,这很好.

但是,我无法弄清楚如何使事件发挥作用.我看到有一个IComponentNameEventsPtr补充了主要的"智能指针"类,但我无法弄清楚要做些什么才能让它工作

我已经尝试了以下所有方法来使事件发挥作用:

  • 纯C++ - 我无法弄清楚如何做到这一点.我尝试创建一个继承自IComponentNameEvents类的新类,为所有抽象函数创建存根,并覆盖函数,但函数未标记为虚函数,因此不起作用.
  • MFC - 我无法正确调用AfxOleInit.谷歌搜索告诉我,从DLL调用时调用失败,因为它假定OLE已经初始化.我不太确定如何解决这个问题.每次我尝试创建COM组件的实例时,我的库都崩溃了(我假设因为COM没有正确初始化)
  • ATL - 我无法弄清楚如何在ATL中完成这些事件.我可以创建类(通过"简单ATL"向导,然后"实现接口"向导),但无法解决如何使用它.我在MSDN上阅读使用IDispEventImpl,无法解决如何使用该howto生成的类.我是否也需要通过ATL使用COM对象(或者我可以使用#import自动生成的类)?如何"附加"事件监听器类?
  • 在COM中读取事件处理,它使用event_receiver属性(新的Visual C++统一事件模型的一部分).最初我无法弄清楚如何将它与通过#import语句创建的COM组件的使用相结合.我终于解决了(在页面上提到了!)我需要在#import语句中使用"embedded_idl"标志,但这打破了其他事情(我有一堆"期待类型规范接近"错误.tlh文件)

有谁知道如何做到这一点?什么是最简单的方法?我的背景是C#和PHP,所以我在C++中使用COM的经验不多.

tldr:在C++ DLL中使用COM事件最简单的方法是什么?

c++ com visual-studio

8
推荐指数
1
解决办法
5625
查看次数

重新呈现ReactJS组件会挂起浏览器

我一直在尝试使用ReactJS创建基于组件的UI,而不是我通常的一百万个全局函数,变量和不可重用标记的slapdash方法.到目前为止,我真的很喜欢React,但我遇到了绊脚石.

请考虑以下组件布局

EventView
  EventViewSidebar
    EventViewList
      EventViewListRow
  EventViewDetail
Run Code Online (Sandbox Code Playgroud)

在此布局中,EventViewListRow每个唯一键存在多次出现.单击EventViewListRow应该更新的实例EventViewDetail以及该项目的详细信息.

这是render顶级EventView组件的功能:

render: function () {
    return (
      <div className="event-view row-fluid">

          <div className="event-view__sidebar col-md-4">
            <EventViewSidebar projectId={this.state.projectId} />
          </div>

          <div className="event-view__content col-md-8" id="eventDetail">

          </div>

      </div>
    );
}
Run Code Online (Sandbox Code Playgroud)

这是EventViewDetail组件

var EventViewDetail = React.createClass({

    getInitialState: function () {
        return { eventId: 0 };
    },

    render: function () {
        if (this.state.eventId === 0) {
            return (<h3>Nothing selected</h3>);
        }
        else {
            return (
          <div>
              {this.state.eventId}
          </div> …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-jsx

2
推荐指数
1
解决办法
2044
查看次数

标签 统计

c++ ×1

com ×1

javascript ×1

react-jsx ×1

reactjs ×1

visual-studio ×1