C++调用C#的COM DLL的COM事件问题

super_admi 2013-08-20 11:24:57
情况如下,请大家赐教。

1.现在有一个C++程序,调用了C#写的DLL,调用方式为COM。

2.在C#中定义了接口和事件,并实现了接口,定义如下:

public delegate void setlocal(ref string strXml);

[ComVisible(true)]
[Guid("44E5D2FC-8E64-4b13-8600-EF87F2669FB2")]
public interface IBusiness
{
[DispId(184)]
void doSomething(ref string strExchangeData);
}

[ComVisible(true)]
[Guid("8D1B96E5-73A3-4d23-A940-B36327790B7B")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IBusinessEvents
{
[DispId(180)]
void doBackevent(ref string strExchangeData);
}

[ComVisible(true)]
[Guid("08E5B21E-4389-47ab-990B-109F57C8FBF7")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IBusiness))]
[ComSourceInterfaces(typeof(IBusinessEvents))]
public class EnoviaBusiness : IBusiness
{
public event setlocal doBackevent;

public void doSomething(ref string strExchangeData)
{
}

public void doBack(ref string strExchangeData)
{
if(null != doBackEvent)doBackEvent(...);
}
}

3.从C++中调用接口方法时,很正常,但从C#触发事件时,C++中无法响应。。C++中的事件响应,俺是参考ATL的事件响应的,也不知道对不对,代码参考链接:
http://blog.csdn.net/yangdelong/article/details/4315196

4.求教:能否给出一个正确的C# COM事件定义和C++事件响应的方法?多谢了,小弟叩首再拜。
...全文
485 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_admi 2013-08-21
  • 打赏
  • 举报
回复
唉,是我自己犯了个低级错误。
super_admi 2013-08-20
  • 打赏
  • 举报
回复
老赵就别说这些废话了,如果不是业务需要,我会这么费劲?
引用 5 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
赵4老师 2013-08-20
  • 打赏
  • 举报
回复
共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·……
赵4老师 2013-08-20
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
super_admi 2013-08-20
  • 打赏
  • 举报
回复
按道理说,ATL的方式也是可行的……

class EventReceiver : public IDispEventImpl<0, EventReceiver, &EnoviaInterface::DIID_IBusinessEvents, &EnoviaInterface::LIBID_EnoviaInterface, 1, 0>
{
public:

	STDMETHODIMP EventReceiver::EventNotify(BSTR* strXml)
	{
		//printf("EventReceiver : %d\n", i);
		MessageBox(NULL, L"OK!", L"OK!", 0);
		return S_OK;
	}

	BEGIN_SINK_MAP(EventReceiver)
		SINK_ENTRY_EX(0, EnoviaInterface::DIID_IBusinessEvents, 180, EventNotify)
	END_SINK_MAP()
};

	EventReceiver * pReceiver = new EventReceiver;
	hr = pReceiver->DispEventAdvise(pBus);

可实际上就是不行。hr返回S_OK,但COM组件中,事件委托仍然是空。
引用 3 楼 fishion 的回复:
[quote=引用 2 楼 super_admi 的回复:] [quote=引用 1 楼 fishion 的回复:] C++中就是从事件接口派生一个类,然后FindConnectionPoint得到连接点,然后使用Advise方法把刚刚的派生类对象的指针传进去
能说详细些吗?因为这个COM组件是用C#写的,貌似我没有找到您说的两个方法。[/quote] 所以这就是问题所在了,C++中的使用流程就是这样,C#中我就不清楚了[/quote]
fishion 2013-08-20
  • 打赏
  • 举报
回复
引用 2 楼 super_admi 的回复:
[quote=引用 1 楼 fishion 的回复:] C++中就是从事件接口派生一个类,然后FindConnectionPoint得到连接点,然后使用Advise方法把刚刚的派生类对象的指针传进去
能说详细些吗?因为这个COM组件是用C#写的,貌似我没有找到您说的两个方法。[/quote] 所以这就是问题所在了,C++中的使用流程就是这样,C#中我就不清楚了
super_admi 2013-08-20
  • 打赏
  • 举报
回复
引用 1 楼 fishion 的回复:
C++中就是从事件接口派生一个类,然后FindConnectionPoint得到连接点,然后使用Advise方法把刚刚的派生类对象的指针传进去
能说详细些吗?因为这个COM组件是用C#写的,貌似我没有找到您说的两个方法。
fishion 2013-08-20
  • 打赏
  • 举报
回复
C++中就是从事件接口派生一个类,然后FindConnectionPoint得到连接点,然后使用Advise方法把刚刚的派生类对象的指针传进去
fishion 2013-08-20
  • 打赏
  • 举报
回复
http://www.vckbase.com/index.php/wv/1257.html 可以参考下这里的

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