我知道某一进程的进程号、句柄之类的所有参数,也知道这个进程中的函数的地址和函数原型,我如何在进程外调用该进程的这个函数??100分相送

解决方案 »

  1.   

    如果是GUI进程可以用钩子查入一个DLL到进程中去。然后调用函数,将结果返回就行了。
    如果是2000的系统可以用CreateRemoteProcess查入DLL。
      

  2.   

    up~~~ 另~~~~ up者有分~!!!!!!!!!!!!!!!!!!!!!!!!
      

  3.   

    yndfcd(YNDFCD)说的办法完全正确,不这么麻烦不行啊,跨地址空间啊
      

  4.   

    to logdzc(永远的步行者)、yndfcd(YNDFCD) 
    能说的具体一点吗??不胜感激!!
      

  5.   

    ReadProcessMemory() and WriteProcessMemory() could read and write the specified
    process's memory.
      However I don't know how to call the function.
      Maybe you could inject a dll into the remote process ,hijack the api calling,
    during the api call,you call your desired function in the remote memory space,then
    store the result using a varible.
       This varible is allocated in the remote process space,however there seems to exist a API to achieve this.(exteranl process call it to allocate some memory space in the remote process space)
       The you could use ReadPrecessMemory() to get the variable which stores the 
    result from the remote process.
       This is just my imagination.However I think it may workable .
      

  6.   

    两种理解:
    1,你想运行对方的函数,也就是让已经运行的DLL在你的进程空间执行,
       那你就直接调用他的DLL.
    2,你想让对方的进程Call你的函数,
       两种情况:(1)如果哪个进程是你写的,或他提供了接口(例如BHO),可以SendMessage.
                 (2)如果不是,那我认为不可能实现,我的理由是
                      如果可以,那BO就不用用Server了,只要让IE Call他的Function就行了
                      也就是说,你没用控制那个进程的权限(可能你可以TerminateProcess)
    个人猜测,仅供参考
      

  7.   

    to changbaohua(changbao)
    exe是我写的 dll也是我写的,我现在要用exe调用dll,在dll中回调exe中的某个函数,不要消息,我想通过地址调用,不知这样是否可行??
      

  8.   

    在插入DLL中首先用GetModuleHandle得到要调用的函数所在的模块的句柄。然后GetProcAddress得到函数的位置,调用函数,将结果跨进程共享就行了。当然如果结果是一个很简单的值可以用发消息的方式传回来。
      

  9.   

    exe是vb做的,所以无法导出函数,所以在dll中也就无法用GetProcAddress取得exe中函数的地址,我的做法是exe调用dll时,将函数地址做为参数传给dll,dll再回调exe中的这个函数,但是程序崩掉了 :(
      

  10.   

    呵呵,你那样做程序不崩掉就见鬼了。你传的函数地址在你的地址空间有效,其他的无效阿。
    既然exe和dll都是你写的,最简单的办法就是用消息传递信息
    在dll中把函数参数放入共享区,发送消息,
    exe接受消息后,用共享区的数据作参数执行调用,再把结果放回共享区,然后dll使用数据。
    就这样,很简单阿。
    而且,如果你的参数和返回值都非常简单,完全用消息传递,就更简单了
      

  11.   

    to logdzc(永远的步行者) 
    出于种种原因,我不能用消息,否则是很简单,不用消息能有别的办法吗?
      

  12.   

    Exe:
    int a() {
      return 1;
    }
    Dll:
    int b( int (*fun)() ) {
      fun();//It's equal a() in EXE
      return 1;
    }
    你要的是这个么?
      

  13.   

    to changbaohua(changbao)
    我试过 但崩了 :(
      

  14.   

    可以去参考《Windows核心编程》上面关于这方面的解释!
      

  15.   

    可以在exe中单独启动一个线程,等待一个event对象,在dll中通知该事件对象。
    这样就起到了消息传递的作用
    其他数据传递的方法,跟我上面说的一样
      

  16.   

    如果你只在自己的exe中调用dll,没有把dll插入其他的进程,那么你说的方法可行
      

  17.   

    无法用GetProcAddress
    又不能用消息~好象实现起来不可能既然那个程序是你做的,你可以把那个函数放到dll中
    然后两个程序一起调用dll中的函数不很方便,而且可以用共享数据段共享数据