rt

解决方案 »

  1.   

    还想问问,主程序调用dll的函数后,如果dll的函数发生错误,无法返回,主程序应该如何关闭这个调用??有没有办法啊??
      

  2.   

    #pragma comment(linker, "/SECTION:.SharedVar,RWS")
    #pragma data_seg(".SharedVar") 
    //DLL输出的全局变量
    extern "C" __declspec(dllexport) HWND  gl_hWnd=NULL;
    #pragma data_seg()
    上面把变量放在共享段。
    然后在引出表中引出,就可以共享了,当然还要象函数一样在头文件中申明。
    第二个问题,既然无法返回,你的主程序就会被阻塞。除非你是多线程的,那只会阻塞调用了DLL函数的线程,如果是这样的话,只许终止调用的线程就可以了。
      

  3.   

    如果变量是在DLL中定义的,可以在DLL中写一个函数,返回变量的地址,这样
    EXE就可以通过调用这个函数来访问DLL中的变量了。如果变量是在EXE中定义
    的,同样在DLL中写一个函数,函数可以带一个参数(指针变量),EXE通过调
    用这个函数,将EXE中的变量传递给DLL。
      

  4.   

    YoungBoz(西山月):中止线程,我现在知道的terminatethread不能释放资源,这个是我没法子接受的阿,有什么办法既释放了资源,又能中止线程阿?
      

  5.   

    我想你的线程函数需要进行相关的保护修改, 可以使用类似事件这样的HANDLE进行外部强制退出, 但是一旦发生阻塞就有些麻烦了.
      

  6.   

    把数据放在DLL 的数据共享段,是为了在不同的DLL 的INSTANCE间共享,如果只要求在主程序和一个DLL的INSTANCE间共享,只要输出此变量即可.如果对某一个DLL调用发生了错误,除非此DLL调用本身有解决机制,做为外部调用的你是无能为力的. 譬如: 如一个DLL函数陷入死循环,调用者是无法知道的. 如果DLL有错误处理机制,如EXCEPTION, 那么就简单了,你可以把它当做是一个普通的函数调用,利用其处理机制来处理.一孔之见,仅供参考.
      

  7.   

    我看到一篇文章说用CloseHandle可以释放资源,不知道是真是假,你试试吧。
      

  8.   

    #pragma comment
    设置共享数据段~
      

  9.   

    你可以通过传递指针来完成变量的共享,不过你要自己注意保护内存不会受到破坏,以及保护数据的完整性。
    主程序调用dll的函数后,如果dll的函数发生错误,无法返回的问题是比较难处理的,一般程序就死掉了,这个问题一般有操作系统来协调并关闭线程(进程),不过现在的操作系统这方面的效果还不尽理想。
      

  10.   

    在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。 #pragma data_seg预处理指令用于设置共享数据段。例如:
    #pragma data_seg("SharedDataName")
    HHOOK hHook=NULL;
    #pragma data_seg()
    在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量 将被访问该Dll的所有进程看到和共享。