com组件事件通知

huangli0921 2018-01-04 02:18:08
根据杨老师的教程及教程中的代码作了一个com组件事件及接收器的小程序测试, 在注册回调接口的时候遇到了问题,Exception thrown at 0x00000000 in EventSink.exe: 0xC0000005: Access violation executing location 0x00000000.
有没有大神可以指导一下问题出在哪里?,多谢啦!

//COM 组件的idl文件
import "oaidl.idl";
import "ocidl.idl";

[
object,
uuid(DB72DF86-70E9-4ABC-B2F8-5E04062D3B2E), // 这个 IID 可以用 GUDIGEN.EXE 产生
helpstring("ICallBack"),
pointer_default(unique)
]
interface ICallBack : IUnknown
{
[] HRESULT Fire_Result([in] LONG nResult);
};


[
object,
uuid(0BCD8A43-F42A-44D6-BB59-F354347BD689),
pointer_default(unique)
]
interface IEvent1 : IUnknown{
[] HRESULT Add([in] LONG n1, [in] LONG n2);
[] HRESULT AdviseTest([in] ICallBack* pCallBack, [out] LONG* pdwCookie);
[] HRESULT UnadviseTest([in] LONG dwCookie);
};
[
uuid(37B99EF7-1574-4CF2-8D5D-6E2375EA1860),
version(1.0),
]
library Simple12Lib
{
importlib("stdole2.tlb");
[
uuid(25611193-8A92-420F-B965-16343D94A491)
]
coclass Event1
{
[default] interface IEvent1;
[source, default] interface ICallBack;
};
};


//event sink 的Sink.cpp文件
#pragma once
#include "Simple12_i.h"
class Sink :
public ICallBack
{
public:
Sink();
~Sink();
DWORD m_dwRefCount;

STDMETHODIMP Sink::QueryInterface(const struct _GUID &iid, void ** ppv)
{
*ppv = this; // 不管想得到什么接口,其实都是对象本身
++m_dwRefCount;
return S_OK;
}

ULONG __stdcall Sink::AddRef(void)
{
return 1;
}

ULONG __stdcall Sink::Release(void)
{
return 0;
}

STDMETHODIMP Sink::Fire_Result(LONG nResult)
{
return S_OK;
}
};

//调用组件及注册回调接口部分
HRESULT hr;
hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);

Sink sink;
LONG dwCookie;
IEvent1 *pEvent1 = nullptr;
hr = CoCreateInstance(CLSID_Event1, NULL, CLSCTX_SERVER, IID_IEvent1, reinterpret_cast<void**>(&pEvent1));

ICallBack *pISink = nullptr;
hr = sink.QueryInterface(IID_ICallBack, reinterpret_cast<void**>(&pISink));
hr = pEvent1->AdviseTest(pISink, &dwCookie);//执行这行时出错
hr = pEvent1->Add(1, 4);
pEvent1->Release();
//hr = m_pIGlobalInterfaceTable->RevokeInterfaceFromGlobal(dwCookie_static);
::CoUninitialize();
...全文
306 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangli0921 2018-01-19
  • 打赏
  • 举报
回复
经过调试问题出在客户端的QueryInterface, 修改如下 STDMETHODIMP Sink::QueryInterface(const struct _GUID &iid, void ** ppv) { if (iid != IID_IUnknown && iid != IID_ICallBack)//只是在拿这两个接口的时候返回本身 return E_NOINTERFACE; *ppv = this; ++m_dwRefCount; return S_OK; }
赵4老师 2018-01-04
  • 打赏
  • 举报
回复
先下载安装MSDN98 MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl 再参考其中的“COM Tutorial Samples”

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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