将句柄看成指针行不行?

wangliminde 2002-04-01 05:09:21
句柄代表了对象,在pb中create语句返回一个句柄,直接可以用一个声明的同类型的指针接受,同时可以用.运算符访问对象的成员函数,在这里为什么用.运算符而不是c中的->运算符呢?
...全文
45 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfmad 2002-04-04
  • 打赏
  • 举报
回复
Of course not!
句柄是整数,指针是地址
句柄<>指针
lemon_zc1949 2002-04-04
  • 打赏
  • 举报
回复
jeffandjeff(brood)有道理。
lemon_zc1949 2002-04-03
  • 打赏
  • 举报
回复
我的理解,其实句柄就像是一个身份号,用一个大小为DWORD的存储单元保存这个号,可对于全局(Windows系统),也可对于局部(应用程序).我不太同意句柄是什么指针,什么结构的。一个比方:Windows系统生了一个婴儿(对象),然后给它一个号码(句柄),不管以后这个孩子在什么地方(内存中),不管这个孩子变成什么样(可能被修改无数次),最终系统可以通过这个号码(句柄)可以找到他,然后对它进行相应的教育(处理).当这个孩子死了(被释放了),系统将收回这个号。
ahao 2002-04-03
  • 打赏
  • 举报
回复
搞不懂你们要讨论些什么,句柄就是句柄,就是为了隐藏实际的实现.
它可以是指针,可以是指向结构的指针,可以是实际的值,可以是数组的索引值,
可以是任何东西,这根本不用去关心
lemon_zc1949 2002-04-03
  • 打赏
  • 举报
回复
tuying2:你敢用 delete 句柄;嘛?
lemon_zc1949 2002-04-03
  • 打赏
  • 举报
回复
tuying2(方法) :放屁。
tuying2 2002-04-03
  • 打赏
  • 举报
回复
句柄可以看作指针。
jeffandjeff 2002-04-03
  • 打赏
  • 举报
回复
因为windows限制了内核对象的数据结构只能被内核访问,所以就设计了一个叫handle的东西来让你操作内核对象.
handle只不过是windows拿来标识内核对象的一个不透明的值而已
sandAhrow 2002-04-02
  • 打赏
  • 举报
回复
句柄 是windows资源的地址,也就是资源标识。
指针是真正指向一个内存的地址。
所以说他们都是地址是没有错的,只是有一点区别。
LLnju 2002-04-01
  • 打赏
  • 举报
回复
比如你要写个函数库让别人使用,但是你不想让人知道关于你地实现的哪怕是很少的一点细节性的东西,你可以这样做:

定义一个头文件,就算是叫 handleTest.h 吧,你可以这样做:

#ifndef __HANDLETEST_H__
#define __HANDLETEST_H__

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __IMPLMYHANDLE__
typedef struct MyHandle
{
int a , b;
} *HMYHANDLE;
#else
typedef long HMYHANDLE;
#endif

HMYHANDLE CreateMyObject( int a , int b );
void ShowMyObject( HMYHANDLE hObj );
void DestroyMyObject( HMYHANDLE hObj );

#ifdef __cplusplus
};
#endif

#endif

写个文件来实现你的东东,比如:

#define __IMPLMYHANDLE__

#include <iostream>
#include "handleTest.h"
using namespace std;

HMYHANDLE CreateMyObject( int a , int b )
{
HMYHANDLE hObj = new MyHandle;
hObj->a = a; hObj->b = b;
return hObj;
}
void ShowMyObject( HMYHANDLE hObj )
{
cout << hObj->a << " " << hObj->b << endl;
}
void DestroyMyObject( HMYHANDLE hObj )
{
delete hObj;
}

