lpView1=(LPTSTR)MapViewOfFile(hMapfile1,FILE_MAP_WRITE¦FILE_MAP_READ,0,0,0);
//lpView1----私有LPTSTR型变量,在CMapfileDlg类中定义
if((BYTE*)lpView1!=NULL) //注意:第一次运行时lpView1并没有被写入,该值为NULL,应此
//下面的语名永远不会被执行,当然你什么都得不到
{
// mDlg-----CMapfileDlg* mDlg,在CMapfileDlg类中定义
::GetWindowText(::GetDlgItem(mDlg->m_hWnd,IDC_DATA),lpView1,4*1024);
UnmapViewOfFile((LPVOID)lpView1);
}

解决方案 »

  1.   

    // mDlg-----CMapfileDlg* mDlg,在CMapfileDlg类中定义
    ::GetWindowText(::GetDlgItem(mDlg->m_hWnd,IDC_DATA),lpView1,4*1024);
    是放在OnCreate中的哪时IDC_DATA(应该是个EDIT吧)还什么都没有呢
    改为strcpy(lpView1,"asdfasdfasdfasdfasdfasfdasf");你会得到正确的结果
    不是因为lpView1为空而执行不到!
    BTW:
    不过在同一个进程中用内存映射文件没有意义呀?
      

  2.   

    首先请愿谅我刚才犯的错误,真搞不明白你是怎么TRACE的,以上代码一点问题都没有
    下面是我的实现,你只需建一个对话框程序,加入两个EDIT,两个BUTTON,将下面的代码
    加入就可执行,一点问题没有,还不行我可把代码发给你 :-)
    void CTttDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    // hMapfile1----私有HANDLE型变量,在CMapfileDlg类中定义
    hMapfile1=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,4*1024,"SSS");
    if(hMapfile1!=NULL)
    {
    if(GetLastError()==ERROR_ALREADY_EXISTS)
    {
    AfxMessageBox("内存映射文件已经存在!",MB_OK);
    CloseHandle(hMapfile1);
    }
    else
    {
    lpView1=(LPTSTR)MapViewOfFile(hMapfile1,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
    //lpView1----私有LPTSTR型变量,在CMapfileDlg类中定义
    if((BYTE*)lpView1!=NULL)
    {
    // mDlg-----CMapfileDlg* mDlg,在CMapfileDlg类中定义
    ::GetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT1),(char*)lpView1,4*1024);
    UnmapViewOfFile((LPVOID)lpView1);
    }
    }
    }
    else
    {
    AfxMessageBox("不能建立内存映射文件!",MB_OK);
    }
    }void CTttDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    HANDLE hMapfile;
    LPTSTR lpView; hMapfile=OpenFileMapping(FILE_MAP_READ,FALSE,"SSS");
    if(hMapfile!=NULL)
    {
    lpView=(LPTSTR)MapViewOfFile(hMapfile,FILE_MAP_READ,0,0,0);
    if((BYTE*)lpView!=NULL)
    {
    ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT2), lpView);
    UnmapViewOfFile((LPVOID)lpView);
    }
    else
    {
    AfxMessageBox("不能映射文件(size=0)!",MB_OK);
    }
    CloseHandle(hMapfile);
    }
    else
    {
    AfxMessageBox("不能打开映射文件!",MB_OK);
    }
    }
      

  3.   

    首先感谢leer兄给我的示例,我的错误在于::GetDlgItem(mDlg->m_hWnd,IDC_DATA)中的mDlg->m_hWnd,将其改为m_hWnd后,一切正常。mDlg是对话框窗口的指针,在CMapfileDlg类中定义为:CMapfileDlg* mDlg,是public型。mDlg->m_hWnd为什么不行,而m_hWnd为什么行?它们各自代表的究竟是什么?能否指点一二。
    另外,还要感谢adrianx兄能够给我回信,我主要想接触有关函数,在一个进程中实验可节省不少时间。
      

  4.   

    首先,我不清楚你的mDlg的值是怎么搞来的,是否正确。其实完全没有必要搞这么复杂,
    m_hWnd表面上看起来是孤零零的,其实不然,编译器在编译时会在它前面加一个this指针,
    即this->m_hWnd, this的值就是你想要而没得到的指向对话框窗口的指针。
    看来你的C++还没过关,建议你赶快去买一本《Thinking in C++》。我现在正读第二
    遍呢,把它搞懂再学MFC那简直是小菜一碟。