一种解决启动进程传递参数过长的方法
工作中,QA同学在测试我们程序的时候,发现在XP下,我们的A进程无法启动我们的B进程。而在Win7 64bit系统下功能正常。RD同学调试后,发现我们A进程中使用ShellExcute去启动了B进程(转载请指明出于breaksoftware的csdn博客)
BOOL CTransmitParam::UnPackData(LPVOID lpMem){ BOOL bSuc = FALSE; do { m_dwRecvBufferLength = 0; errno_t e = memcpy_s( &m_dwRecvBufferLength, sizeof(m_dwRecvBufferLength), lpMem, sizeof(DWORD)); if ( 0 != e ) { std::cerr<<"Memcpy_s Failed.The error code is"<<e<<std::endl; break; } if ( 0 == m_dwRecvBufferLength ) { std::cerr<<"FileMapping's size is 0.\n"<<::GetLastError()<<std::endl; break; } m_lpRecvBuffer = new BYTE[m_dwRecvBufferLength]; memset( m_lpRecvBuffer, 0, sizeof(m_lpRecvBuffer)); e = memcpy_s( m_lpRecvBuffer, m_dwRecvBufferLength, (LPBYTE)lpMem + sizeof(DWORD), m_dwRecvBufferLength ); if ( 0 != e ) { std::cerr<<"Memcpy_s Failed.The error code is"<<e<<std::endl; break; } bSuc = TRUE; } while (0); return bSuc;}BOOL CTransmitParam::GetRecvBuffer(const std::wstring& wstrFileMappingName){ if ( NULL != m_lpRecvBuffer ) { return TRUE; } BOOL bSuc = FALSE; do { HANDLE hFileMapping = OpenFileMapping( FILE_MAP_READ, FALSE, wstrFileMappingName.c_str()); if ( NULL == hFileMapping ) { std::cerr<<"OpenFileMapping Failed.The error code is"<<::GetLastError()<<std::endl; break; } LPVOID lpMem = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0); if ( NULL == lpMem ) { std::cerr<<"MapViewOfFile Failed.The error code is"<<::GetLastError()<<std::endl; break; } if ( FALSE == UnPackData(lpMem) ) { break; } UnmapViewOfFile(lpMem); CloseHandle(hFileMapping); bSuc = TRUE; } while (0); return bSuc;}工程下载地址