com组件事件通知
根据杨老师的教程及教程中的代码作了一个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();