现在贴上主要代码;#pragma data_seg(".shared")
HHOOK g_hook=NULL;
HWND  g_hwnd=NULL;
Log loguser;
CRITICAL_SECTION  section;
int b=0;
#pragma data_seg()
#pragma comment(linker,"/section:.shared,rws")
struct rizhi
{
  char logchar[100];
};class Log
{
public:
Log();
~Log();
private:
Sunday findstring;
ifstream inputfile;
ofstream outputfile;
list<rizhi> setofchar;//STL里面的链表类型
public:
void AddData(char* str);
void DelData(char* str);
bool load();
bool find(char* str);
bool find(char* str,int);
void DealHead(char*);
void DealTail();
void Show(list<rizhi>&);
void clear();
};
我的DLL是做成钩子的,可能钩了不同的线程;
loguser的内容经常需要修改;但是由于进程间互不影响,以至于修改的效果不能在其他的线程中表现出来;
希望大家给出解决方法;我洗耳恭听;

解决方案 »

  1.   

    你用了stl在dll加载时就需要加载stl库,不知道你的编译选项是使用静态库还是使用动态库,应该使用静态库编译
      

  2.   

    只有全局能共享访问的句柄类型(比如 HWND)或者普通的数据类型(比如int、char[32]等)才能放入共享段。
    共享指针或者类实例是危险且不可靠的。
    所以你的例子中 HHOOK/HWND 可以放在共享段,但 Log/CRITICAL_SECTION 不能放在共享段。
      

  3.   

    共享区中的数据是所有进程共享的,但类对象和指针变量不能放在共享区,另外临界区只能在进程内部使用,也不能放在共享区。
    你可以在共享区中定义一个数组,或者使用文件映射的方式共享数据,在进程间可以传递数组下标或相对偏移量,不能直接传递指针。
    跨进程的线程互斥可以使用命名mutex。
      

  4.   


    这么说我可以用vector<rizhi>这种类型了;
      

  5.   

    vector 也是类,不能放,何况模板更不能放。不是说所有类都不能放,但是任何直接或间接使用了指针的类不能放,因为指针只对当前进程有效。几乎所有系统库提供的封装类都在使用指针。纯粹封装简单类型的类或结构是可以使用的,比如 RECT/SIZE/POINT。有函数虚表的简单类也不行,因为虚表指针也是指针。
      

  6.   

    共享节里只能放一开始就固定大小的,类是可以的,
    但是如果类涉及内存分配的动作,那么就会使该动作不能在其他进程空间里生效。而且,共享节里不能存放进程绑定类型的,比如CRITICAL_SECTION,
    要控制进程间的同步必须使用,内核对象这样才能生效。想在进程间共享复杂一些的数据不要用共享节,用共享内存、管道、套接字之类的都可以。
      

  7.   

    大小可以固定;但是内容可以修改吗;比如说我定义了一个rizhi[100];中间要修改;
    在其他进程会不会出现变化;如果不行的话;我只能考虑管道之类的了;
      

  8.   


    可以,但是改变的内容只能是一级的。比如说int **p[10],里面保存了十个二级指针,你在其他进程可以正确读出十个二级指针的值,但是它们指向的内容可能只有一个进程能正确读取出来。