1:如何计算程序的载入地址。
2:内存在合并的时候对地址有什么影响。
3:handle和hinstance的真正含义,产生的依据。
4:dll载入内存后的地址如何计算,多进程调用下的情况又是怎样的。

解决方案 »

  1.   

    你要了解的是window系统的管理方式,参考一下windows内核的书
      

  2.   

    DELPHI一般不需要去处理这些问题的啊
      

  3.   

    知道这个要了解WIN32的核心机制不过俺不知道,因为一时用不到
      

  4.   

    DELPHI不是把我们从内存中拯救出来了吗?怎么不去学C++?
      

  5.   

    c++我一直在用,delphi用了快三个月了吧。
    其实上面的问题对那种语言都是一样的啊,可能编程的时候用不到,但了解了总是有帮助的啊
      

  6.   

    handle 和 hinstance的含义?第一,我要纠正一个错误。hInstance仅仅只是一个变量,常用而已。一般定义为双字节,用h开头,就是句柄的意思,名称为Instance。就是场景的意思。就是如此。意思就是应用程序的句柄。Handle就是句柄的意思了,在delphi里面使用,就是主窗口的句柄。是LongWord类型。如果用Sdk来说,主窗口的句柄表示就是HWND
      

  7.   

    还没有说清楚,上面那个hInstance使用匈牙利命名法命名的。Hwnd仍旧是是这个机理,wnd是window的简写,H仍旧是句柄的开头。而Handle就只是delphi里面的一个变量而已。
      

  8.   

    获取地址入口。可能汇编最好用了。其实只有一种方法,找出目标所占内存的大小。顺着往下搜索。就拿kernel.dll作为例子。我这里有一个例子程序。我上传到我的ftp然后给你。
      

  9.   

    对了,有关程序的入口地址,好像有更简便的方法。用api函数就可以。前一阵子想着做一个类似spy++的玩意的。忘记了……另外,第四点里面,多进程?还是多线程?内存合并?我也忘了。嘿嘿,原谅我,看过去了解了就够了,我不想记住这个东西。
      

  10.   

    我给你看一段别人的解释,你评价一下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就是对象指针的引用。
      

  11.   

    解释句柄啊。嗬嗬,还是看Msdn比较好。可是你的问题有点幼稚,其实都是变量而已。
      

  12.   

    4:dll载入内存后的地址如何计算,多进程调用下的情况又是怎样的。
    1:如何计算程序的载入地址。
        这个问题在操作系统里有说明
        在程序调入时,由操作系统安排空闲的内存,分配一定大小的空间,将程序里的地址改为相对于装载时的地址(即相对地址),如果在调入内存时内存使用完了,还要根据一定的算法将内存的数据调出内存,再将你的程序装入内存.不过究竟程序载入的地址是多少,只有操作系统才知道,这个地址在每次重新启动程序里都不一样.程序员也不必去关心载入地址是多少,除非你是作操作系统.
       Dll载入内存和程序一样,在多个进程调用时各自将一个COPY到自已的进程空间,如果有静态变量则大家共享.
    2:内存在合并的时候对地址有什么影响。
        内存在合并时对地址没有影响,合并内存不外乎是将不用的内存交由操作系统管理,不管是内存碎片还是程序退出后空出的内存.在下次启动程序时合并的内存就是一个连续的空间.3:handle和hinstance的真正含义,产生的依据。
        handle是一个句柄,句柄是什么,说穿了它就是资源.在VC里,这此东西要好好利用.
        hInstance也是一个句柄,不过它只是一个程序标识的资源,也就是楼上所说有,它是场景资源
    不过我要说HINSTANCE 它不是变量,它是一个类型.
      

  13.   

    原谅我不是学计算机的,这些底层的东西我了解的仅限于高程考试资料上的那点。
    msdn上哪里有啊,我可能没找对地方,你找找呢。
      

  14.   

    HWND=Handle of window;
    handle  句柄
    hInstance 是应用程序的句柄。
    具体也不清楚了:)
      

  15.   

    >>程序员也不必去关心载入地址是多少,除非你是作操作系统.你说的不太对哦,除非是做病毒的。要是做病毒的,当然要关心这个。嘿嘿。其他的都好,比我说得好。:〉
      

  16.   

    另外。HINSTANCE是一个类型,哈哈,这个我都忘说了。另外补充:HWND也是一个类型……
      

  17.   

    另外:对于videohome的说法。我还是坚持是变量。怎么说呢?hInstance只是一个习惯用法而已。定义成其他的照样也能返回场景句柄。另外,对于 peiweiwei(一指残) 的问题……嘿嘿,你如果在delphi板块问Handle,大部分人都会告诉你是Application的句柄,变量。如果你在其他板块问,他们会给你解释句柄的含义。你到底需要哪个?
      

  18.   

    to:videohome() 
    你的意思是说每个进程都有一个dll的copy嘛?是整个的copy还是部分?
    我一直觉得dll的调用是通过文件映射来实现的。
      

  19.   

    我要的是OpenProcess能打开的那个。也就是句柄的含义了。
      

  20.   

    .exe文件加载地址一般都是00400000处,这是又系统完成定位的。在.exe文件头中也有这么一项,ImageBase,建议文件载入地址。通常.exe是不需要重定位的,但是dll不同,它的加载地址常常不是ImageBase,要重新定位。而这个过程也是系统完成的;我们操作的地址多是虚拟地址,所以内存合并不会影响,还是又系统处理;handle和hinstance就不多说了,说不清楚......计算加载地址其实很简单,GetModuleHandle返回的就是加载模块的地址;若参数是.exe文件,那么一定返回00400000了。dll则返回其加载实际地址。多个进程加载同一dll,其地址一般不会相同。
    病毒代码一般没有导入函数,要调用api就要找kernerl32.dll的基地址,那也多是通过PE文件头格式暴力搜索。
      

  21.   

    多个进程加载同一dll,其地址一般不会相同。
    既而不同,病毒代码找kernerl32.dll的基地址,又怎么能确定呢?
      

  22.   

    我看到李维写的一篇文章里提到,dll的全局变量是在每个进程里都有一个copy的。那么是否意味着代码部分是各个进程共有的呢?
      

  23.   

    代码部份是共有的,因为每个进程都有自已的4GB空间,所以它们看起来是独立的,但在内存里只有一份代码,这部分被映射到每个进程的不同空间,看起来就像是每个进程都有一个COPY一样.静态变量是共享的,所有进程都共享一个静态变量.