关于MFC基础问题(显示一个消息)

shiguojie19892 2013-09-27 05:16:09
请问,我在一个MFC工程里面定义了一个动态库回调函数的实现,动态库会发送消息给MFC。现在我不知道如何实现让动态库发送过来的消息给MFC的一个list显示,部分程序如下:
void CALLBACK MessageCallback(unsigned char code, int dlen, void* data)
{
printf("i,m ok!\r\n");
CMFCTesttoDllDlg mfc; //意图给MFCdlg类一个实例mfc

switch(code)
{
case TIP_CODE_HBACK:
mfc.printMsg();//意图调用消息打印
break;

default:
break;
}
}

void CMFCTesttoDllDlg::printMsg()
{
m_List1.InsertString(0, "2");//调用到此处就死掉
UpdateData(FALSE);
}


编译可以通过,但是当消息执行到m_List1.InsertString(0,"2");
系统就会停掉,提示:
Debug Assertion Failed!
Program:....MFCDll.exe
File:afxwin2.inl
Line:673
For information on how your program can casue an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to degug the application)
...全文
305 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiguojie19892 2013-09-30
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
请帖主移驾VC/MFC论坛。
引用 2 楼 xingfu0539 的回复:
这是MFC吧。 我个人觉得你在调试到 m_List1.InsertString(0, "2");//调用到此处就死掉 这句话的时候,看看m_List1是不是空啊 CMFCTesttoDllDlg mfc;只是创建了对象 这时候你调用m_List1应该是存在问题的
引用 4 楼 rxguoblp 的回复:
确定printMsg()函数收到了来自MessageCallback()发送的消息吗?
……………………
引用 15 楼 tanyufeng_521 的回复:
就如13L所说的,你用
CMFCTesttoDllDlg mfc; 
创建时一个新的对话框对象,并不是我们的主对话框(也就是我们程序启动时自动创建的对话框);所以你在调用
void CMFCTesttoDllDlg::printMsg() 
这个函数的时候其实是调用你新建立对象的函数,与我们主对话框没有一点关系。而又由于你没有对新对话框中的m_List1进行初始化,所以直接插入的时候就会出现错误;

CWinApp* pThisApp = AfxGetApp();
CWnd* pMainWnd = pThisApp->m_pMainWnd;

CMFCTesttoDllDlg * pMainDlg = (CMFCTesttoDllDlg *)pMainWnd;
if (pMainDlg == NULL)  return;
用上面的一段代码代替你定义mfc这条语句;
一并感谢!!
shiguojie19892 2013-09-30
  • 打赏
  • 举报
回复
准确的说是运行到printmsg里面的m_List1.InsertString(0,"yes");的语句就死掉了 %>_<%
shiguojie19892 2013-09-30
  • 打赏
  • 举报
回复
引用 15 楼 tanyufeng_521 的回复:
就如13L所说的,你用
CMFCTesttoDllDlg mfc; 
创建时一个新的对话框对象,并不是我们的主对话框(也就是我们程序启动时自动创建的对话框);所以你在调用
void CMFCTesttoDllDlg::printMsg() 
这个函数的时候其实是调用你新建立对象的函数,与我们主对话框没有一点关系。而又由于你没有对新对话框中的m_List1进行初始化,所以直接插入的时候就会出现错误;

CWinApp* pThisApp = AfxGetApp();
CWnd* pMainWnd = pThisApp->m_pMainWnd;

CMFCTesttoDllDlg * pMainDlg = (CMFCTesttoDllDlg *)pMainWnd;
if (pMainDlg == NULL)  return;
用上面的一段代码代替你定义mfc这条语句;
我试着这样去做了,但是运行结果还是一样,运行到printMsg的位置就会崩溃。 崩溃提示信息改变了一下内容: File:wincore.cpp Line:890 其他的还是一样。
Eleven 2013-09-29
  • 打赏
  • 举报
回复
你只定义了一个窗口类对象,并不表示关联的窗口对象对象, OK? 你这里CMFCTesttoDllDlg mfc;只是定义了一个对话框类的对象,并没有关联对话框窗口,所以调用 mfc.printMsg();函数中的与窗口相关的操作均为非常操作。
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
void CMFCTesttoDllDlg::printMsg()	
{
	m_List1.Insert(0, "2");//调用到此处就挂掉了
	UpdateData(FALSE);
}
上面的函数声明在这个里面:
// MFC Test to DllDlg.h : header file
//

#if !defined(AFX_MFCTESTTODLLDLG_H__FC80FCDE_261D_486A_8330_FDA488F1CC65__INCLUDED_)
#define AFX_MFCTESTTODLLDLG_H__FC80FCDE_261D_486A_8330_FDA488F1CC65__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "BMTdll.h"
#include "../baseFile/GLC/glc.h"
/////////////////////////////////////////////////////////////////////////////
// CMFCTesttoDllDlg dialog
//typedef void (CALLBACK *MSGCallBack)(unsigned char code,int dlen, void* data);
//	void MessageCallback(unsigned char code, int dlen, void* data);
// typedef struct 
// {
// 	short order;
// 	short orderback;
// 	short totalnum;
// 	short number;
// }STRUCTPACKED DTMT_ORDER;

