CEdit派生类,引发了异常: 读取访问权限冲突

guoqiang5277 2016-12-31 02:31:29
在派生类里面添加的成员变量,在外部操作的时候会报异常。
引发了异常: 读取访问权限冲突。
pThis-> 是 0xFFFFFFFFFFFFFEB7。

贴上部分代码
MyEditBox.h

#pragma once
#include "afxwin.h"
class CMyEditBox :
public CEdit
{
public:
CMyEditBox();
~CMyEditBox();
public:
bool jSelectAll;
public:
bool getSelStatus();
bool setSelStats(bool enable);
};

MyEditBox.cpp

#include "stdafx.h"
#include "MyEditBox.h"


CMyEditBox::CMyEditBox()
: jSelectAll(true)
{
}


CMyEditBox::~CMyEditBox()
{
}


bool CMyEditBox::getSelStatus()
{
return jSelectAll;
}


bool CMyEditBox::setSelStats(bool enable)
{
jSelectAll = enable;
return false;
}

对应dlg文件的头文件

#pragma once
#include "MyEditBox.h"

// CTVTool_PanelBox 对话框

class CTVTool_PanelBox : public CDialogEx
{
DECLARE_DYNAMIC(CTVTool_PanelBox)

public:
CTVTool_PanelBox(CWnd* pParent = NULL); // 标准构造函数
virtual ~CTVTool_PanelBox();

// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG_PANELBOX };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
//省略代码
CMyEditBox *myEdit_M;
afx_msg void OnEnKillfocusEditPanelM();
};

对应dlg的cpp文件

#include "stdafx.h"
#include "TVTool_PanelBox.h"
#include "afxdialogex.h"
// CTVTool_PanelBox 对话框

IMPLEMENT_DYNAMIC(CTVTool_PanelBox, CDialogEx)
//省略代码
BEGIN_MESSAGE_MAP(CTVTool_PanelBox, CDialogEx)
ON_EN_KILLFOCUS(IDC_EDIT_PANEL_M, &CTVTool_PanelBox::OnEnKillfocusEditPanelM)
END_MESSAGE_MAP()
//省略代码
BOOL CTVTool_PanelBox::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化

myEdit_M = (CMyEditBox*)GetDlgItem(IDC_EDIT_PANEL_M);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
//省略代码
void CTVTool_PanelBox::OnEnKillfocusEditPanelM()
{
// TODO: 在此添加控件通知处理程序代码
myEdit_M->setSelStats(true);
}
//省略代码


编译成功后,在编辑框IDC_EDIT_PANEL_M丢失焦点后,就会提示报异常
引发了异常: 读取访问权限冲突。
pThis-> 是 0xFFFFFFFFFFFFFEB7。
...全文
606 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovepdh 2017-01-03
  • 打赏
  • 举报
回复
myEdit_M = (CMyEditBox*)GetDlgItem(IDC_EDIT_PANEL_M); 这样强转行吗?myEdit_M 本身有new出来吗,指向的还是系统帮你创建的CEdit,当然会不对。
guoqiang5277 2017-01-03
  • 打赏
  • 举报
回复
引用 19 楼 schlafenhamster 的回复:
直接派生 CEdit 怎么会有: DECLARE_DISPATCH_MAP() DECLARE_INTERFACE_MAP() 这些是 activeX 的
这些是自动生成的, 在类向导里面,把自动化和active accessibility的属性选中后,就有了
schlafenhamster 2017-01-03
  • 打赏
  • 举报
回复
直接派生 CEdit 怎么会有: DECLARE_DISPATCH_MAP() DECLARE_INTERFACE_MAP() 这些是 activeX 的
guoqiang5277 2017-01-03
  • 打赏
  • 举报
回复
引用 23 楼 cutmelon 的回复:
这种情况得用Subclass啊,在初始化对话框的时候用下头两句:
myEdit_M=new CMyEditBox();
myEdit_M->SubclassDlgItem(IDC_EDIT_PANEL_M,this);
使用该方法完美收工。
guoqiang5277 2017-01-03
  • 打赏
  • 举报
回复
引用 17 楼 schlafenhamster 的回复:
那就不要 static const IID IID_IMyEditBox2 = { 0x3A175B88, 0xB6A6, 0x42FF, { 0x80, 0xF8, 0x85, 0xEE, 0xDE, 0xC2, 0x7F, 0xA0 } };
去掉后还是NG,要不你有空的时候加我qq帮忙看一下,我私信你
schlafenhamster 2017-01-03
  • 打赏
  • 举报
回复
那就不要 static const IID IID_IMyEditBox2 = { 0x3A175B88, 0xB6A6, 0x42FF, { 0x80, 0xF8, 0x85, 0xEE, 0xDE, 0xC2, 0x7F, 0xA0 } };
cutmelon 2017-01-03
  • 打赏
  • 举报
回复
这种情况得用Subclass啊,在初始化对话框的时候用下头两句:
myEdit_M=new CMyEditBox();
myEdit_M->SubclassDlgItem(IDC_EDIT_PANEL_M,this);
guoqiang5277 2017-01-03
  • 打赏
  • 举报
