请看:
我的exe文件,文件名dllexe:
extern "C" _declspec(dllexport) int add(int a,int b)
{
return a+b;
}
int main()
{
printf("a+b=%d\n",add(2,6));
getchar();
return 0;
}然后另外一个程序加载:
int main()
{
typedef int (*FUN)(int,int);
FUN fun;
         HMODULE hmod=LoadLibrary("dllexe.exe");
         if(NULL==hmod)
{
printf("error load\n");
return -1;
}
         fun=(FUN)GetProcAddress(hmod,"add");
        if(NULL==fun)
{
printf("error GetProcAddress\n");
return -1;
}
int sum=(*fun)(18,22);
printf("sum=%d\n",sum);
FreeLibrary(hmod);
getchar();
return 0;
}请问:当我的dllexe文件的动态库运行时,加载程序是如何加载它的?(因为它们是两个进程)

解决方案 »

  1.   

    只有dll才能被加载到自己的地址空间。exe肯定不行。
      

  2.   

    LoadLibrary加载exe文件不会创建新的进程,而是加载到当前进程的地址空间,这样加载的exe是干不了什么的,因为入口点不会执行,重定位,导入表也不会被处理,如果你仅仅是想从里面取资源数据还是可以的
      

  3.   

    LoadLibrary加载exe应该是可以的,这时候EXE和普通的DLL没有区别
      

  4.   

    列宁大侠,你的意思就是说:加载exe 可以获取资源?怎么样获取?举个例子,比如这个exe里面有个对户框,我貌似无法用到它把?还有难道只有加载 dll,这个dll才能创建一个进程,然后映射到调用它的程序的地址空间里?
      

  5.   

    我是先运行这个exe文件,然后再LoadLibrary加载exe文件,请问加载的exe文件是不是运行的exe文件,还是从磁盘重新读取并加载exe文件?
      

  6.   

    LoadLibrary自己不会创建进程
    如果加载的是dll,则可以运行dll的入口点,如果加载的是exe,则仅仅是建立文件映射,不执行代码
    但是可以读取exe的资源,比如exe里面有个对话框资源就可以把它用于DialogBoxParam
      

  7.   

    如果LoadLibrary自己不会创建进程,那么进程外的组件怎么理解呢?
      

  8.   

    进程外的组件?
    加载的dll可能会创建进程,但这不关LoadLibrary的事
      

  9.   

    LoadLibrary只是将DLL的地址空间加载到调用进程里啊
      

  10.   

    LoadLibrary仅加载PE镜像到本进程空间,是windows提供的系统功能。
    “进程外的组件”是com的重要部分,它是通过相关com相关服务实现的。
    所以它们是两个不同层次上的概念,如果非要说有什么关系的话,那只能说,"进程外的组件"运行的时候会需要用调用LoadLibrary这个系统函数。PS:请回答 雷锋跟雷锋塔是什么关系?
      

  11.   

    exe 是可以加载的,加载自身的话需要短文件明,否者LoadLibrary返回值跟程序GetModuleHandle值是一样的,就是说不会重复加载同一个文件