跨进程传递字符串(数据)的一点心得
来源:互联网 发布:法国 衰落知乎 编辑:程序博客网 时间: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, 0, 96, "DelDeveiceDataMap");
if (hSendFileMap)
...{
pApp->pDelDeviceEntity = (pDEL_DEVICE_ENTITY)MapViewOfFile(hSendFileMap, FILE_MAP_WRITE, 0, 0, 0);
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 '
if (hSendFileMap)
...{
pApp->pDelDeviceEntity = (pDEL_DEVICE_ENTITY)MapViewOfFile(hSendFileMap, FILE_MAP_WRITE, 0, 0, 0);
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, 0, 96, "DelDeveiceDataMap");
if (hRecFileMap)
...{
pDelDeviceEntity = (pDEL_DEVICE_ENTITY)::MapViewOfFile(hRecFileMap, FILE_MAP_READ, 0, 0, 0);
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);
HANDLE hRecFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY, 0, 96, "DelDeveiceDataMap");
if (hRecFileMap)
...{
pDelDeviceEntity = (pDEL_DEVICE_ENTITY)::MapViewOfFile(hRecFileMap, FILE_MAP_READ, 0, 0, 0);
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等消息事件机制,但这样就还得再写个事件响应函数,有点麻烦
- 跨进程传递字符串(数据)的一点心得
- 浅谈跨进程传递的数据
- 跨进程传递数据的做法
- 字符串的一点心得
- 通过WM_COPY进行跨进程数据传递
- CharSequence类型数据跨进程传递
- 求字符串的一点心得
- Android中Parcelable接口跨进程传递复杂数据的应用
- cameraservice如何跨进程传递video数据——service端的主要过程
- cameraservice如何跨进程传递video数据——client端的主要过程
- cameraservice如何跨进程传递video数据——关于Camera类的说明
- VC跨进程数据(结构体)传递-WM_COPYDATA
- android中跨进程数据传递和访问
- Android AIDL Service 跨进程传递复杂数据
- Android AIDL Service 跨进程传递复杂数据
- Android AIDL Service 跨进程传递复杂数据
- Android AIDL Service 跨进程传递复杂数据
- Android AIDL Service 跨进程传递复杂数据
- C# 泛型简介
- Microsoft Windows, VC6.0的字体和背景颜色修改
- 如何用XP自代的远程协助
- C++中对多态的支持
- web.xml
- 跨进程传递字符串(数据)的一点心得
- BaseDAO.java
- RCP中的Plugin.properties不起作用的解决方法
- Java Servlet和JSP教程 11-12-13-
- 使用JFreeChart来创建图表
- BaseHibernateDAO.java
- 如何从N个数中选出最大(小)的n个数?我的想法
- Programming Microsoft Windows with Csharp. Introduction
- ASP.NET中如何防范SQL注入式攻击