假设有两个exe文件,a.exe以及b.exe,通过启动a.exe启动一个进程,在运行过程当中用LoadLibrary把b.exe也装载到内存里面。现在需要运行b.exe里面的入口函数,不过出现了一个问题,好像是代码运行时的一些函数指针的地址值还是用的编译的时候生成的默认地址,没有被fix。dump一下两个文件的头部,它们的默认装载地址都是一样的,运行当中,a.exe被装载到默认地址,b.exe的装载地址发生了改变(不然两个文件的地址重合了),如果b要运行,必须b的地址按照改变了的基地址重新进行修补。装载dll文件这个过程会自动执行,不知道装载exe文件会不会有这个过程?按照前面的现象来说,好像是没有这个过程的。
如果自己对exe里面的一些地址进行修补,好像比较麻烦。哪位大虾知道如何用一个简便的办法让一个进程中可以执行另外一个exe里面的代码?在线等待中......

解决方案 »

  1.   

    把另一个exe当成DLL用,一样的导出函数,导出类?
      

  2.   

    http://www.codeguru.com/Cpp/W-P/dll/article.php/c3649/
      

  3.   

    比如b.exe的文件头里的装载地址为0x400000,它被a.exe装载到内存里,这个地址可能变成0x500000了,这样b.exe代码里面的函数地址都要进行修补,相应的加0x100000。不过用LoadLibrary装载进去好像没有这个过程,所以很容易出现错误。因为一般来说,编译exe文件不会在文件头中产生Base Relocation Directory,这个Directory里面放的是需要进行地址修补的数据,一般来说,dll文件都会有的。
      

  4.   

    exe文件装载金内存有系统完成,需要重定位到一个独立的进程空间中,loadlibrary好像不能对exe重定位到独立的进程空间中
      

  5.   

    Can we call an EXE exported function in an EXE? (from http://www.codeguru.com/Cpp/W-P/dll/article.php/c3649/
    )
    我想问的就是这个问题了阿。
      

  6.   

    要不把exe的功能封装成dll来调用
      

  7.   

    在a.exe中直接用WINEXEC启动b.exe不就可以了啊
      

  8.   

    tommy1981(tommy) ; 在a.exe中直接用WINEXEC启动b.exe不就可以了啊
    那是另外启动了一个进程,我现在想在同一个进程中运行程序。
      

  9.   

    http://blog.vckbase.com/jozu/archive/2005/01/30/2903.html
    看看吧
      

  10.   

    修改a.exe链接选项里头的imagebase,留出空间给b.exe就行了
      

  11.   

    可以将一个作为 COM Server
    或者当 DLL 用了