急!如何在非MFC类中引用MFC类, 说的不是很明白,详情见内
#include "appDlg.h" //我要引用的MFC类
--------------------------
#include "stdafx.h"
//extern _ATL_FUNC_INFO OnTextInfo;
#define IDC_SRCOBJ 0
static const int DISPID_ONREQUEST = 1;
static const int DISPID_ONREQUESTEX = 2;
static _ATL_FUNC_INFO OnRequestInfo = {CC_STDCALL, VT_EMPTY, 6 , { VT_VARIANT,VT_VARIANT, VT_VARIANT,VT_VARIANT ,VT_VARIANT,VT_VARIANT} };
class CAppDlg; //我要引用的MFC类
---------------
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
class CAppObj : public IDispEventSimpleImpl<0, CAppObj , &__uuidof(IjqtMsgEvents)>
{
public:
CAppDlg *m_pAppDlg;
CAppObj(CAppDlg *pAppDlg)
{
m_pAppDlg = pAppDlg;
}
BEGIN_SINK_MAP(CAppObj )
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUEST, OnRequest, &OnRequestInfo)
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUESTEX, OnRequestEx, &OnRequestExInfo)
END_SINK_MAP()
HRESULT __stdcall OnRequest( VARIANT FunctionCode, VARIANT Header, VARIANT Params,
VARIANT OptionalParams, VARIANT* Returndata, VARIANT* ErrorCode)
{
return S_OK;
}
virtual ~CAppObj()
{
}
}
我自己写了一个CPP文件内容如上,生成了一个CAppObj类。
我现在想在CAppObj 类中添加CAppDlg的变量 *m_pAppDlg,CAppDlg 是我应用程序的主类。
但我现在构造函数中将pAppDlg初始化后,在CAppObj的内部函数中不能使用pAppDlg调用CAppDlg的函数,请问这是为什么?
谢谢!
问题点数:45、回复次数:17Top
1 楼wangshuo2k(动乐)回复于 2003-09-02 14:28:36 得分 0
怎么没人理啊?
是不是太简单了?Top
2 楼wangshuo2k(动乐)回复于 2003-09-02 14:47:21 得分 0
UP!!Top
3 楼vcforever(累)回复于 2003-09-02 15:04:26 得分 5
在你的Project--Setting选项卡的General页的Microsoft Foundation Classes下拉列表
中选择Using MFC in Shared Dll或Using MFC in Static Library
然后再编译整个工程!应该就可以了,试一试吧
祝你成功!Top
4 楼wangshuo2k(动乐)回复于 2003-09-02 16:17:58 得分 0
谢谢楼上的,但我试了不行。
整个工程是基于MFC的,已添加了对ATL的支持。
上面那个文件是单另添加的,主要用来支持COM的事件触发接收。
但我现在接收到COM事件消息后要做的工作需要用到CAppDlg中的函数。
但我现在没发在CAppObj 类中调用CAppDlg类的函数。
我想问题只能出在我添加文件方式和对MFC类的支持上,不知道对不对,请教大家!Top
5 楼lzwcom(梅花香自苦寒来)回复于 2003-09-02 16:43:31 得分 40
在appdlg的类声明里面加如下代码
class CAppDlg...
{
friend class CAppObj;
}
这是把CAppObj声明为CAppDlg的友类,这样CAppObj就可以访问CappDlg中的所有成员
同时要注意,把AppObj.h包含到AppDlg.h中,但因为你要在AppObj中使用AppDlg,所以你要包含AppDlg.h,这样会出现头文件重复包含的情况,编译无法进行,解决办法如下:
class CAppDlg;//告诉编译器,有CAppDlg这么一个类
class CAppObj..
{
CAppDlg* m_pAppDlg;
}
同时在CAppObj的实现文件AppObj.cpp中,包含AppDlg.hTop
6 楼lzwcom(梅花香自苦寒来)回复于 2003-09-02 16:47:54 得分 0
愚人觉得这跟MFC和No MFC无关,这是一个C++的语法问题Top
7 楼wangshuo2k(动乐)回复于 2003-09-02 19:20:09 得分 0
谢谢楼上的,但我试了不行。
我在#include "appDlg.h"中添加了
#include "CAppObj.cpp"
class CAppDlg : public CDialog
{
friend class CAppObj;
……………………
我只有CAppObj.cpp没有CAppObj.和,没关系吧?Top
8 楼wangshuo2k(动乐)回复于 2003-09-02 19:22:57 得分 0
谢谢楼上的,但我试了不行。
我在#include "appDlg.h"中添加了
#include "CAppObj.cpp"
class CAppDlg : public CDialog
{
friend class CAppObj;
……………………
我只有CAppObj.cpp没有CAppObj.和,没关系吧?Top
9 楼wangshuo2k(动乐)回复于 2003-09-03 09:21:35 得分 0
UP!Top
10 楼lzwcom(梅花香自苦寒来)回复于 2003-09-03 10:17:34 得分 0
呵呵,应该是#include "CAppObj.h",建议做过AppObj.h,把CappObj的声明部分放在在CAppObj.h中,这个改动量也不会很大Top
11 楼wangshuo2k(动乐)回复于 2003-09-03 11:33:11 得分 0
#include "appDlg.h" //我要引用的MFC类
--------------------------
#include "stdafx.h"
//extern _ATL_FUNC_INFO OnTextInfo;
#define IDC_SRCOBJ 0
static const int DISPID_ONREQUEST = 1;
static const int DISPID_ONREQUESTEX = 2;
static _ATL_FUNC_INFO OnRequestInfo = {CC_STDCALL, VT_EMPTY, 6 , { VT_VARIANT,VT_VARIANT, VT_VARIANT,VT_VARIANT ,VT_VARIANT,VT_VARIANT} };
class CAppDlg; //我要引用的MFC类
---------------
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
class CAppObj : public IDispEventSimpleImpl<0, CAppObj , &__uuidof(IjqtMsgEvents)>
{
public:
CAppDlg *m_pAppDlg;
CAppObj(CAppDlg *pAppDlg)
{
m_pAppDlg = pAppDlg;
}
BEGIN_SINK_MAP(CAppObj )
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUEST, OnRequest, &OnRequestInfo)
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUESTEX, OnRequestEx, &OnRequestExInfo)
END_SINK_MAP()
HRESULT __stdcall OnRequest( VARIANT FunctionCode, VARIANT Header, VARIANT Params,
VARIANT OptionalParams, VARIANT* Returndata, VARIANT* ErrorCode)
{
return S_OK;
}
virtual ~CAppObj()
{
}
}
这样的CPP应该怎么写。H啊?我还真不会:(
Top
12 楼lzwcom(梅花香自苦寒来)回复于 2003-09-03 12:11:31 得分 0
//-------CAppObj.h
class CAppObj : public IDispEventSimpleImpl<0, CAppObj , &__uuidof(IjqtMsgEvents)>
{
public:
CAppDlg *m_pAppDlg;
inline CAppObj(CAppDlg *pAppDlg)
{
m_pAppDlg = pAppDlg;
}
BEGIN_SINK_MAP(CAppObj )
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUEST, OnRequest, &OnRequestInfo)
SINK_ENTRY_INFO(IDC_SRCOBJ, __uuidof(IjqtMsgEvents), DISPID_ONREQUESTEX, OnRequestEx, &OnRequestExInfo)
END_SINK_MAP()
HRESULT __stdcall OnRequest( VARIANT FunctionCode, VARIANT Header, VARIANT Params, VARIANT OptionalParams, VARIANT* Returndata, VARIANT* ErrorCode);
virtual ~CAppObj();
}
//----AppObj.cpp
CAppObj::~CAppObj()
{
}
HRESULT __stdcall CAppObj::OnRequest( VARIANT FunctionCode, VARIANT Header, VARIANT Params, VARIANT OptionalParams, VARIANT* Returndata, VARIANT* ErrorCode)
{
return S_OK;
}
Top
13 楼wangshuo2k(动乐)回复于 2003-09-03 12:23:42 得分 0
报错:
'CAppObj::~CAppObj' : destructors not allowed a return type
析构怎么会出错?不明白。Top
14 楼lzwcom(梅花香自苦寒来)回复于 2003-09-03 13:26:13 得分 0
你把appobj.h中的 vitrual ~CAppObj();改为inline vitrual ~CAppObj(){};
然后把appobj.cpp中CAppObj::~CAppObj(){}部分删掉,再试试看Top
15 楼wangshuo2k(动乐)回复于 2003-09-03 14:22:33 得分 0
还不行,出来了300多了错误。
Top
16 楼dhbo(沉默的石头)回复于 2003-09-03 14:40:15 得分 0
感觉没什么错,但楼主的
#include "appDlg.h" //我要引用的MFC类
应该放在
#include "stdafx.h"
后面
而且我认为不应该把构造函数写为:
inline CAppObj(CAppDlg *pAppDlg)
{
m_pAppDlg = pAppDlg;
}
//去掉inline
同时如果你声明为一个全局的或static的
CAppObj m_dlg;
你根本就不会对,因为形式参数始终为NULL,或一个无效的地址
Top
17 楼lzwcom(梅花香自苦寒来)回复于 2003-09-03 14:48:09 得分 0
最后一招:你放弃CAppObj.cpp,把原来(最开始的版本)CAppObj.cpp中的内容全部复制到CAppDlg.cpp文档的最后面.再试试,看看能不能编译通过。Top



