Re: how to export global variable in C dll?
On Thu, 10 Apr 2008 15:17:13 -0700 (PDT), Cyrfer <cyrfer@gmail.com> wrote:
Would someone show that it is possible to export global variables?
Thanks!
Perhaps I've misunderstood your question. This seems to work and is quite
straightforward:
For the DLL:
*****************************
; DLLVAREXPORT.DEF
; export TESTVAR without name-mangling
NAME DLLVAREXPORT.DLL
EXPORTS
TESTVAR
*****************************
/* DLLVAREXPORT.H */
#include <windows.h>
#include <stdio.h>
// make TESTVAR "global"
extern DWORD TESTVAR;
*****************************
/* VAR.C */
#include "dllvarexport.h"
// make TESTVAR the same for all instances
// not necessary but not very useful otherwise
#pragma data_seg(".shared")
DWORD TESTVAR = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
***************************
/* DLLVAREXPORT.C */
#include "dllvarexport.h"
BOOL WINAPI DllMain(HANDLE hInstance, ULONG Command, LPVOID Reserved)
{
printf("DLL loaded; TESTVAR = %lu\n", TESTVAR);
return TRUE;
}
****************************
And now for a test:
/* DLLVAREXPORTTEST.C */
#include <windows.h>
#include <stdio.h>
INT main ( INT argc, CHAR **argv )
{
HMODULE hMod = LoadLibrary
(
"g:\\projects\\dllvarexport\\release\\dllvarexport.dll"
);
DWORD *dwTESTVAR = (DWORD *) GetProcAddress(hMod, "TESTVAR");
printf("TESTVAR = %lu\n", *dwTESTVAR);
*dwTESTVAR += 1;
printf("TESTVAR = %lu\n", *dwTESTVAR);
Sleep(60000);
FreeLibrary(hMod);
return 0;
}
Run DLLVAREXPORTTTEST.EXE:
DLL loaded; TESTVAR = 0
TESTVAR = 0
TESTVAR = 1
Run the test again while the first test is still sleeping:
DLL loaded; TESTVAR = 1
TESTVAR = 1
TESTVAR = 2
And a question for the experts: Is "static" necessary on data is a shared
segment? For some reason I used to think so but in the test above it clashed
with "extern" so I left it out and all seems OK.
--
- Vince