我给你看一段别人的解释,你评价一下handle,句柄,它是什么东东?看看定义,它是一个unsigned int。它不是指针,但是它可以转化成指针。它们的转化靠的是什么,仍然是一张表。我们以一个对象句柄和对象指针来看看它们究竟是什么关系! 一个对象指针表示了一个对象在内存中的位置,一个对象句柄是一个unsiged int 它什么都不表示,该句柄还是由机器随即产生的。那么它有什么用?它表征了这个对象,所谓的表征其实就是一个别名,只是这个别名是用来给编译器来识别该对象的。 int a; int *p=&a 。p表示了a的地址。你使用:a=4,你对a赋值,但是编译器怎么知道a表示什么(尽管对你来说a就是那个整型变量,但是编译器是不懂什么是a的)。编译器在编译阶段对每一个变量分配了一个用来编译器自己识别变量的标识符,一个32位unsigned int。也就是那个变量a的句柄。有了这个东东,a=4怎么操作呢? 碰到了a,一个变量,编译器在变量表中取找到这个a,取出这个a的句柄,这个句柄再对应了该对象的地址(也就是左值),然后再对左值操作。以上是个人理解。 中心:句柄就是编译器用来自己识别对象的标识符。只是有时它把这个东东呈现在我们面前。我比较认同,handle就是对象指针的引用。
其实上面的问题对那种语言都是一样的啊,可能编程的时候用不到,但了解了总是有帮助的啊
一个对象指针表示了一个对象在内存中的位置,一个对象句柄是一个unsiged int 它什么都不表示,该句柄还是由机器随即产生的。那么它有什么用?它表征了这个对象,所谓的表征其实就是一个别名,只是这个别名是用来给编译器来识别该对象的。
int a; int *p=&a 。p表示了a的地址。你使用:a=4,你对a赋值,但是编译器怎么知道a表示什么(尽管对你来说a就是那个整型变量,但是编译器是不懂什么是a的)。编译器在编译阶段对每一个变量分配了一个用来编译器自己识别变量的标识符,一个32位unsigned int。也就是那个变量a的句柄。有了这个东东,a=4怎么操作呢? 碰到了a,一个变量,编译器在变量表中取找到这个a,取出这个a的句柄,这个句柄再对应了该对象的地址(也就是左值),然后再对左值操作。以上是个人理解。
中心:句柄就是编译器用来自己识别对象的标识符。只是有时它把这个东东呈现在我们面前。我比较认同,handle就是对象指针的引用。
1:如何计算程序的载入地址。
这个问题在操作系统里有说明
在程序调入时,由操作系统安排空闲的内存,分配一定大小的空间,将程序里的地址改为相对于装载时的地址(即相对地址),如果在调入内存时内存使用完了,还要根据一定的算法将内存的数据调出内存,再将你的程序装入内存.不过究竟程序载入的地址是多少,只有操作系统才知道,这个地址在每次重新启动程序里都不一样.程序员也不必去关心载入地址是多少,除非你是作操作系统.
Dll载入内存和程序一样,在多个进程调用时各自将一个COPY到自已的进程空间,如果有静态变量则大家共享.
2:内存在合并的时候对地址有什么影响。
内存在合并时对地址没有影响,合并内存不外乎是将不用的内存交由操作系统管理,不管是内存碎片还是程序退出后空出的内存.在下次启动程序时合并的内存就是一个连续的空间.3:handle和hinstance的真正含义,产生的依据。
handle是一个句柄,句柄是什么,说穿了它就是资源.在VC里,这此东西要好好利用.
hInstance也是一个句柄,不过它只是一个程序标识的资源,也就是楼上所说有,它是场景资源
不过我要说HINSTANCE 它不是变量,它是一个类型.
msdn上哪里有啊,我可能没找对地方,你找找呢。
handle 句柄
hInstance 是应用程序的句柄。
具体也不清楚了:)
你的意思是说每个进程都有一个dll的copy嘛?是整个的copy还是部分?
我一直觉得dll的调用是通过文件映射来实现的。
病毒代码一般没有导入函数,要调用api就要找kernerl32.dll的基地址,那也多是通过PE文件头格式暴力搜索。
既而不同,病毒代码找kernerl32.dll的基地址,又怎么能确定呢?