以下为DLL文件
#include "stdafx.h"
#include "iostream"
//-----------------------------------------------------------------------------------
HWND windowsJB=NULL; // 窗口句柄
HHOOK mouseHookJB=NULL; // 鼠标钩子句柄
HWND TargetWindowsJB;//鼠标所指向的窗口的句柄
HWND FuWindowsJB;//鼠标所指向的窗口的父窗口的句柄
HINSTANCE dllInstanceJB=NULL; // DLL实例句柄
//-----------------------------------------------------------------------------------
void StartHook(HWND,bool);
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
//void StopHook();
//-------------------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
//--------------------------------------------------------------------------------------
void StartHook(HWND TargetWindowsJB,bool nCode)
{
if(nCode)
{
FuWindowsJB=TargetWindowsJB;
mouseHookJB=SetWindowsHookEx(WH_MOUSE,MouseProc,dllInstanceJB,0);
}
else
UnhookWindowsHookEx(mouseHookJB);}
//--------------------------------------------------------------------------------------
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)//鼠标钩子的处理函数
{
MOUSEHOOKSTRUCT * pMouseHook;
pMouseHook=(MOUSEHOOKSTRUCT *) lParam;
if(nCode>=0)
{
TargetWindowsJB=pMouseHook->hwnd;
FuWindowsJB=TargetWindowsJB; //用当前获得的窗口句柄填充到父窗口句柄变量里
while(FuWindowsJB !=NULL)
{
TargetWindowsJB=FuWindowsJB;
FuWindowsJB=GetParent(TargetWindowsJB); //取应用程序主窗口句柄
}
if(TargetWindowsJB != windowsJB)
{
char szCaption[100]; //存储窗体标题的变量
GetWindowText(TargetWindowsJB,szCaption,100); //取目标窗口标题
std::cout<<"DLL is ok"<<std::endl;
Sleep(20000);
}
}
return CallNextHookEx((HHOOK) mouseHookJB,nCode,wParam,lParam); //继续传递消息
}
//---------------------------------------------------------------------------------------
以下是调用该DLL的代码
#include "stdafx.h"
#include "windows.h"
typedef VOID (* MYPROC)(int,HINSTANCE);
HINSTANCE hinstLib;//DLL文件句柄
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
int _tmain(int argc, _TCHAR* argv[])
{
hinstLib = LoadLibraryEx("test.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress( hinstLib,"StartHook");
if (ProcAdd==NULL)
{
fRunTimeLinkSuccess = TRUE;
std::cout<<"函数没有载入"<<std::endl;
Sleep(20000);
}
fFreeResult = FreeLibrary(hinstLib);
}
if (! fRunTimeLinkSuccess)
printf("Message via alternative method\n");
Sleep(20000);
}
//-----------------------------------------------------------------
现在的问题是能载入DLL但不能调用DLL中的函数,请大家帮我看看原因。我是个新手,一下子在学DLL编写和HOOK的编写实在有点吃力。先给20分,分不够可以再加。
#include "stdafx.h"
#include "iostream"
//-----------------------------------------------------------------------------------
HWND windowsJB=NULL; // 窗口句柄
HHOOK mouseHookJB=NULL; // 鼠标钩子句柄
HWND TargetWindowsJB;//鼠标所指向的窗口的句柄
HWND FuWindowsJB;//鼠标所指向的窗口的父窗口的句柄
HINSTANCE dllInstanceJB=NULL; // DLL实例句柄
//-----------------------------------------------------------------------------------
void StartHook(HWND,bool);
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
//void StopHook();
//-------------------------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
//--------------------------------------------------------------------------------------
void StartHook(HWND TargetWindowsJB,bool nCode)
{
if(nCode)
{
FuWindowsJB=TargetWindowsJB;
mouseHookJB=SetWindowsHookEx(WH_MOUSE,MouseProc,dllInstanceJB,0);
}
else
UnhookWindowsHookEx(mouseHookJB);}
//--------------------------------------------------------------------------------------
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)//鼠标钩子的处理函数
{
MOUSEHOOKSTRUCT * pMouseHook;
pMouseHook=(MOUSEHOOKSTRUCT *) lParam;
if(nCode>=0)
{
TargetWindowsJB=pMouseHook->hwnd;
FuWindowsJB=TargetWindowsJB; //用当前获得的窗口句柄填充到父窗口句柄变量里
while(FuWindowsJB !=NULL)
{
TargetWindowsJB=FuWindowsJB;
FuWindowsJB=GetParent(TargetWindowsJB); //取应用程序主窗口句柄
}
if(TargetWindowsJB != windowsJB)
{
char szCaption[100]; //存储窗体标题的变量
GetWindowText(TargetWindowsJB,szCaption,100); //取目标窗口标题
std::cout<<"DLL is ok"<<std::endl;
Sleep(20000);
}
}
return CallNextHookEx((HHOOK) mouseHookJB,nCode,wParam,lParam); //继续传递消息
}
//---------------------------------------------------------------------------------------
以下是调用该DLL的代码
#include "stdafx.h"
#include "windows.h"
typedef VOID (* MYPROC)(int,HINSTANCE);
HINSTANCE hinstLib;//DLL文件句柄
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
int _tmain(int argc, _TCHAR* argv[])
{
hinstLib = LoadLibraryEx("test.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress( hinstLib,"StartHook");
if (ProcAdd==NULL)
{
fRunTimeLinkSuccess = TRUE;
std::cout<<"函数没有载入"<<std::endl;
Sleep(20000);
}
fFreeResult = FreeLibrary(hinstLib);
}
if (! fRunTimeLinkSuccess)
printf("Message via alternative method\n");
Sleep(20000);
}
//-----------------------------------------------------------------
现在的问题是能载入DLL但不能调用DLL中的函数,请大家帮我看看原因。我是个新手,一下子在学DLL编写和HOOK的编写实在有点吃力。先给20分,分不够可以再加。
解决方案 »
- 这几句代码是什么意思?
- 哪位大虾帮帮忙,vc里snmp编程如何获得1.3.6.1的字符串形式,有直接的函数可以调用吗
- 拜托各位了,项目太急了,有个小问题:怎样把word中的特殊字符显示到界面上
- 带控制条的画图,急~~~!!!!!
- 计算 语句执行时间的问题
- 为什么用 raw socket 抓 3步握手的包的时候 会显示抓到2次 第一步握手的包,如何判断抓到的是什么包
- 请问大虾们这段代码,问题在哪啊?
- getpeername()为何会失败?ret==0xffffffff;WSAGetLastError==0x0000271e
- 能不能把.OCX控件编译进可执行文件中,发布程序时不用发布.OCX控件?(100分相送)
- 送分了,关于高程的。
- 经过一个下午的努力,终于勇敢的写出了我的第一个windows程序,望各位高手指点一二!
- 有谁知道如何将dialog资源导入其他工程
应该是:
typedef VOID (* MYPROC)(HWND,bool);
void StartHook(HWND,bool)前加上了“extern "C" _declspec(dllexport)”,这下就行了。可是问题是我编写的是非MFC的DLL,难道也需要“extern "C" _declspec(dllexport)”这些语句吗?
或者使用DEF文件指定导出函数也可以
DLL部分
#include "stdafx.h"
#include "stdio.h"
#include "iostream"
//---------------------------------------------------------------
HWND windowsJB=NULL; // 窗口句柄
HHOOK mouseHookJB=NULL; // 鼠标钩子句柄
HWND TargetWindowsJB;//鼠标所指向的窗口的句柄
HWND FuWindowsJB;//鼠标所指向的窗口的父窗口的句柄
HINSTANCE dllInstanceJB=NULL; // DLL实例句柄
FILE *fp;
//--------------------------------------------------------------
extern "C" __declspec(dllexport) void StartHook(HWND,bool);
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);
void StopHook();
//--------------------------------------------------------------------
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
//--------------------------------------------------------------
void StartHook(HWND TargetWindowsJB,bool nCode)
{
std::cout<<"StartHook"<<std::endl;
Sleep(5000);
mouseHookJB=SetWindowsHookEx(WH_MOUSE,MouseProc,dllInstanceJB,0);
}
//-------------------------------------------------------------------
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode<0) return CallNextHookEx (mouseHookJB,nCode,wParam,lParam);
MOUSEHOOKSTRUCT * pMouseHook;
pMouseHook=(MOUSEHOOKSTRUCT *) lParam;
if (nCode==HC_ACTION)
{
TargetWindowsJB=pMouseHook->hwnd;
FuWindowsJB=TargetWindowsJB;
while(FuWindowsJB !=NULL)
{
TargetWindowsJB=FuWindowsJB;
FuWindowsJB=GetParent(TargetWindowsJB);
char szCaption[100]; //存储窗体标题的变量
GetWindowText(TargetWindowsJB,szCaption,100); //取目标窗口标题
fp=fopen("c:\a.txt","w+");
fputs(szCaption,fp);
fclose(fp);
}
}
return CallNextHookEx( mouseHookJB,nCode,wParam,lParam);
}
//-----------------------------------------------------------------
/*最后,调用UnhookWindowsHookEx()函数完成对钩子的卸载*/
void StopHook()
{
UnhookWindowsHookEx(mouseHookJB);
}
//---------------------------------------------------
调用部分
#include "stdafx.h"
#include "windows.h"
typedef char (* MYPROC)(HWND,bool);
HINSTANCE hinstLib;//DLL文件句柄
MYPROC ProcAdd;
int _tmain(int argc, _TCHAR* argv[])
{
hinstLib = LoadLibrary("test.dll");
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress( hinstLib,"StartHook");
if (ProcAdd==NULL)
{
std::cout<<"函数没有载入"<<std::endl;
Sleep(5000);
}
FreeLibrary(hinstLib);
}
}
请问用控制台可以调用带DLL的钩子吗?在控制台下应该如何调试这个鼠标钩子呢?
现在的代码能找到DLL文件,也能找到StartHook函数,可似乎没起任何作用,连在C盘上创建文件都不行。望大家指教,分不够可以再加。
hinstLib = LoadLibrary((LPCTSTR)"test.dll");
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress( hinstLib,"StartHook");
if (ProcAdd)
{
handletype=1;
ProcAdd(1,hinstLib);
}
FreeLibrary(hinstLib);
}
难到单是ProcAdd = (MYPROC) GetProcAddress( hinstLib,"StartHook");语句不行吗?MSDN 好像也没有说过啊。
你在DLL中定义的CALLBACK (就是__stdcall) VC 默认的是__cdecl,
所以你在APP中也应该这样声明:
typedef char (*CALLBACK MYPROC)(HWND,bool);ProcAdd(1,hinstLib)相当于一个函数调用。如果你的DLL要注入到其他进程,那么你全局变量是会有用的,因为
两个进程的地址空间不一样。你应该声明一个共享段
#pragma data_seg("ShareData"
HWND hwnd2Rec = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:ShareData,RWS") //中间没有空格。