网上有不少写关于#pragma data_seg("shared")实现数据共享的,但是大部分是代码片,我实现的是两个程序调用一个dll,并使用同一数据段
#include <stdio.h> #include <windows.h> BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #pragma data_seg("shared")//定义共享数据段,必须初始化 int a=4; int b=1; #pragma data_seg() #pragma comment(linker,"/SECTION:shared,RWS")//指定该数据段可读写 void __stdcall set(int pa,int pb) { a=pa;b=pb; } int __stdcall show() { return a+b; }该文件定义了两个导出函数,故还需要在def文件中声明:LIBRARY "shareDll"
EXPORTS
set
show编译生成dll和lib文件,我们用vs带的命令行工具可以进行查看:
dumpbin /exports shareDll.dll
有
ordinal hint RVA name
1 0 00011005 set = @ILT+0(?set@@YGXHH@Z)
2 1 000110CD show = @ILT+200(?show@@YGHXZ)这样几行,导出成功
下面我们就要新建两个工程,其中一个负责每隔1秒调用show()显示结果,另一个负责调用set(int,int)改变数据,通过查看前一个程序显示数据判断是否成功
#include <stdio.h> #include <windows.h> int (__stdcall *show)(); void main() { int result; HMODULE pMo=::LoadLibrary(L"E://backup//VisualStudio2008//shareDll//Debug//shareDll");//注意转义 show =(int (__stdcall *)())::GetProcAddress(pMo, "show"); int i=1; while(i++<10){ result=show(); printf("%d",result); Sleep(1000); } }
#include <stdio.h>#include <windows.h> void (__stdcall *myfun)(int,int);//当导出函数带有参数时,要这样写 int (__stdcall *show)(); void main() { int result; HMODULE pMo=::LoadLibrary(L"E://backup//VisualStudio2008//shareDll//Debug//shareDll"); myfun=(void (__stdcall*)(int,int))GetProcAddress(pMo,"set"); show =(int (__stdcall *)())GetProcAddress(pMo,"show"); myfun(7,9); printf("%d",show()); }
dll与程序间的数据共享(#pragma data_seg())
最新推荐文章于 2021-10-07 23:55:04 发布