句柄和指针的困惑~

句柄和指针的困惑~,第1张

指针保存的就是一个对象的地址,通过这个地址你可以访问这个对象的属性或方法,例如有一个CDC指针dc,你可以调用dc->TextOut方法;再如,你使用

CBitpam p=new CBitmap返回的就是一个指向CBitmap的对象;句柄跟这个不一样,例如你使用GlobalAlloc申请内存,返回的是一个句柄,这个句柄可能0x00000036,这个不是指针,是 *** 作系统管理的一个对象, *** 作把这个0x00000036跟某个地址(例如是0x024F6579)绑定起来,你需要访问这个句柄对象时, *** 作系统会帮你检查你这个句柄的有效性,防止出现这个对象被delete后再访问时出现的非法访问;刚才的语句,你调用了delete p后,你一样可以调用p->xxx方法,但会出现非法访问。

句柄是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。

最左素短语是句型中最左边的素短语。素短语是指至少含有一个终结符的短语,并且除自身外,不包含更小的素短语。

句柄并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法一个广义的指针。

它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的唯一的联系。

扩展资料:

句柄在 Windows编程中是一个很重要的概念,在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行 *** 作。

应该明白的是,句柄是一个标识符,是用来标识对象或者项目的。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在 Windows编程中会用到大量的句柄。

:就是上面的asserts发生了同时你正在写的是一个多线程程序,那么asserts发生的原因很可能是你将一个C++对象从一个线程传递给另一个线程同时你无意中使用了那个C++对象(only simple inline wrapper functions should be used(抱歉,这一句不会翻译)),实际上线程之间传递CWnd对象应该传递句柄(HWND)。接收线程应该通过CWnd::FromHandle函数通过传递过来的句柄获取CWnd对象(这里准确的来说应该是CWnd对象的指针)。

线程之间传递C++对象是危险的,除非那个对象被设计为以那种方式使用。

由上面我想到一种在工作线程中d出的对话框的办法:

1 转递视图类句柄给线程函数:

HWND HView;

…… // 获取视图类句柄

CreateThread(NULL,0,RecvThread, HView

,0,&dwThreadId);

2 在线程函数中通过句柄获取视图类指针,获取数据给视图类发送自定义消息:

DWORD WINAPI RecvThread(LPVOID lpParam)

{

HWND HView = (HWND)lpParam;

CWnd pMyView = CWnd::FromHandle(HView);

……

pMyView ->SendMessage(WM_TASKDLG_MESSAGE,(WPARAM)(&str));

……

}

3 在视图类自定义一个消息函数OnTaskDlgMessage专门处理WM_TASKDLG_MESSAGE消息用于创建对话框:

LRESULT CInteAView::OnTaskDlgMessage(WPARAM wParam, LPARAM lParam)

{

CAIDlgProductName dlg;

if(dlgDoModal() == IDOK)

{

……

}

return 0;

}

当然上面将视图类换为框架类也是可以的。上面就我的经验谈了一种从工作线程中d出对话框的办法,不当之处还请大家指点。

>

本质相同,但是代表的含义不同 句柄多用于对象的访问,可以认为是对象的索引,系统通过这个索引来访问各种对象,比如进程对象,线程对象,事件对象等等(这些都是应用层,内核是通过直接访问对象体的) 指针多用于内存的直接 *** 作,还是以对象为例,如果我们通过指针来访问一个对象,这个时候不是通过对象管理器定位索引来访问对象的,而是通过内存地址直接 *** 作对象体的 两者的区别其实很多,很难说清,看具体的运用环境,希望你能看懂我所描述的 , BYE

以上就是关于句柄和指针的困惑~全部的内容,包括:句柄和指针的困惑~、句柄是一个什么样的数据结构、MFC CreateThread 显示对话框等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10150737.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存