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