Nisam bas detaljno citao, ali mislim da ce morati da pogledas primere za
"Shared memory segment"-s:
Code:
#pragma data_seg ("shared")
// npr:
char ch = 'a';
#pragma data_seg()
ili jos bolje API-je:
Code:
CreateFileMapping()
OpenFileMapping()
MapViewOfFile()
... kad sam vec tu, evo ti jedan moj primer... Ovde ja iz APP saljem DLL-u Handle
na glavnu formu da bi DLL kasnije mogao da mi salje poruke, preko SendMessage()
To bi moglo i sa FindWindow(), ali postoje neke prednosti zasto sam Handle
prosledio direktno (to je druga prica):
--- APP CPP ---
Code:
// ...
extern "C" __declspec(dllexport) __stdcall void SetHook(HWND);
extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
// ...
--- DLL CPP ---
Code:
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#define WM_KEYHOOK (WM_USER + 1002)
HINSTANCE ghInst;
typedef struct _HookInfo
{
HHOOK ghhookKB;
HWND hAppWnd;
} HOOKINFO, *PHOOKINFO;
HANDLE hFileMapping = NULL;
PHOOKINFO pHookInfo = NULL;
#pragma argsused
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) __stdcall void SetHook(HWND);
extern "C" __declspec(dllexport) __stdcall void RemoveHook(void);
extern "C" __declspec(dllexport) __stdcall DWORD CheckKey(int, WORD,LONG);
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void *lpReserved)
{
ghInst = hinst;
switch ( reason )
{
case DLL_PROCESS_ATTACH:
hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
sizeof(HOOKINFO),
"DiHook" );
if ( hFileMapping )
pHookInfo = (PHOOKINFO)MapViewOfFile( hFileMapping,
FILE_MAP_WRITE,
0,
0,
0 );
break;
case DLL_PROCESS_DETACH:
if( pHookInfo )
UnmapViewOfFile( pHookInfo );
if( hFileMapping )
CloseHandle( hFileMapping );
pHookInfo = NULL;
hFileMapping = NULL;
break;
}
return ( 1 );
}
void __stdcall SetHook( HWND hWnd )
{
if ( pHookInfo )
{
if( pHookInfo->ghhookKB == NULL )
pHookInfo->ghhookKB = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)CheckKey, ghInst, NULL );
pHookInfo->hAppWnd = hWnd;
}
}
void __stdcall RemoveHook( void )
{
if ( pHookInfo )
{
if ( pHookInfo->ghhookKB )
{
UnhookWindowsHookEx( pHookInfo->ghhookKB );
pHookInfo->ghhookKB = NULL;
}
}
}
DWORD __stdcall CheckKey( int nCode, WORD wParam, LONG lParam )
{
if( pHookInfo )
{
if( ((nCode >= 0) && (nCode != HC_NOREMOVE))
&& ((lParam & 0x40000000) == 0) // Skip if it's a repeat
&& (lParam & 0x20000000) ) // Check if Alt is pressed
{
// Send key information to the main window
if( pHookInfo->hAppWnd )
SendMessage(pHookInfo->hAppWnd, WM_KEYHOOK, 0, lParam);
}
return CallNextHookEx(pHookInfo->ghhookKB, nCode, wParam, lParam);
}
return 0;
}
[Ovu poruku je menjao X Files dana 07.07.2005. u 21:51 GMT+1]