跨进程传递字符串(数据)的一点心得

来源:互联网 发布:法国 衰落知乎 编辑:程序博客网 时间:2024/06/13 03:46

想用发送自定义消息的方式跨进程传递字符串,尝试过并失败的方法有:

1, new一个CString

2, TCHAR 数组

3, API GlobalAlloc()

皆因为分配的内存都在发送方进程的heap内

这里使用GlobalAlloc()也失败的原因是,在win32内,该函数与LocalAlloc()已没有分别,但好像如果不使用GMEM_FIXED参数,而是GMEM_MOVEABLE就可以跨进程?因为此时返回的是一个handle,而非指针,需要用GlobalLock()才能从这个handle得到真正的指针,没试过,不知真假

最后我用的方法是使用映射文件,创建一个全局的名字即可,

发送方:

        HANDLE hSendFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 096"DelDeveiceDataMap");
        
if (hSendFileMap)
        
{
            pApp
->pDelDeviceEntity = (pDEL_DEVICE_ENTITY)MapViewOfFile(hSendFileMap, FILE_MAP_WRITE, 000);
            
if (!pApp->pDelDeviceEntity)
            
{
                CloseHandle(hSendFileMap);
                hSendFileMap 
= NULL;
                Global_Log.LogError(
"create file mapping error", LOGGER_ERROR_TYPE_GENERAL);
            }

        }


        
if (pApp->pDelDeviceEntity)
        
{
            
//-- use 37 here to enforce to add '

 

接收方

 

        pDEL_DEVICE_ENTITY pDelDeviceEntity;
        HANDLE hRecFileMap 
= ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY, 096"DelDeveiceDataMap");
        
if (hRecFileMap)
        
{
            pDelDeviceEntity 
= (pDEL_DEVICE_ENTITY)::MapViewOfFile(hRecFileMap, FILE_MAP_READ, 000);
            
if (!pDelDeviceEntity)
            
{
                CloseHandle(hRecFileMap);
                hRecFileMap 
= NULL;
                Global_Log.LogError(
"receive file mapping error", LOGGER_ERROR_TYPE_GENERAL);
                
return(1);
            }

        }


            TCHAR s[
37], b[37];
            _tcsncpy(s, pDelDeviceEntity
->delMapID, 37);
            _tcsncpy(b, pDelDeviceEntity
->delDeviceID, 37);

 

当然,还可以使用WM_COPYDATA,WM_SETTEXT等消息事件机制,但这样就还得再写个事件响应函数,有点麻烦

原创粉丝点击