描述:
我想实现消息过虑接口,IMessageFilter,这个接口是从IUnknown继承而来的,那么单独定义一个类来实现接口IMessageFilter接口,存在如下问题:
假设实现的类是:MyMessageFilter
Class MyMessageFilter :public IMessageFilter
第一,如果,我在类的实现文件.cpp中定义构造函数和析构函数,就会提示,构造函数和析构函数不能返回类型,可是事实上我的构造函数和析构函数是空的。
第二,虽然IUnknown是基接口,但是,如果不在我的类头文件中MyMessageFilter.h中声明它的三个函数QuryInterface,Addref,Release而在实现文件中直接实现,就会提示说没有声明这三个函数。
第三,如果,我在实现文件中不实现析构和构造函数(问题一),在头文件中声明IUnknown的三个函数,接下来会出现下面的问题,HRESULT ,DWORD等的重定义,说是typedef不能由任何其他符合重载。
这是什么问题啊?
下面是我的头文件和实现文件,各位大侠看看由什么问题,急用,谢谢,指教。
MyMessageFilter.h
////////////////
#pragma once
#include "objidl.h"
#include "objbase.h"
class MYLPMESSAGEFILTER : public IMessageFilter
{
public:
MYLPMESSAGEFILTER();
~MYLPMESSAGEFILTER();
public:
HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID riid,
void __RPC_FAR *__RPC_FAR *ppvObject);
ULONG STDMETHODCALLTYPE AddRef( void);
ULONG STDMETHODCALLTYPE Release(void);
DWORD STDMETHODCALLTYPE HandleInComingCall(
DWORD dwCallType,
HTASK threadIDCaller,
DWORD dwTickCount,
LPINTERFACEINFO lpInterfaceInfo
);
DWORD STDMETHODCALLTYPE RetryRejectedCall(
HTASK htaskCallee,
DWORD dwTickCount,
DWORD dwRejectType);
DWORD STDMETHODCALLTYPE MessagePending(
HTASK threadIDCallee,
DWORD dwTickCount,
DWORD dwPendingType
);
}
//////////////
MyMessageFilter.cpp
///////////
//MYLPMESSAGEFILTER.CPP:实现文件
#include "stdAfx.h"
#include "MYLPMESSAGEFILTER.h"
#include ".\MYLPMESSAGEFILTER.h"
/*
MYLPMESSAGEFILTER::MYLPMESSAGEFILTER()
{
//AfxMessageBox("2");
}
MYLPMESSAGEFILTER::~MYLPMESSAGEFILTER()
{
}
*/
HRESULT MYLPMESSAGEFILTER::QueryInterface(
//STDMETHORDIMP MYLPMESSAGEFILTER::QueryInterface(
REFIID iid,
void ** ppvObject
)
{
}
ULONG MYLPMESSAGEFILTER::AddRef(void)
{
}
ULONG MYLPMESSAGEFILTER::Release(void)
{
}
//DWORD MYLPMESSAGEFILTER::HandleInComingCall(
DWORD MYLPMESSAGEFILTER::HandleInComingCall(
DWORD dwCallType,
HTASK threadIDCaller,
DWORD dwTickCount,
LPINTERFACEINFO lpInterfaceInfo
)
{
// return SERVERCALL_REJECTED ;
}
DWORD MYLPMESSAGEFILTER::MessagePending(
HTASK threadIDCallee,
DWORD dwTickCount,
DWORD dwPendingType
)
{
return PENDINGMSG_CANCELCALL ;
}
//STDMETHODIMP_(DWORD)
DWORD MYLPMESSAGEFILTER::RetryRejectedCall(
//STDMETHODIMP_(DWORD)MYLPMESSAGEFILTER::RetryRejectedCall(
HTASK threadIDCallee,
DWORD dwTickCount,
DWORD dwRejectType
)
{
AfxMessageBox("1");
return -1;
}