dll与程序间的数据共享(#pragma data_seg())

来源:互联网 发布:淘宝大学诺思星 编辑:程序博客网 时间:2024/04/20 14:08

网上有不少写关于#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()); }
 
原创粉丝点击