进程间通讯--动态库的共享数据
2017-08-13 21:50
381 查看
因为这里是不同的进程同时加载一个动态库,所以要求两个进程的位数必须与dll相同,即只能使32位与32位通讯,64位与64位的通讯。
其中的原理就是:
设置某一块物理内存为“共享读共享写”,对其写的时候就不会触发操作系统的拷贝写。
//Test1.cpp
//Test2.cpp
这里BufferData是用作对比的,ShareData是dll的共享数据段。
遇到问题:
1.使用PECheck检查Test1.exe的时候,发现函数的导入必须是在函数体内调用的时候,函数才会导入!!!
2.关于动态导出的时候有与没有extern "C"的区别。
3.总结关于动态库的三种导出方式。
其中的原理就是:
设置某一块物理内存为“共享读共享写”,对其写的时候就不会触发操作系统的拷贝写。
//Dll.cpp
#include <iostream> #include <windows.h> using namespace std; char __BufferData[MAX_PATH] = "HelloDll"; #pragma data_seg("SHARED") char __ShareData[MAX_PATH] = "HelloDll"; #pragma data_seg() #pragma comment(linker,"/SECTION:SHARED,RWS") extern CRITICAL_SECTION __CriticalSection; _declspec(dllexport) char* GetBufferData() { return __BufferData; } _declspec(dllexport) void SetBufferData(char* BufferData,int BufferLength) { __try { memcpy(__BufferData, BufferData, BufferLength); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("异常\r\n"); return; } } _declspec(dllexport) char* GetShareData() { return __ShareData; } _declspec(dllexport) void SetShareData(char* BufferData, int BufferLength) { EnterCriticalSection(&__CriticalSection); __try { memcpy(__ShareData, BufferData, BufferLength); } __except (EXCEPTION_EXECUTE_HANDLER) { printf("异常\r\n"); } LeaveCriticalSection(&__CriticalSection); return; }
//Test1.cpp
#include <iostream> #include "..\Dll\Dll.h" #pragma comment(lib,"..\\Debug\\Dll.lib") //注意一定要使用函数否则函数不导入 int main() { printf("修改前:%s\r\n", GetBufferData()); printf("修改前:%s\r\n", GetShareData()); SetBufferData("HelloTest1", strlen("HelloTest1")+1); SetShareData("HelloTest1", strlen("HelloTest1")+1); printf("\r\n"); printf("修改后:%s\r\n", GetBufferData()); printf("修改后:%s\r\n", GetShareData()); printf("运行Test2程序\r\n"); printf("Input AnyKey To Exit\r\n"); getchar(); return 0; }
//Test2.cpp
#include <iostream> #include "..\Dll\Dll.h" #pragma comment(lib,"..\\Debug\\Dll.lib") int main() { printf("CopyOnWrite:%s\r\n", GetBufferData()); printf("IPC:%s\r\n", GetShareData()); printf("Input AnyKey To Exit\r\n"); getchar(); return 0; }
这里BufferData是用作对比的,ShareData是dll的共享数据段。
遇到问题:
1.使用PECheck检查Test1.exe的时候,发现函数的导入必须是在函数体内调用的时候,函数才会导入!!!
2.关于动态导出的时候有与没有extern "C"的区别。
3.总结关于动态库的三种导出方式。
相关文章推荐
- Windows 下的进程间通讯及数据共享 - 云风大神这篇文章05年写的,已经那么透彻
- Windows 下的进程间通讯及数据共享
- [转]Windows 下的进程间通讯及数据共享
- Windows 下的进程间通讯及数据共享
- Windows 下的进程间通讯及数据共享
- Windows 下的进程间通讯及数据共享
- Windows 下的进程间通讯及数据共享
- 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这
- WINDOWS 进程间的通讯和数据共享
- Windows 下的进程间通讯及数据共享
- 进程间通讯及数据共享
- Android 跨进程数据共享
- android sharedparence跨进程共享数据
- python多进程并发中,解决数据共享问题Value+Array
- linux 共享内存shm_open实现进程间大数据交互
- C++:共享内存(进程间通讯)(转载)
- 使用DLL在进程间共享数据
- Python multiprocessing.Manager介绍和实例(进程间共享数据)
- 进程间通讯 —— 共享内存
- ContentProvider跨进程共享数据