dllとプログラム間のデータ共有(#pragma data_seg()
ネット上には#pragma dataについて書かれているものがたくさんあります.seg(「shared」)はデータ共有を実現するが、大部分はコードシートであり、私が実現したのは2つのプログラムが1つのdllを呼び出し、同じデータセグメントを使用することである.
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());
}
#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());
}