钩子DLL中的全局变量问题

Taiji02 2006-09-08 10:05:47
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
char strClassName[128];
char strTitle[128];
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_SHOWWINDOW == pCwp->message || WM_ACTIVATE == pCwp->message)
{
          SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
     }
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0)&&(hNextHookMsgProc!=0);
}

为什么无法将加载应用程序的句柄保存下来,也即加载程序无法收到钩子发过来的消息?是不是全局变量 hProgramWnd的问题,请知情者帮忙!
...全文
587 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
不用,共享什么呀,不用共享

我这个在BCB中完全可以用,就算在BCB中DLL我也是这么写呀,除了入口函数名不一样以外

#pragma data_seg("Shared")的意思是说在可执行文件中,将这个代码以后的变量定义放到共享Section中。和你的程序没有任何关系。

不要把BCB和VC想的区别太大,以上的代码我一个C++的class都没有调用,除了变量声明是C++语法以外,其余的全是C语法,就是Win32编程,你用记事本也可以编的。
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
呵呵,原来是用VC啊,在VC中好象只要用#pragma data_seg("Shared")定义dll中的共享数据段就可以了吧。可是这个bcb中没有,这弯不好绕啊!
netliuming 2006-09-08
  • 打赏
  • 举报
回复
如果有用到全局数据,则vc跟bcb定义是不同的,vc简单,bcb要绕一些弯,没用到的话则是差不多一样。
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
我用的是VC做的,不过用什么编译器没有关系,你在调用SetProcHook的时候可以将
你窗体的句柄传进去就可以了,比如:Form1->Handle
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
头文件是:

#pragma once

#ifndef PROCHOOKLIB
#define PROCHOOKLIB extern "C" __declspec(dllimport)
#endif

#include <windows.h>

PROCHOOKLIB BOOL SetProcHook(HWND hWnd);
PROCHOOKLIB void DeleteProcHook();
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
我给你贴出来好了,我在公司,不能向外面发邮件

#include <windows.h>
#include <malloc.h>

#define PROCHOOKLIB extern "C" __declspec(dllexport)
#include "ProcHookLib.h"

HHOOK g_hHook = NULL;
HINSTANCE g_hInst = NULL;
HWND g_hWnd = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
g_hInst = hinstDLL;
break;
}
return TRUE;
}

