C++ CreateProcess和MapViewOfFile存在很多问题

C++ CreateProcess和MapViewOfFile存在很多问题,c++,multithreading,visual-studio-2010,C++,Multithreading,Visual Studio 2010,它已经困扰我好几个小时了,我解决不了这个问题 到目前为止,我一直在编码,没有太多问题。我的任务是通过循环文件将消息从一个进程发送到另一个进程。消息由第一个进程中的一个线程生成,通过共享内存发送到此进程中的另一个线程,然后该线程将此消息发送到单独的进程。我能够创建子进程并向它发送一些消息,但是当我开始实现信号量以生成循环文件时,事情就变得糟糕了 代码很重,虽然我使用C++,但它是结构化的,有点难以理解,还有一点混乱。一旦我做对了,我就开始清理它 这是进程1中的线程a: DWORD WINAPI S

它已经困扰我好几个小时了,我解决不了这个问题

到目前为止,我一直在编码,没有太多问题。我的任务是通过循环文件将消息从一个进程发送到另一个进程。消息由第一个进程中的一个线程生成,通过共享内存发送到此进程中的另一个线程,然后该线程将此消息发送到单独的进程。我能够创建子进程并向它发送一些消息,但是当我开始实现信号量以生成循环文件时,事情就变得糟糕了

<>代码很重,虽然我使用C++,但它是结构化的,有点难以理解,还有一点混乱。一旦我做对了,我就开始清理它

这是进程1中的线程a:

