dllとプログラム間のデータ共有(#pragma data_seg()


ネット上には#pragma dataについて書かれているものがたくさんあります.seg(「shared」)はデータ共有を実現するが、大部分はコードシートであり、私が実現したのは2つのプログラムが1つの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)
この数行でエクスポートに成功しました
次に、show()を1秒おきに呼び出して結果を表示し、set(int,int)を呼び出してデータを変更し、前のプログラムの表示データを表示して成功したかどうかを判断する2つのプロジェクトを新規作成します.
#include 
#include 
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 
#include 
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());
}