vc6.0平台下两个mfc界面的内存共用

来源:互联网 发布:开淘宝店怎么设置运费 编辑:程序博客网 时间:2024/06/06 00:26

我只是个菜鸟,平时做的任务大多是改改vc6.0编的界面程序。

有些时候就会有这样的需求,将两个界面合并起来,之前几个月这样的任务,我没有找到方案,就直接把一个重写到另外一个里面去了。

这次的工作是需要在一个串口程序里面实添加实时动画,串口程序负责接收数据,并且想外转发,但同时需要实时显示计算出来的数据。可对于界面动画以及openGL来说,我基本不懂。而任务要求比较急,又不允许我自己来学习。只能找别人的程序,希望嵌入。

于是尝试了直接用一个界面调用另外一个界面。

现在马马虎虎能用,但是还有很多问题。

主界面为别人的动画界面,基本思路就是又主界面调用我的exe,并且开辟内存映射,已达到内存交互,主界面只读取内存中的数据,comm界面负责往内存中实时写数据。

主界面中加入createfilemapping来开辟共用内存空间,然后调用comm程序

ZeroMemory(&pApp->si4,sizeof(pApp->si4));//fills a block of memory with zerospApp->si4.cb=sizeof(STARTUPINFO);BOOL right4=CreateProcess(m_exeFile4, NULL,  NULL,  NULL,  FALSE,  NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,  NULL,//Pointer to an environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process   NULL,//If this parameter is NULL, the new process will have the same current drive and directory as the calling process  &pApp->si4,  &pApp->pi4);if (!right4){AfxMessageBox("Create Filter.exe Process err!\n"); }

然后再comm空间中也打开共用内存,将数据写入其中。

其中关键的函数如下:

BOOL InitialMemory(){    hMemShare=OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,"test");    if (hMemShare==NULL)    {        TRACE("OpenFileMapping ERR!/n");        return FALSE;    }    testOUT=(BYTE *)MapViewOfFile(hMemShare,FILE_MAP_ALL_ACCESS,0,0,32);    if (testOUT==NULL)    {        TRACE("OpenFileMapping ERR!/n");        return FALSE;    }    DataBlock0=testOUT+0;    DataBlock1=testOUT+20;    return TRUE;}int writeMemory(BYTE*Addr,BYTE *WriteResult,ULONG size){if (*(Addr)==0)//表示对方已经将本方要写入数据的这部分内存中上次的数据读完了,因此对方将其置为0,同时证明本方可以写数据{for (int i=0;i<size;i++){*(Addr+1+i)=*(WriteResult+i);}*(Addr)=1;//表示本方已经写完数据了,因此将其标志位置为1,同时也表明对方可以读数据了return 1;}elsereturn 0;}int readMemory(BYTE*Addr,BYTE *ReadResult,ULONG size){    if (*(Addr)==1) //表示对方已经将数据写入到该内存中,本方可也读数据了    {        for (int i=0; i<size; i++)        {            *(ReadResult+i)=*(Addr+i+1);        }        *(Addr)=0;//表示本方已经将该内存中的数据读完了,即对方可以再次在该内存中写数据了        return 1;    }    else        return 0;}


现在的问题是,好像这两个程序除了内存交互还会相互影响。

关键的问题在于当我在调用comm程序后,配置comm的过程中,如果配置波特率出错了,按道理不会影响comm程序的进程,只是不会收到有意义的数,并且写入共享内存,可这样依然会造成主界面卡死。


似乎只有让程序正常跑起来才行。

原创粉丝点击