头疼,期待大家指点。

黄汉 2002-11-14 04:56:50
我用VC.net开发属性化的ATL COM组件,我想添加一个连接点,用以通知客户。可是不知道怎么的我一直不能在event_receiver中将事件处理函数和事件激发函数连接起来,问题是这样的:
// Sender.h : CSender 的声明

#pragma once
#include "resource.h" // 主符号


// INetSender
[
object,
uuid("DC32F4EB-766F-437E-AAFD-AED635D3F7CC"),
helpstring("INetSender 接口"),
pointer_default(unique)
]
__interface INetSender : IUnknown
{
[helpstring("方法SendMessage")] HRESULT SendMessage([in] BSTR stUserIDFrom, [in] BSTR stUserIDTo, [in] BSTR stMessage);
};


// _INetSenderEvents
[
dispinterface,
uuid("7D07EE56-F155-4B1E-93BE-CEF24F1184AB"),
helpstring("_INetSender事件接口")
]
__interface _INetSenderEvents
{
[id(1), helpstring("方法OnReceiveMessage")] HRESULT OnReceiveMessage([in] BSTR stUserIDFrom, [in] BSTR stMessage);
};


// CSender

[
coclass,
threading("free"),
event_source("com"),
aggregatable("never"),
vi_progid("NetSender.Sender"),
progid("NetSender.Sender.1"),
version(1.0),
uuid("C85DFAD3-C4B3-4622-97FB-C5AAA91D70DE"),
helpstring("Sender Class")
]
class ATL_NO_VTABLE CSender :
public INetSender
{
public:
CSender()
{
}

__event __interface _INetSenderEvents;

DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
return S_OK;
}

void FinalRelease()
{
}

public:

STDMETHOD(SendMessage)(BSTR stUserIDFrom, BSTR stUserIDTo, BSTR stMessage);
};

// Sender.cpp : CSender 的实现

#include "stdafx.h"
#include "Sender.h"


// CSender


STDMETHODIMP CSender::SendMessage(BSTR stUserIDFrom, BSTR stUserIDTo, BSTR stMessage)
{
MessageBox(NULL, _T("开始进行信息分发管理。"), _T("Saii Info"), MB_OK|MB_ICONINFORMATION);
__raise OnReceiveMessage(stUserIDFrom, stMessage);
return S_OK;
}


下面是调用的代码:
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
#include <stdio.h>

#import "NetSender\_NetSender.tlb"
using namespace NetSender;

[ module(name = "NetReceiver") ]

[event_receiver(native)]
class CNetReceiver{
public:
HRESULT MyHandler1(_bstr_t stUserIDFrom, _bstr_t stMessage){
printf("My handler 1 was called with string %s.\n", LPCTSTR(stMessage));
}
void HookEvent(INetSender* pSource) {
__hook(&_INetSenderEvents::OnReceiveMessage, pSource, &CNetReceiver::MyHandler1);
}

void UnhookEvent(INetSender* pSource) {
__unhook(&_INetSenderEvents::OnReceiveMessage, pSource, &CNetReceiver::MyHandler1);
}
};


int main() {
// Create COM object
CoInitialize(NULL);
INetSender* pSource = 0;
HRESULT hr = CoCreateInstance(__uuidof(CSender), NULL, CLSCTX_ALL,
__uuidof(INetSender), (void **) &pSource);
if (FAILED(hr)) {
return -1;
}

// Create receiver and fire event
CNetReceiver receiver;
receiver.HookEvent(pSource);
pSource->SendMessage(_bstr_t("jsy"), _bstr_t("saii"), _bstr_t("I love you."));
receiver.UnhookEvent(pSource);

CoUninitialize();
return 0;
}
, 我用cl netreceiver.cpp /link /OPT:NOREF调试,结果出现这个问题:

编译器错误 C3723
__hook(&_INetSenderEvents::OnReceiveMessage, pSource, &CNetReceiver::MyHandler1);未能解析事件。

我看了msdn上的相关例子,发现和他们的例子并没有什么不同,唯一的不同是我的COM组件是用ATL Wizard创建的。但是我看不出有什么不一样。
...全文
20 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄汉 2002-12-03
  • 打赏
  • 举报
回复
送分了!我的问题你们三个人中没有人能够解答我,所以我不能把所有的分数都给你们。其他的朋友们如果需要分数的,就进来吧。
xuefl66 2002-11-18
  • 打赏
  • 举报
回复
okok
zhf0021 2002-11-15
  • 打赏
  • 举报
回复
sorry
ruihuahan 2002-11-14
  • 打赏
  • 举报
回复
.net的东西,不懂。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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