一,
HINSTANCE g_hinstDll = NULL; HHOOK g_hhook = NULL; HWND g_hwndPost = NULL; UINT g_uMsgNotify = WM_USER; HOOKPROC KeyboardHook_HookProc ( int nCode, WPARAM wParam, LPARAM lParam) { LRESULT lResult = CallNextHookEx(g_hhook, nCode, wParam, lParam); if (nCode == HC_ACTION) { PostMessage(g_hwndPost, g_uMsgNotify, wParam, lParam); } return((HOOKPROC)lResult); } /////////// BOOL WINAPI SetKeyboardHook (HWND hWndPost, UINT Msg) { HHOOK hhook; if (g_hhook != NULL) return(FALSE); g_hwndPost = hWndPost; g_uMsgNotify = Msg; Sleep(0); if (g_hLogHook==NULL) hhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHook_HookProc,g_hinstDll, 0); InterlockedExchange((PLONG) &g_hhook, (LONG) hhook); return(g_hhook != NULL); } /// BOOL WINAPI ReleaseKeyboardHook() { BOOL fOK = TRUE; if (g_hhook != NULL) { fOK = UnhookWindowsHookEx(g_hhook); g_hhook = NULL; } return(fOK); } BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hinstDll = hinstDll; break; } return(TRUE); }
二,
在Borland的Community上找到了这篇文章,可以解决这个问题了。如下:
http://community.borland.com/article/0,1410,20008,00.html /// C++Builder 4.0 is the first C++Builder compiler that supports shared memory segments. This document explains how to use this feature in windows DLL. To change the data segment and the class name, you need to add #pragma option -zR[SEGMENT NAME] and #pragma option -zT[CLASS NAME] to the file you want the data shared from. Below is the source file I am going to export the integer named ''data'': File: SharedData.cpp //--------------------------------------------------------------------------- // Borland C++Builder // Copyright (c) 1987, 1999 Inprise Corporation. All Rights Reserved. //--------------------------------------------------------------------------- #pragma option -zRSHSEG // change default data segment name #pragma option -zTSHCLASS // change default data class name // Here is the initialized data that will be shared. int data = 0; Notice that the segment name for this file is: SHSEGSHCLASS. A .def file is required for the linker to create the shared segement. Below is what the .def file looks like: File: Shared.def LIBRARY SHAREDDLL SEGMENTS SHSEG CLASS ''SHCLASS'' SHARED
三
当你的DLL程序被其它各个程序调用时,每调用一次,将产生一个DLL的实例,其实代码在内存中仅有一套,但DLL中的变量即数据段将 产生多个,这若干个数据段是互不干扰、是不能共享的,但在一些特殊情况下,就不能满足我们的要求了,比如,用户的全局钩子程序就 是一个.DLL,这个.DLL会被内存所有的进程调用, 如果它的数据段不能共享,就变成了多个局部钩子了,好在API已替你想好了一个间接 办法,你可用一个“共享名”申请一块共享内存块,进行读写:
HANDLE GetShare(char * &ShareP,int size,char *ShareName) { ShareP申请的内存块地址,size字节数,ShareName共享名 HANDLE fh=CreateFileMapping((HANDLE)-1,0, PAGE_READWRITE,0,
|