快速业务通道

用C++ Builder编HOOK程序

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

一,

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,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号