一个问题:
主程序与DLL的关系(属于不同进程,还是属于同一进程的不同线程,还是其他?)

解决方案 »

  1.   

    没有特定的关系dll可以与主程序在同一进程,也可以不在同一进程,因为dll可以共享,例如user32.dll可以用在各个进程中,而实际上只有一份(只要你没改写该dll中的数据而导致CopyOnWrite的发生)
    user32.dll中的代码也可以在不同的线程中执行exe和dll都是运行的代码而已(当然也包括资源、静态数据等),一个exe也可以启动多次,产生多个进程。
      

  2.   

    对于exe来说 他有一个dll是同一个进程里面的.
    至于多线程,跟dll没啥关系.
      

  3.   

    按理说一个进程调用DLL,则这个DLL属于这个进程.
    可是从DLL向主程序发消息为什么就不成功,老是要用BroadcastSystemMessage()才能发,为什么呢?
      

  4.   

    同一个地址空间没必要发消息,拿着函数地址直接调用就行了,除非你要用PostMessage进行异步处理。
    发送消息可以用SendMessage和PostMessage发送给窗体,或者用PostThreadMessage发送给线程。
    你发送不成功的原因大概是窗体的句柄参数不对,或者窗体的消息映射方法没写对。
      

  5.   

    1、通常情况下DLL是与调用它的程序在一个进程空间,也有例外的情况,那就是DLL注入。
    2、2楼的说法我个人认为是错误的,不同的进程调用相同DLL,不是只有一份。
    3、DLL向程序(包括它的程序)发送消息是不会出问题的,正如5楼所说。
      

  6.   

    1、通常情况下DLL是与调用它的程序在一个进程空间,也有例外的情况,那就是DLL注入。
    Dll注入就是让目标进程主动装载目标dll,目的就是为了可以在同一个地址空间执行自己想要执行的代码。
    2、2楼的说法我个人认为是错误的,不同的进程调用相同DLL,不是只有一份。 
    dll装载用的是内存文件映射,不同的进程装载dll的时候会映射到同一个文件,只是映射到的虚地址可能不同而已,因为是虚模式寻址,所以看起来好像的进程隔离一样。只有当用WriteProcessMemory来更改这些数据的时候,系统为了保持进程的独立性,就会把该模块拷贝一份,作为该进程的专用(因为其中数据被修改了,无法共享了)。
    3、DLL向程序(包括它的程序)发送消息是不会出问题的,正如5楼所说。