我常发现为了获得某个对象的指针和句柄,或者已知一个对象的指针想取得它的句柄,或者反之,经常浪费我很多的时间。其实只要有了对象的指针,就如鱼得水了。所以我希望我们一起来总结,每一条我给加一分,100条我结贴,另开一个。我会做一个最后的整理,供大家参考!书写格式最好按以下形式:
类型    功能           函数
如:
五、获取应用程序指针 AfxGetApp()
一、指针、句柄的相互转换:
1、由CDC的指针pDC,得到其相应的句柄用HDC hdc=pDC->GetSafeHdc()。
2、由逻辑调色板的指针LPLOGPALETTE pLogPal,得到逻辑调色板的句柄用m_hPalette=::CreatePalette(pLogPal)
3、由文件映射区的句柄m_hFileMap得到文件映射区得指针用m_pFileMap=MapViewOfFile(m_hFileMap,...)二、不同类型的句柄之间的转换:
1、由文件句柄得到文件映射区句柄,HANDLE hMap=::CreateFileMapping(hFile,...);三、不同类型的指针之间的转换:
1、由文档类指针获得视图类指针,POSITION GetFirstViewPosition() const;
CView *pView=GetNextView(POSITION&);
2、由视图指针获得文档类指针,GetDocument();四、句柄的获得:
1、获得文件句柄,HANDLE hFile = ::CreateFile(strPathname,...);五、指针的获得:
1、获得对话框上控件ID号为IDC_xxx的指针 (控件类名*)CWnd::GetDlgItem(IDC_xxx);

解决方案 »

  1.   

    其实没必要,句柄只是内存映射表中指针的索引号,之所以这么管理是为了系统自动Move内存,消除内存碎片方便,只要知道都能用就好了
      

  2.   

    xghome(东楼) 说得对,对象在内存中的位置是可变的,获取指针并不可靠,句柄可以理解为指针的指针,是指针的索引。
      

  3.   

    楼主的想法挺好的,我支持.
    确实经常碰到这种问题的.先收藏了
    句柄是windows用来标识创建和使用应用程序的唯一整数值,windows要用不同的句柄来标识相应程序的实例,窗口,菜单等.
    大多数句柄是内部表的索引值.
    应用程序几乎总是通过调用一个windows函数来获得句柄,这样其他windows函数可以使用该句柄,以引用相应的对象,windows应用程序往往只能存取句柄,而不能存取句柄所代表的实际数据.
    指针则是代表一个对象在内存存放的其实地址.
    两者都可以用来引用一个对象,就象一个把柄,抓住它就可以对之操作了.
    文档/视结构经常存在相互调用.
    在视里用GetDocment()可以得到文档类的指针.
    在mainframe里调用GetActiveDocument()可以得到当前活动文档的指针.
    其他的就不敢说了,记不得完整的函数名了.
      

  4.   

    五、3、MDI应用程序中存在多个文档时,各个文档指针的获取。
    文档模板对象记录了所有从该模板创建的活动文档对象的一个列表,我们可以通过virtual POSITION  CDocTemplate::GetFirstDocPosition
    得到第一个文档在列表中的位置。再通过virtual CDocument* CDocTemplate::GetNextDoc( POSITION& rPos ) const = 0得到下一个文档的指针。4、MDI应用程序中,获取应用程序主框架窗口的指针m_pMainWnd,用CWinApp* AfxGetApp( ); 这是因为在在InitInstance函数中m_pMainWnd = pMainFrame;
      

  5.   

    五、5、MDI应用程序中模板对象指针的获取,应用程序对象保持了活动文档模板对象的一个列表,通过CWinApp::GetFirstDocTemplatePosition
    POSITION GetFirstDocTemplatePosition( ) const;得到列表中第一个模板的位置,通过CWinApp::GetNextDocTemplate
    CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;可以遍历列表,得到各个模板的指针,并同过3可得到文档指针。 
    6、AfxGetApp()->m_pMainWnd为框架窗口指针 7、在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针 8、在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针 9、在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。 10、在文档中:CDocument::GetDocTemplate得到文档模板指针 11、在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口 
    帮着up一下。谢谢