LRESULT CALLBACK ProcHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// If nCode is less than zero, the hook procedure must pass the message
// to the CallNextHookEx function without further processing and must
// return the value returned by CallNextHookEx.
if (nCode < 0)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// if the message was not sent by current thread and the Pointer to a
// CWPSTRUCT structure is not NULL.
if ((wParam == 0) && (lParam != NULL))
{
//specifies message type
PCWPSTRUCT pcs = (PCWPSTRUCT)lParam;
if (pcs->message == WM_SHOWWINDOW || pcs->message == WM_ACTIVATE)
{
//send WM_COPTDATA message to specifies window
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


PROCHOOKLIB BOOL SetProcHook(HWND hWnd)
{
if (g_hHook == NULL)
{
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, ProcHookProc, g_hInst, 0);
g_hWnd = hWnd;
}
return g_hHook != NULL;
}

PROCHOOKLIB void DeleteProcHook()
{
if (g_hHook != NULL)
{
UnhookWindowsHookEx(g_hHook);
}
}
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
to xiaoshi0(Rain):
谢谢你的热心。在我写的程序中到语句SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam)时hProgramWnd为NULL,所以收不到钩子的消息。你能不能把dll的例子整个给我参考一下,主要是g_hWnd你是怎么定义的,好吗?我的邮箱是:todys@163.com
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
不好意思,我当时还没有做完,但发现了是你发送消息的函数没有传对,我做了个例子,可以收到钩子,以上就是关键函数代码,你可以看看
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
LRESULT CALLBACK ProcHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// If nCode is less than zero, the hook procedure must pass the message
// to the CallNextHookEx function without further processing and must
// return the value returned by CallNextHookEx.
if (nCode < 0)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// if the message was not sent by current thread and the Pointer to a
// CWPSTRUCT structure is not NULL.
if ((wParam == 0) && (lParam != NULL))
{
//specifies message type
PCWPSTRUCT pcs = (PCWPSTRUCT)lParam;
if (pcs->message == WM_SHOWWINDOW || pcs->message == WM_ACTIVATE)
{
//send WM_COPTDATA message to specifies window
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
to :xiaoshi0(Rain)
你的代码有问题,应该是:SendMessage(g_hWnd, WM_COPYDATA, 0,(LPARAM)&cds);

申明为 static 也不行,不知何故?
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
COPYDATASTRUCT cds;
cds.dwData = 0;
cds.cbData = sizeof(CWPSTRUCT);
cds.lpData = _alloca(cds.cbData);
memcpy(cds.lpData, pcs, cds.cbData);
SendMessage(g_hWnd, WM_COPYDATA, 0, &cds);
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
全部代码如下:

#include <windows.h>
extern "C" __declspec(dllexport)bool __stdcall EnableKeyHook(HWND hWnd);
extern "C" __declspec(dllexport)bool __stdcall DisableKeyHook();
HHOOK hNextHookWindProc;
HINSTANCE hInst;
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_SHOWWINDOW == pCwp->message || WM_ACTIVATE == pCwp->message)
{
          SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
}
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0);
}
//---------------------------------------------------------------------------
bool __stdcall DisableKeyHook()
{
if(hNextHookWindProc != 0)
{
UnhookWindowsHookEx(hNextHookWindProc);
hNextHookWindProc = 0;
}
return(hNextHookWindProc == 0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hNextHookWindProc=0;
switch(fwdreason)
{
case DLL_PROCESS_ATTACH:
hInst=hinstDLL;
break;
case DLL_PROCESS_DETACH:
hInst=NULL;
break;
}
return 1;
}
//---------------------------------------------------------------------------

可以成功安装钩子!
jaffy 2006-09-08
  • 打赏
  • 举报
回复
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//----------------------------------------------------------------------------------------------------
static HINSTANCE hInstance; // 应用实例句柄
static HWND hWndMain; // MainForm句柄
static HHOOK hKeyHook; // HOOK句柄
static const myMessage=2000; // 自定义消息号
static const SecondPar=1; // 自定义消息第2参数
static const ThirdPar=2; // 自定义消息第2参数

extern "C" __declspec(dllexport)
void __stdcall SetHook(HWND,bool);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);

//----------------------------------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ hInstance=hinst; return 1; }
#pragma argsused
//----------------------------------------------------------------------------------------------------
void __stdcall SetHook(HWND hMainWin,bool nCode)
{
if(nCode) // 安放HOOK
{
hWndMain=hMainWin;
hKeyHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)HookProc,hInstance,0);
}
else // 卸下HOOK
UnhookWindowsHookEx(hKeyHook);
}
//----------------------------------------------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
EVENTMSG *keyMSG=(EVENTMSG *)lParam;
if((nCode==HC_ACTION)&&(keyMSG->message==WM_KEYUP))
PostMessage(hWndMain,myMessage,(char)(keyMSG->paramL),SecondPar);
//if((nCode==HC_ACTION)&&(keyMSG->message==WM_LBUTTONDOWN))
//PostMessage(hWndMain,myMessage,(char)(keyMSG->paramL),ThirdPar);
// 向调用窗体发消息myMessage和虚拟键码(char)(keyMSG->paramL)
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
你的代码不完全呀,有的变量没有用到,有的变量还没定义

你先要看看钩子是否正确的挂接上了,然后再看看传入的HWND是否正确
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
晕了,还用那么麻烦么?直接赋值是可以的。我都用直接赋值的,例子也给你了,你用我的例子编成一个DLL文件,然后调用一下不就知道了么
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
呵呵,终于搞定了,还是用的创建内存文件来保存变量hProgramWnd的值。不过还是谢谢xiaoshi0(Rain)。
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息

不过你这句还是错的,WM_COPYDATA不是那么调用的
xiaoshi0 2006-09-08
  • 打赏
  • 举报
