看你知道不知道之-为进程内部件设置基地址

在用Project Analyzer 进行一个VB6的Dll工程进行代码分析的时候得到这么一个警告:

Problem description - WFWKernel
 
Base address unoptimal: WFWKernel
 
Type      Optimization
Severity  Warning
Location  WFWKernel.vbp
 
Description
 
A library project's base address is set to the default value (&H11000000) in project options. When loading the library, the operating system tries to load it at this address. If not possible, it relocates the library. Changing this address to another value will help to reduce the likelihood of relocation, thus making the library load faster. The base address affects ActiveX OCX, ActiveX DLL and .NET Class Library projects. Notice that in .NET projects, different configurations (Debug/Release) can have different base address values. The rule works on the currently selected configuration.
 
Project Analyzer 7.0.05 (2006-2-13)

这是什么原因呢?什么是Base address unoptimal警告呢?

MSDN解释如下:

为进程内部件设置基地址

在 32 位的操作系统中,只要部件被加载在它的基地址上,使用部件的各个进程就可以共享进程内部件(.dll 或 .ocx 文件)的代码页。这样,可以有三个客户应用程序使用部件中的控件,而代码只需向内存中加载一次。
相反,如果进程内部件使用的内存地址与另一个进程内部件或可执行程序的使用内存地址发生了冲突,部件就必须被重定基址到可执行进程空间的另一个逻辑内存位置。
重定基址需要操作系统动态地重新计算代码和数据加载的逻辑内存位置。这种重新计算会减慢进程的加载,而被动态重定位的代码一般不能被可执行文件共享。
合理选择基地址,可以极大地改善部件对内存的使用。

设置基地址

要输入部件的基地址,打开“工程属性”对话框,然后选择“编译”选项卡。在“DLL 基地址”框中以无符号的十进制或十六进制整数输入地址。
缺省值是 &H11000000 (285,212,672)。如果不改变这个值,部件会与每个使用缺省值编译的进程内部件冲突。建议使用远离这个地址的基地址。
选择基地址
在 16M (16,777,216 或 &H1000000) 字节和 2G (2,147,483,648 或 &H80000000) 字节之间选择基地址。
基地址必须是 64K 的倍数。部件使用的内存从初始基地址开始,大小为编译了的文件大小四舍五入为 64K 的倍数。
程序不能大于 2G,因此,最大的基地址实际上是 2G 字节再减去部件使用的内存大小。
注意 可执行文件一般加载在 4M 字节的逻辑地址处。小于 4M 字节的区域是保留给 Windows 95 的,而 2G 以上的区域是保留给 Windows 95 和 Windows NT 的。

使用良好的随机数生成器

由于无法知道用户使用的其它进程内部件会选择什么基地址,所以,最实用的办法就是在指定范围内随机地选择一个地址,并四舍五入为 64K 的倍数。
如果公司制作了很多进程内部件,为第一个部件随机计算基地址,其它部件的地址远离第一个部件地址。这样,至少一个公司的部件就不会有内存冲突问题了。

呵呵,原来如此,但是有多少人在做DLL的时候处理基地址了呢?还有几个人做代码检查的时候使用P7呢?

你可能感兴趣的:(windows,.net)