回复
引用 21 楼 ilovepdh 的回复:
myEdit_M = (CMyEditBox*)GetDlgItem(IDC_EDIT_PANEL_M); 这样强转行吗?myEdit_M 本身有new出来吗,指向的还是系统帮你创建的CEdit,当然会不对。
这个应该怎么修改呢?
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:
activeX 控件是要注册的。 你直接从 CEdit 派生 不行吗 ?
是直接从Cedit派生的。没有用activeX 控件
schlafenhamster 2017-01-02
  • 打赏
  • 举报
回复
activeX 控件是要注册的。 你直接从 CEdit 派生 不行吗 ?
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
你 查查 (regedit)注册表里有 没有 0x3A175B88 控件?
在注册表里面搜索 3A175B88,什么都没有搜到。
schlafenhamster 2017-01-02
  • 打赏
  • 举报
回复
你 查查 (regedit)注册表里有 没有 0x3A175B88 控件?
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
添加 IID_IMyEditBox2 注册表里没有 0x3A175B88 !
怎么添加的呢? 另外:MyEditBox2.h和MyEditBox2.cpp这两个是VStatio前面是自动生成的,只有setSelStats、getSelStats、 jSelectAll是手动添加的
schlafenhamster 2017-01-02
  • 打赏
  • 举报
回复
添加 IID_IMyEditBox2 注册表里没有 0x3A175B88 !
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
我又重新派生了CEdit类,增加了自动化和active accessibility的属性,还是不行。 附上代码: MyEditBox2.h

#pragma once


// CMyEditBox2

class CMyEditBox2 : public CEdit
{
	DECLARE_DYNAMIC(CMyEditBox2)

public:
	CMyEditBox2();
	virtual ~CMyEditBox2();

	virtual void OnFinalRelease();

protected:
	DECLARE_MESSAGE_MAP()
	DECLARE_DISPATCH_MAP()
	DECLARE_INTERFACE_MAP()
private:
	bool jSelectAll;
public:
	bool getSelStatus();
	bool setSelStats(bool enable);
};
MyEditBox2.cpp

// MyEditBox2.cpp : 实现文件
//

#include "stdafx.h"
#include "TVTool.h"
#include "MyEditBox2.h"


// CMyEditBox2

IMPLEMENT_DYNAMIC(CMyEditBox2, CEdit)

CMyEditBox2::CMyEditBox2()
{
#ifndef _WIN32_WCE
	EnableActiveAccessibility();
#endif

	EnableAutomation();
}

CMyEditBox2::~CMyEditBox2()
{
}

void CMyEditBox2::OnFinalRelease()
{
	// 释放了对自动化对象的最后一个引用后,将调用
	// OnFinalRelease。  基类将自动
	// 删除该对象。  在调用该基类之前,请添加您的
	// 对象所需的附加清理代码。

	CEdit::OnFinalRelease();
}


BEGIN_MESSAGE_MAP(CMyEditBox2, CEdit)
END_MESSAGE_MAP()


BEGIN_DISPATCH_MAP(CMyEditBox2, CEdit)
END_DISPATCH_MAP()

// 注意: 我们添加 IID_IMyEditBox2 支持
//  以支持来自 VBA 的类型安全绑定。  此 IID 必须同附加到 .IDL 文件中的
//  调度接口的 GUID 匹配。

// {3A175B88-B6A6-42FF-80F8-85EEDEC27FA0}
static const IID IID_IMyEditBox2 =
{ 0x3A175B88, 0xB6A6, 0x42FF, { 0x80, 0xF8, 0x85, 0xEE, 0xDE, 0xC2, 0x7F, 0xA0 } };

BEGIN_INTERFACE_MAP(CMyEditBox2, CEdit)
	INTERFACE_PART(CMyEditBox2, IID_IMyEditBox2, Dispatch)
END_INTERFACE_MAP()


// CMyEditBox2 消息处理程序

bool CMyEditBox2::getSelStatus()
{
	return jSelectAll;
}


bool CMyEditBox2::setSelStats(bool enable)
{
	jSelectAll = enable;
	return false;
}
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
引用 7 楼 hdt 的回复:
这是你的全部代码吗? 你没有处理动态创建,序列化,等等 mfc类不是简简单单的继承,就行的
你好,刚接触MFC没有多久。 百度了一下动态创建,序列化,看的不是很懂什么意思。 请教一下,应该怎么去添加修改呢?
guoqiang5277 2017-01-02
  • 打赏
  • 举报
回复
补充一下,在执行 myEdit_M->setSelStats(true);的时候没有异常,而是执行完成后大概半秒钟左右才出现的异常。 异常图片 中断后留在这里 相关堆栈信息
真相重于对错 2017-01-01
  • 打赏
  • 举报
回复
这是你的全部代码吗? 你没有处理动态创建,序列化,等等 mfc类不是简简单单的继承,就行的
schlafenhamster 2017-01-01
  • 打赏
  • 举报
回复
jSelectAll = enable; 什么叫 jSelectAll ? 所有的 edit 都 enable ? myEdit_M 只是一个 edit ! 如果 要在 派生类中 区别 各 实例(各 edit)必须 long id=GetDlgCtrlID();
guoqiang5277 2016-12-31
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
重新获得: myEdit_M = (CMyEditBox*)GetDlgItem(IDC_EDIT_PANEL_M); myEdit_M->setSelStats(true);
这个方法NG, 在执行 myEdit_M->setSelStats(true);的时候没有异常,而是执行完成后大概半秒钟左右才出现的异常。
加载更多回复(4)

16,471

社区成员

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

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

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