回复
看你的程序是动态链接上的,可能是你在调用的时候FreeLibrary了(我用的是静态链接)

在调用的时候这样:

BOOL (*EnableKeyHook)(HWND);
HNODULE hMod = LoadLibrary("ProcHookLiob.dll");//我用的是我的dll的文件名
(FARPROC&)EnableKeyHook = GetProcAddress(hMod, "EnableKeyHook");
EnableKeyHook(Form1->Handle);
//不要调用FreeLibrary

取消时这样:
BOOL (*DisableKeyHook)()
HMODULE hMod = GetModuleHandle("ProcHookLiob.dll");//我用的是我的dll的文件名
(FARPROC&)DisableKeyHook = GetProcAddress(hMod, "DisableKeyHook");
DisableKeyHook();
FreeLibrary(hMod);//这回再调用
Taiji02 2006-09-08
  • 打赏
  • 举报
回复
是呀,我的代码也完全是C写的,可就是取不到hProgramWnd的值,所以才奇怪怎么会这样呢?

to xiaoshi0(Rain) :你能不能帮忙看看我的代码有什么问题,没有用头文件,没有用vc编译,不知道能不能通过,全部代码如下:

#include <windows.h>
extern "C" __declspec(dllexport)bool __stdcall EnableKeyHook(HWND hWnd);
extern "C" __declspec(dllexport)bool __stdcall DisableKeyHook();
HHOOK hNextHookWindProc;
HINSTANCE hInst;
HWND hProgramWnd; //加载本Hook的应用程序的窗口句柄