DWORD WINAPI StRetFunc(LPVOID id)
{
    LONG LPrevCount;
    HANDLE pFile;
    HANDLE pSent;
    HANDLE pRecieved;
    char* pImage;
    BOOL endThread = false;

    unsigned int pPos=0;
    BOOL bStatus;
    STARTUPINFO si;         // StartUpInformation for new process
    PROCESS_INFORMATION NewProcess; // New Process infos

    pFile = CreateFileMapping(
        (HANDLE)0xFFFFFFFF,
        NULL,
        PAGE_READWRITE,     // access type
        0,                  // dwMaximumSizeHigh
        BYTE_TAM_ARQ,                   // dwMaximumSizeLow
        (LPCWSTR) "CircFile");          // name

    check(pFile, "Cannot open file.");

    pSent = CreateEvent(NULL, TRUE, FALSE, (LPCWSTR) "SentMSG");
    check(pSent, "Cannot create event SentMSG (pSent).");

    pRecieved = CreateEvent(NULL, TRUE, FALSE, (LPCWSTR) "RecievedMSG");
    check(pRecieved, "Cannot create event RecievedMSG (pRecieved)");

    cout << "Handles created\n";

    LPWSTR szCmdline = _tcsdup(TEXT("..\\Debug\\ATR TP - LS.exe"));
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si); // Tamanho da estrutura em bytes
    si.dwFlags = CREATE_NEW_CONSOLE;

    bStatus = CreateProcess(
        szCmdline , // Nome
        NULL,   // linha de comando
        NULL,   // atributos de segurança: Processo
        NULL,   // atributos de segurança: Thread
        FALSE,  // herança de handles
        CREATE_NEW_CONSOLE, // CreationFlags
        //NORMAL_PRIORITY_CLASS,
        NULL,   // lpEnvironment
        NULL,   // diretório corrente do filho
        &si,            // lpStartUpInfo
        &NewProcess);   // lpProcessInformation
    check(bStatus, "Impossivel criar processo: %s", DecodeError());

    while(WaitForSingleObject(hEvent_Esc, 0) != WAIT_OBJECT_0) {
        CheckFreezeEvent(stretEvent, "Retira Status");
        WaitForSingleObject(stretSemaphore, INFINITE);
        {
            do {

                while(circ_mem[stret_index].empty() == true)
                        ++stret_index %= MAX_LISTA_CIRC;
                while(memrdy[stret_index] == false);
                if(circ_mem[stret_index].substr(7, 3) == "000")
                    break;
                else
                    ++stret_index %= MAX_LISTA_CIRC;

                if(WaitForSingleObject(hEvent_Esc, 0) == WAIT_OBJECT_0) {
                    endThread = true;
                    break;
                }
                if(WaitForSingleObject(stretEvent, 0) != WAIT_OBJECT_0)
                    CheckFreezeEvent(stretEvent, "Retira Status");

            } while(true);
            if(endThread) break;
            CheckFreezeEvent(stretEvent, "Retira Status");
            cout << "Status Retirado: " << circ_mem[stret_index] << " Na posicao: " << stret_index << "\n";

            //WriteToFile

            pImage = (char*) MapViewOfFile(
                pFile,
                FILE_MAP_WRITE,
                0,
                0,
                35);

            strcpy(pImage, circ_mem[stret_index].c_str());
            SetEvent(pSent);
            while(WaitForSingleObject(pRecieved, 0) != WAIT_OBJECT_0 ) {
                if(WaitForSingleObject(hEvent_Esc, 0)) break;
            }
            ResetEvent(pRecieved);

            circ_mem[stret_index].clear();

            memrdy[stret_index] = false;
            ReleaseSemaphore(iSemaphore, 1, &LPrevCount);
        }
    }

    cout << "Encerrando Thread Retirada Status\n";
    CloseHandle(pFile);
    CloseHandle(pSent);
    CloseHandle(pRecieved);

    return(0);
}
DWORD WINAPI stretcfunc(LPVOID)
{
长对数;
处理文件;
处理pSent;
处理谨慎;
char*pImage;
BOOL-endThread=false;
无符号整数pPos=0;
布尔状态;
STARTUPINFO si;//新流程的StartUpInformation
进程信息NewProcess;//新进程信息
pFile=CreateFileMapping(
(句柄)0xFFFFFFFF,
无效的
页面\读写,//访问类型
0,//dwMaximumSizeHigh
字节\u TAM\u ARQ,//dwMaximumSizeLow
(LPCWSTR)“CircFile”);//名称
选中(pFile,“无法打开文件”);
pSent=CreateEvent(NULL、TRUE、FALSE,(LPCWSTR)“SentMSG”);
选中(pSent,“无法创建事件SentMSG(pSent)”;
pRecieved=CreateEvent(NULL、TRUE、FALSE,(LPCWSTR)“receivedmsg”);
勾选(pRecieved,“无法创建事件ReceiveDMSG(pRecieved)”;

cout对于任何对正在发生的事情感到好奇的人,我试图通过
si.dwFlags
创建一个新的控制台。但是,位设置
si.dwFlags=create_new_console;
不是由MSDN定义的,因此它不是一个有效的配置。我的猜测是它弄乱了一些有关IPC内存访问的相关寄存器,因此,通过文件映射将句柄的打开和共享内存的实际使用都搞乱了

正确的方法是在
CreateProcess
内部设置
CREATE\u NEW\u控制台
,就像最初发布的那样:

bStatus = CreateProcess(
    szCmdline , // Nome
    NULL,   // linha de comando
    NULL,   // atributos de segurança: Processo
    NULL,   // atributos de segurança: Thread
    FALSE,  // herança de handles
    CREATE_NEW_CONSOLE, // CreationFlags
    //NORMAL_PRIORITY_CLASS,
    NULL,   // lpEnvironment
    NULL,   // diretório corrente do filho
    &si,            // lpStartUpInfo
    &NewProcess);   // lpProcessInformation
check(bStatus, "Impossivel criar processo: %s", DecodeError());

如果您不确定如何更新,请避免使用
dwFlags

update。它开始工作了,但我想这会弄乱我的代码
si.dwFlags=CREATE\u NEW\u CONSOLE;
bStatus = CreateProcess(
    szCmdline , // Nome
    NULL,   // linha de comando
    NULL,   // atributos de segurança: Processo
    NULL,   // atributos de segurança: Thread
    FALSE,  // herança de handles
    CREATE_NEW_CONSOLE, // CreationFlags
    //NORMAL_PRIORITY_CLASS,
    NULL,   // lpEnvironment
    NULL,   // diretório corrente do filho
    &si,            // lpStartUpInfo
    &NewProcess);   // lpProcessInformation
check(bStatus, "Impossivel criar processo: %s", DecodeError());