天天看點

DLL和EXE怎樣共享全局變量?

http://www.cnblogs.com/gakusei/articles/1585211.html

全局共享資料       

  #pragma   data_seg   ("shareddata")    

  HWND   sharedwnd=NULL;//共享資料    

  #pragma   data_seg()         

  編譯選項加入   /SECTION:shareddata,rws  

============================

用pragma設定共享資料:   

  #pragma   data_seg("MYSEC")  

  char   MySharedData[4096]={0};  

  #pragma   data_seg()   

  然後在使用者的DEF檔案中為有名的資料區設定共享屬性。  

  LIBRARY   TEST  

  DATA   READ   WRITE  

  SECTIONS  

  .MYSEC   READ   WRITE   SHARED  

  在應用程式(程序)按外部變量引用共享資料。  

  extern   _export"C"{char   *   MySharedData[];}  

  程序中使用該變量應注意間接引用。  

  m_pStatic=(CEdit*)GetDlgItem(IDC_SHARED);  

  m_pStatic->GetLine(0,*MySharedData,80);

=====================================

  //Global.h   In   DLL  

  #pragma   once  

  #include   "StdAfx.h"  

  #pragma   data_seg(".Shared")  

  int   g_nExport   =   33333;  

  CString   g_strExport   =   "DLLEXPORT";  

  #pragma   data_seg()       

  #pragma   comment(linker,"/SECTION:.Shared,RWS")  

如果DLL中定義了共享變量A,EXE1載入DLL,另外一個EXE2也載入DLL,則EXE1裡的DLL   和   EXE2裡的DLL将可以通路同一個A;而不是EXE1和DLL之間共享,也不是EXE2和DLL之間共享。  

  另外,EXE要通路DLL裡的全局變量,則DLL必須把變量export出來,EXE再import,import有隐式或顯式

===========================

http://hi.baidu.com/shilyx/blog/item/2017dca29b1777accaefd0e1.html

近日寫程式,讓全局共享變量給害苦了,現将結果公布出來,不希望有人步我後塵。

先總結經驗:全局共享變量一定要在定義時初始化,否則無效。

下面寫兩行代碼進行驗證(Visual Studio .NET 2003 + Windows Servers 2003):

//main.c

#include

#include "resource.h"

__declspec(dllexport) void Test(HWND hWnd);

//主窗體回調函數

LRESULT CALLBACK MainProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

{

switch(message)

{

case WM_COMMAND:

{

if(LOWORD(wParam)==IDOK)

{

Test(hWnd);

return 1;

}

else if(LOWORD(wParam)== IDCANCEL)

{

EndDialog(hWnd,0);

return 1;

}

}

}

return 0;

}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

DialogBox(hInstance,ID_DLG,NULL,MainProc);

return 0;

}

///

//dll.c

#include

#include

//定義全局共享變量

#pragma data_seg(".Shared")

static int haveinit=0;//初始化

static int noinit; //未初始化

#pragma data_seg()

#pragma comment(linker, "/section:.Shared,rws")

__declspec(dllexport) LRESULT CALLBACK TestProc(int code, WPARAM wParam, LPARAM lParam)

{

if (code >= 0)

{

CWPSTRUCT *msg = (CWPSTRUCT *) lParam;

if (msg->message==WM_NULL)

{

char Text[50];

//進行付值

haveinit=100;

noinit=100;

sprintf(Text,"haveinit=%d\nnoinit=%d",haveinit,noinit);

MessageBox((HWND)msg->wParam,Text,"付值情況",MB_OK);

}

}

return CallNextHookEx(NULL, code, wParam, lParam);

}

__declspec(dllexport) void Test(HWND hWnd)

{

char Text[50];

//尋找任意對話框

HWND hTest=FindWindow("#32770","");

//取得對話框的線程句柄

HWND handle=GetWindowThreadProcessId(hTest,NULL);

HANDLE hLib= GetModuleHandle("dll.dll");

//添加鈎子

HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC,TestProc,hLib ,handle);

if(hook)

{

//發送消息激活鈎子

SendMessage(hTest,WM_NULL,(WPARAM)hWnd,0);

//解除安裝鈎子

UnhookWindowsHookEx(hook);

//輸出結果

sprintf(Text,"haveinit=%d\nnoinit=%d",haveinit,noinit);

MessageBox(hWnd,Text,"輸出結果",MB_OK);

}

}

/

//res.rc

/

//

// Dialog

//

ID_DLG DIALOGEX 0, 0, 186, 90

STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP |

WS_CAPTION | WS_SYSMENU

CAPTION "Dialog"

FONT 8, "MS Shell Dlg", 400, 0, 0x1

BEGIN

DEFPUSHBUTTON "測試",IDOK,26,25,50,14

PUSHBUTTON "關閉",IDCANCEL,99,26,50,14

END

///

//resource.h

#define ID_DLG 101

将上面的dll.c編譯成dll檔案,main.c編譯成exe檔案,程式運作結果便可以說明一切。

繼續閱讀