class CMFCTesttoDllDlg : public CDialog
{
// Construction
public:
	CMFCTesttoDllDlg(CWnd* pParent = NULL);	// standard constructor

	void printMsg();
// Dialog Data
	//{{AFX_DATA(CMFCTesttoDllDlg)
	enum { IDD = IDD_MFCTESTTODLL_DIALOG };
	CButton	m_Button2;
	CButton	m_Button1;
	CString	m_List1;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMFCTesttoDllDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL
//	void CALLBACK MessageCallback(unsigned char code, int dlen, void* data);
// Implementation
	
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CMFCTesttoDllDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnButton1();
	afx_msg void OnButton2();
	afx_msg void OnSelchangeList1();
	afx_msg void OnButton3();
	afx_msg void OnButton4();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MFCTESTTODLLDLG_H__FC80FCDE_261D_486A_8330_FDA488F1CC65__INCLUDED_)
我不能这样声明这个函数吗?还是不能对Dlg类这么做:
    CMFCTesttoDllDlg mfc; //意图给MFCdlg类一个实例mfc
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
引用 7 楼 VisualEleven 的回复:
你m_List1对象关联的窗口存在吗?
存在的,在member variables里面的CMFCTesttoDllDlg里面有个IDC_LIST1有个Type 是CListBox ,Member是m_List1
Eleven 2013-09-29
  • 打赏
  • 举报
回复
你m_List1对象关联的窗口存在吗?
modyaj 2013-09-29
  • 打赏
  • 举报
回复
m_List1 句柄丢失了吧 你用获取句柄的方法得到指针来处理试试 不要用m_List1了
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
引用 4 楼 rxguoblp 的回复:
确定printMsg()函数收到了来自MessageCallback()发送的消息吗?
收到了 收到后,传到printMsg就死掉了,我是把Dlg类做了是个实例,然后调用它的printMsg,可能这样不行,我想知道如何让一个回调函数可以调用MFC的m_List
rxguoblp 2013-09-29
  • 打赏
  • 举报
回复
确定printMsg()函数收到了来自MessageCallback()发送的消息吗?
tanyufeng_521 2013-09-29
  • 打赏
  • 举报
回复
就如13L所说的,你用
CMFCTesttoDllDlg mfc; 
创建时一个新的对话框对象,并不是我们的主对话框(也就是我们程序启动时自动创建的对话框);所以你在调用
void CMFCTesttoDllDlg::printMsg() 
这个函数的时候其实是调用你新建立对象的函数,与我们主对话框没有一点关系。而又由于你没有对新对话框中的m_List1进行初始化,所以直接插入的时候就会出现错误;

CWinApp* pThisApp = AfxGetApp();
CWnd* pMainWnd = pThisApp->m_pMainWnd;

CMFCTesttoDllDlg * pMainDlg = (CMFCTesttoDllDlg *)pMainWnd;
if (pMainDlg == NULL) return;
用上面的一段代码代替你定义mfc这条语句;
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
“CMFCTesttoDllDlg mfc; //意图给MFCdlg类一个实例mfc” 只是 创建了 mfc。 而且 mfc 对话框 并没有打开(show), 你其实是 要 那个 已经 存在的 对话框。 所以 必须 得到 他的 指针。
是的 是的,请问我如何得到那个存在的那个:IDC_LIST1的指针呢?
schlafenhamster 2013-09-29
  • 打赏
  • 举报
回复
“CMFCTesttoDllDlg mfc; //意图给MFCdlg类一个实例mfc” 只是 创建了 mfc。 而且 mfc 对话框 并没有打开(show), 你其实是 要 那个 已经 存在的 对话框。 所以 必须 得到 他的 指针。
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
引用 11 楼 shiguojie19892 的回复:
[quote=引用 10 楼 VisualEleven 的回复:] 你只定义了一个窗口类对象,并不表示关联的窗口对象对象, OK? 你这里CMFCTesttoDllDlg mfc;只是定义了一个对话框类的对象,并没有关联对话框窗口,所以调用 mfc.printMsg();函数中的与窗口相关的操作均为非常操作。
请教我应该怎样关联到对话框的窗口呢?[/quote] 我的理解这个对话框窗口已经在这个对话框类里面了。
shiguojie19892 2013-09-29
  • 打赏
  • 举报
回复
引用 10 楼 VisualEleven 的回复:
你只定义了一个窗口类对象,并不表示关联的窗口对象对象, OK? 你这里CMFCTesttoDllDlg mfc;只是定义了一个对话框类的对象,并没有关联对话框窗口,所以调用 mfc.printMsg();函数中的与窗口相关的操作均为非常操作。
请教我应该怎样关联到对话框的窗口呢?
旅客 2013-09-27
  • 打赏
  • 举报
回复
把"2"改成_T("2")再试试
我是五道风 2013-09-27
  • 打赏
  • 举报
回复
这是MFC吧。 我个人觉得你在调试到 m_List1.InsertString(0, "2");//调用到此处就死掉 这句话的时候,看看m_List1是不是空啊 CMFCTesttoDllDlg mfc;只是创建了对象 这时候你调用m_List1应该是存在问题的
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
请帖主移驾VC/MFC论坛。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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