您的位置:首页 > 其它

进程间通讯--动态库的共享数据

2017-08-13 21:50 381 查看
因为这里是不同的进程同时加载一个动态库,所以要求两个进程的位数必须与dll相同,即只能使32位与32位通讯,64位与64位的通讯。

其中的原理就是:

设置某一块物理内存为“共享读共享写”,对其写的时候就不会触发操作系统的拷贝写。

//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.总结关于动态库的三种导出方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IPC