LRESULT __stdcall WindProc(int nCode,WPARAM wParam,LPARAM lParam)
{
CWPSTRUCT *pCwp = NULL;
HWND hWnd = NULL;
char title[128];
if(nCode < 0)
{
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);

}
if(NULL != lParam)
{
pCwp =(CWPSTRUCT *)lParam;
if(WM_COMMAND == pCwp->message)
{
//if (hProgramWnd)
{
GetWindowText(hProgramWnd,title,128)
MessageBox(0,title,"test",MB_OK);
//SendMessage(hProgramWnd,WM_COPYDATA,0,pCwp->wParam);//应用程序无法收到此消息
}
}
}
return CallNextHookEx(hNextHookWindProc, nCode, wParam, lParam);
}
bool __stdcall EnableKeyHook(HWND hWnd)//安装钩子的导出函数
{
hProgramWnd=hWnd;//把此句柄保存到全局变量中
if(hNextHookWindProc == 0)
hNextHookWindProc = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)WindProc, hInst, 0);
return(hNextHookWindProc != 0);
}
//---------------------------------------------------------------------------
bool __stdcall DisableKeyHook()
{
if(hNextHookWindProc != 0)
{
UnhookWindowsHookEx(hNextHookWindProc);
hNextHookWindProc = 0;
}
return(hNextHookWindProc == 0);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
hNextHookWindProc=0;
switch(fwdreason)
{
case DLL_PROCESS_ATTACH:
hInst=hinstDLL;
break;
case DLL_PROCESS_DETACH:
hInst=NULL;
break;
}
return 1;
}
//---------------------------------------------------------------------------
第12章 实例278——创建导出浮点数四则运算函数的Win32 DLL 实例279——使用显式方式调用DLL实现浮点数的四则运算 实例280——使用隐式方式调用DLL实现浮点数的四则运算 实例281——创建Win32 DLL导出一个全局变量 实例282——调用DLL,获取其导出的全局变量值 实例283——创建Win32 DLL导出一个计算长方体表面积和体积的类 实例284——调用DLL,使用其导出类计算长方体的表面积和体积 实例286——创建MFC常规DLL,通过导出函数显示颜色信息对话框 实例287——调用MFC常规DLL,显示颜色信息对话框 实例288——创建MFC扩展DLL,实现圆形按钮类 实例289——调用MFC扩展DLL,创建圆形按钮 实例290——创建记录键盘动作的全局钩子DLL 实例291——调用键盘钩子DLL,实现监视系统的键盘操作 实例292——创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL 实例293——调用鼠标钩子DLL,显示鼠标所在窗口的标题 实例294——获取当前操作系统的版本信息 实例295——获取系统CPU信息 实例296——获取系统内存的相关信息 实例297——获取当前系统所有安装的硬件设备 实例298——调用系统关机对话框 实例299——编码实现关闭和重启计算机 实例300——实现休眠计算机,并创建快捷键 实例301——显示并设置系统的显示属性 实例302——隐藏显示系统的任务条 实例303——改变系统的桌面壁纸
' 增加"内存_多条件搜索类",通过几个数据的偏移位置而找到动态地址. 感谢会员 sttacckz 提供 ' 增加"内存_驱动读写1类",突破某些内存保护读写内存 ' 修正"指针类","写共享",句柄不断增加的BUG 感谢会员 fmaliang 提出 ' 修正"全局共享类",句柄不断增加的BUG ' 加强"全局共享类",写共享"不再有写入长度限制. ' 加强"全局共享类","写共享"增加可空参数一个,可指定写入数据的长度 ' 增加"全局共享类","写共享文本" ' 增加"全局共享类","写共享数值" ' 增加"全局共享类","读共享文本" ' 增加"全局共享类","读共享数值" ' 增加"全局共享类","释放共享" ' 增加"全局共享类","_远程创建地址" ' 增加"全局共享类","_远程释放地址" ' 增加"指针类","取地址大小" ' 对进程功能进行整改,一律使用进程ID作为参照.以及某些命令名作以下更改 ' 增加"进程枚举2",支持枚举出进程用户名 感谢会员 qmz13579 提供 ' 增加"取进程用户名", ' 增加"进程是否有效",类似于"进程是否存在",参数为进程ID ' 修改"进程取路径"为"取程序路径",增加可空参数,区分进程大小写 ' 修改"进程ID取路径"为"取进程路径" ' 修改"进程取ID",增加可空参数,区分进程大小写,默认为不区分进程大小写 ' 增加"进程取ID数组",取指定进程名称的所有进程的进程ID ' 修改"进程取模块"为"取进程模块" ' 修改"进程取路径及命令行参数"为"取进程路径及命令行" ' 修改"取命令行参数"为"取程序命令行",增加可空参数,区分进程大小写 ' 增加"取进程命令行",参数为进程ID ' 增加"腾讯QQ类","密码到MD5_2009",主要用于登陆腾讯网站. ' 增加"爆力取句柄",爆力穷举窗口句柄,终级方案! ' 增加"爆力枚举窗口",爆力穷举窗口句柄 ' 增加"发送字符串",SendKeys 将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样 ' 增加"发送字符串",SendKeys 将一个或多个按键消息发送到指定窗口,就如同在键盘上进行输入一样 ' 增加"取当前窗口" ' 增加"取当前父窗口" ' 增加"窗口激活" ' 修正"加密配置类",用作提供参数数据的子语句未返回数据的BUG 感谢QQ5758536的朋友提出问题 ' 修改"创建桌面快捷方式"改为"创建程序快捷方式", 感谢会员 smileeyuyan01 提出意见,感觉后者更贴切一些 ' 增加"取进程ID",类似于"进程取ID" ' 增加"以SYSTEM权限运行",以SYSTEM系统权限运行指定程序 ' 增加"取线程窗口",通过窗口线程标识获取窗口句柄,如果参数为空可获取当前线程所在的窗口句柄 ' 增加"文件操作类","创建","运行" ' 修改"软件类","关联后缀","删除后缀关联"使用后自动更新图标显示 ' 删除"线程操作类","退出"命令 ' 增加"线程操作类","等待",等待线程到指定时间 ' 增加"线程操作类","取返回值",取线程子程序的返回值 ' 增加"线程操作类","_创建进入许可证" ' 增加"线程操作类","_删除进入许可证" ' 增加"线程操作类","_进入许可区" ' 增加"线程操作类","_退出许可区" ' 增加"许可证类",让多线程许可证操作更方便."进入","退出" ' 增加"线程钩子类",通常写于DLL注入后使用 ' 增加"线程钩子类","安装键盘钩子" ' 增加"线程钩子类","卸载键盘钩子" ' 增加"线程钩子类","安装鼠标钩子" ' 增加"线程钩子类","卸载鼠标钩子" ' 增加"线程钩子类","等待按键" ' 增加"线程钩子类","等待鼠标" ' 增加"线程钩子类","设置呼出窗口" ' 修改"指针类","取地址大小"为"取地址块大小" ' 增加"指针类","取地址尺寸",获取变量地址的数据尺寸 ' 增加"加密配置类","读配置项_逻辑值" ' 增加"加密配置类","写配置项_逻辑值" ' 增加"加密配置类","读配置项_数值" ' 增加"加密配置类","写配置项_数值" ' 增加"加密配置类","读配置项_字节集" ' 增加"加密配置类","写配置项_字节集" ' 增加"系统服务类",可以注册任何EXE或DLL为系统服务 ' "系统服务类"命令函数:"注册EXE","注册DLL","启动","停止","删除" ' 修正"识图3类","找颜色"与"高级找颜色",在范围图宽度特殊时,产生坐标偏差的BUG ' 增加"识图3类","找图",在屏幕或窗口找图片,返回找到的图片心坐标 ' 增加"识图3类","高级找图",在位图数据找图片,返回找到的图片所在位图的图片心坐标 ' 增加"识图3类","高级找图2"在位图数据找出图片所有坐标点,返回找到的图片数目 ' 增加"识图3类","定义文字",使用写字找字命令前必须先定义文字属性 ' 增加"识图3类","写字",写出文字,可用作参考 ' 增加"识图3类","找字",在屏幕或窗口寻找指定文字 ' 增加"识图3类","高级找字",在位图数据找文字 ' 增加"识图3类","高级找字2",在位图数据找出文字所有坐标点
实例2-1:演示C++程序的运行步骤。源代码在光盘“\02\firstcpp”目录下。 实例2-2:Visual C++语言基本元素介绍。源代码在光盘“\02\secondcpp”目录下。 实例2-3:cout流控制符setw的使用。源代码在光盘“\02\thirdcpp”目录下。 实例2-4:增加域内填充字符。源代码在光盘“\02\fourthcpp”目录下。 实例2-5:同一数据用不同进制输出结果。源代码在光盘“\02\fifthcpp”目录下。 实例2-6:用浮点数的形式输出数据。源代码在光盘“\02\sixthcpp”目录下。 实例2-7:数据的输入及输出。源代码在光盘“\02\seventhcpp”目录下。 实例2-8:计算学生平均成绩。源代码在光盘“\02\eighthcpp”目录下。 实例2-9:函数的调用。源代码在光盘“\02\ninthcpp”目录下。 实例2-10:用指针传递参数。源代码在光盘“\02\tenthcpp”目录下。 实例2-11:全局变量和局部变量。源代码在光盘“\02\eleventhcpp”目录下。 实例2-12:使用指针注意内存的分配。源代码在光盘“\02\twelfthcpp”目录下。 实例2-13:引用实例。源代码在光盘“\02\thirteencpp”目录下。 实例2-14:虚函数的使用实例。源代码在光盘“\02\fourteencpp”目录下。 。。。。。。 实例13-1:动态链接库(Dll)实例。源代码在光盘“\13\dlltest ”目录下。 实例13-2:鼠标钩子应用实例。源代码在光盘“\13\MouseHook”目录下。 实例13-3:键盘钩子应用实例。源代码在光盘“\13\KeyboardHook”目录下。 实例14-1:WinSock网络程序:聊天室。源代码在光盘“\14\WinSocketChat”目录下。 实例14-2:利用MSComm控件进行串口数据传输。源代码在光盘“\14\MSComm”目录下。 实例14-3:简单的WinInet应用程序。源代码在光盘“\14\SimpleNet”目录下。 实例15-1:创建Access数据库。源代码在光盘的“\15\Info”。 实例15-2:MFC的ODBC数据库实例。源代码在光盘“\15\Enroll”目录下。 实例15-3:利用ADO查询并操作数据库实例。源代码在光盘“\15\AdoTest”目录下。

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