VC.NET写的MFC程序,程序初始化时,CreateFileMapping建立了一个共享内存区域用来通信。有个OnTimer函数,我在里面建立新的对象,其类型为我自己定义的一个结构体,对其一个整数元素赋值,然后写进共享内存。另有一个VC.NET写的带MFC的控制台程序SharedMemTestReciever,用同样的自定义结构体,从该共享内存中读取数据,却总是读不到,很奇怪。之前做了个SharedMemTestSender,与SharedMemTestReciever通信,用同样的方法,是成功的。
难道用在OnTimer里面有什么说道吗?另外我用的一个别人封装好的类,来实现文件映射的内存共享通信。

解决方案 »

  1.   

    应该与ontimer 没什么关系,你把可以正常使用的加上ontimer试试看
      

  2.   

    我想可能是CreateFileMapping没有成功,如果没有对应文件,只是create了一个空的filemap, 写不了当然也读不到
      

  3.   

    有一个类
    class   CFileMapping    
    {  
    public:  
    CFileMapping();  
    ~CFileMapping();   //   Operations  
    bool   Initialize(LPCTSTR,   int);  
    void   Write(char*);  
    void   Read(char*&);
    void   Dispose();private:  
    HANDLE   m_hFileHandle;  
    LPVOID   m_pViewOfFile;  
    int   m_nFileSize;  
    };  实现内存共享文件的操作有自定义的结构体:typedef struct tagRECTANGLE {
    int x1; //起点横坐标
    int x2; //终点横坐标
    int y1; //起点纵坐标
    int y2; //终点纵坐标
    } RECTANGLE;typedef struct tagMYSTRUCT { 
    RECTANGLE rect;
    BITMAP image;
    HBITMAP pImage;
    } FRAME;程序初始化时先调用m_myFileMapping.Initialize((LPCTSTR)"pipe",sizeof(FRAME))(成员变量m_myFileMapping是CFileMapping的),就先建立好了共享区域然后在OnTimer里面,
    FRAME *m_pFrame=new FRAME();
    m_pFrame->rect.x1=1000;
    m_FileMapping.Write((char*)m_pFrame);可是在SharedMemTestReciever里面却读不到以上方法在SharedMemTestSender里面用了,基本一样,唯一不同的就是没有用OnTimer,而是一个按钮,点击后:for(int i=0;i<32000;i++)
    {
    FRAME *data=new FRAME();
    data->rect.x1=i;        if(m_FileMappingInitialed)
    m_myFileMapping.Write((char*)data); delete data;
    }循环的每一个数值SharedMemTestReciever都收到了
      

  4.   

    太郁闷了,我在SharedMemTestSender中添加了OnTimer,一切正常。可在那个真正要用的程序里就不行……void CSharedMemTestSenderDlg::OnTimer(UINT_PTR nIDEvent)
    {
    // TODO: 在此添加控件通知处理程序代码
    FRAME *data=new FRAME();
    data->rect.x1=m_nTimeCounter; if(m_FileMappingInitialed)
    m_myFileMapping.Write((char*)data);
    delete data; m_nTimeCounter++; CDialog::OnTimer(nIDEvent);
    }
      

  5.   

    终于知道是什么问题了~两个进程用的字符集不同,导致建立共享内存文件映射时,虽然取名都叫pipe,但实际上是不一样的……