读书人

一种解决起动进程传递参数过长的方法

发布时间: 2013-11-02 19:41:10 作者: rapoo

一种解决启动进程传递参数过长的方法

工作中,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;}
工程下载地址

读书人网 >其他相关

热点推荐