编译成DLL。然后你不想别人看到你是怎么样定义 HMYHANDLE 的,你就把
#ifdef __IMPLMYHANDLE__
typedef struct MyHandle
{
int a , b;
} *HMYHANDLE;
#else
typedef long HMYHANDLE;
#endif
弄成了:typedef long HMYHANDLE; 现在你可以放心的把你的东西交给你的用户去了,就算他是个天才,要弄明白你是怎么样实现的也要大大的花一番功夫。以后你想改 HMYHANDLE 的具体定义,比如又加入了几个域,改了就是了,完全不用通知你的客户什么,程序还是照样的运行着。

客户的代码看起来就是这个样子:

#include "handleTest.h"
void main()
{
HMYHANDLE hObj = CreateMyObject( 1 , 2 );
ShowMyObject( hObj );
DestroyMyObject( hObj );
}
像不像我们的程序,呵呵。
Muf 2002-04-01
  • 打赏
  • 举报
回复
句柄
通常来说,句柄是对内部对象的索引。
它有可能是一个编号,
也有可能是一个对象指针,
对于不同系统,实现方式是不一样的。

对于使用者来说,不管句柄是否是指象对象的指针,都不要去当指针来引用。因为,首先,该对象的结构通常是不公开的;其次,即使你知道对象的结构,它也有可能在将来的版本中发生改变。而这些也是设计者使用句柄的原因。
《未公开的Winddows技术》一书对于Windows的句柄及其它对象的结构有相当篇幅的描述。
tuying2 2002-04-01
  • 打赏
  • 举报
回复
up(三角形多的)!
junegone 2002-04-01
  • 打赏
  • 举报
回复
句柄是标志内核对象的一个东西,
7zkeeper 2002-04-01
  • 打赏
  • 举报
回复
不一样的
句柄和对象,就象遥控器和电视
LLnju 2002-04-01
  • 打赏
  • 举报
回复
没有什么区别,只是你知道 HWND 到底是怎么样一个数据结构吗?
LLnju 2002-04-01
  • 打赏
  • 举报
回复
没有什么区别,只是你知道 HWND 到底是怎么样一个数据结构吗?
LLnju 2002-04-01
  • 打赏
  • 举报
回复
本来是一样的,不过你知道 HWND 的数据结构是怎么样的吗?不知道吧,这个可是M$不愿让你看到的,呵呵,所以呢,还是不要干这些乱七八糟的事情。
不过要是你自己写的程序,你完全可以这样做:

// youHandle.h
... ...
typedef long HYOUROBJ;
HYOUROBJ CreateYourObj();
void UserYourObj( HYOUROBJ );
void DestroyYourObj( HYOUROBJ );
... ...

// youImpl
... ...
struct HEHEHE
{
int a , b;
HEHEHE( int __a , int __b );
};
typedef HEHEHE* HYOUROBJ;
HYOUROBJ CreateYourObj()
{
return new HEHEHE(1,2);
}
void UserYourObj( HYOUROBJ obj )
{
cout << obj->a << " " << obj->b << endl;
}
void DestroyYourObj( HYOUROBJ obj )
{
delete obj;
}
liu_feng_fly 2002-04-01
  • 打赏
  • 举报
回复
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;
这是winnt.h里面的一小段,应该可以说明问题。
我是这样理解的,指针,他本身有很多不安全的因素,比如,通过指针,你可以访问很多你不应该访问的内存,造成程序死机等等严重错误,windows当然不可能不考虑这些因素。所以,他们通过句柄这种方法来代替指针,消除副作用。比如说,你就不可能通过句柄来任意修改内存了。
一点看法,请批评指正
xuyongg 2002-04-01
  • 打赏
  • 举报
回复
一样
sandAhrow 2002-04-01
  • 打赏
  • 举报
回复
指针指向一个地址时,这个地址与句柄 有什么不同,
我想它们到少是很类似的吧,地址与句柄它们都是唯一的。
所以我想说句柄就是一个地址。
你说句柄是不是指向一个内存的地址呢?
加载更多回复(19)

16,551

社区成员

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

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

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