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

网上有不少写关于#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());
}
 

你可能感兴趣的:(thread,dll,工具,library,linker)