SDK中有关模块句柄(hInstance),窗口类,窗口句柄的困惑!该如何处理

SDK中有关模块句柄(hInstance),窗口类,窗口句柄的困惑!!
(1)进程本身的模块句柄(hInstance)一般为0x400000,而DLL模块的缺省句柄为0x10000000。这里的句柄是否就是虚拟地址???,如果一个进程同时调用几个DLL模块,而这几个DLL模块都采用缺省句柄0x10000000,岂不是最终虚拟地址乱了???(或者是如何避免的)
(2)注册窗口类(RegisterWindow)的hInstance,以及创建的窗口实类(CreateWindow)的hInstance,又是什么?(2)的hInstance与(1)有关系吗??
另外(2)的hInstance是否需要唯一的(对于OS而言),还是对于本进程唯一就可以了??
请大师指点!!不胜感激!!!

------解决方案--------------------
1. 加载到进程地址空间的每个可执行文件或DLL文件均被赋予一个独一无二的实例句柄
Windows核心编程 P49
------解决方案--------------------
可是如下代码
int main(int argc, char* argv[])
{
HINSTANCE hDll;
lpAddFun addFun;
hDll=LoadLibrary( "..\\..\\dllTest\\Debug\\dllTest.dll ");////这里的hDll调试发现永远0x10000000
addFun=(lpAddFun)GetProcAddress(hDll, "_add@8 ");
int result=addFun(2,3);
printf( "%d ",result);
FreeLibrary(hDll);
return 0;
}
------解决方案--------------------
(1)进程本身的模块句柄(hInstance)一般为0x400000,而DLL模块的缺省句柄为0x10000000。这里的句柄是否就是虚拟地址???,如果一个进程同时调用几个DLL模块,而这几个DLL模块都采用缺省句柄0x10000000,岂不是最终虚拟地址乱了???(或者是如何避免的)

HINSTANCE正是PE被加载的虚拟地址。
DLL模块是可重定位的,当0x10000000已经有模块占用的时候,系统会将其加载到另外合适的地址中。
你可以将同一个DLL复制一份试一试。
hDll1=LoadLibrary( "..\\..\\dllTest\\Debug\\dllTest1.dll ")
hDll2=LoadLibrary( "..\\..\\dllTest\\Debug\\dllTest2.dll ")//其中dlltest1.dll 与dlltest2..dll是同一个文件的不同副本,这你就会发现hDll1与hDll2不同了。
(2)注册窗口类(RegisterWindow)的hInstance,以及创建的窗口实类(CreateWindow)的hInstance,又是什么?(2)的hInstance与(1)有关系吗??
HINSTANCE就是模块句柄嘛,在同一个进程中注册窗口的hInstance与创建窗口的hInstance可以不同,比如在exe中注册一个窗口类,而在这个进程中的一个dll里面用这个类创建窗口,dll则创建窗口时的hInstance应该是dll的模块句柄。