15,471
社区成员
发帖
与我相关
我的任务
分享
// Hook.cpp : Defines the entry point for the DLL application.
#include "Hook.h"
#include "stdafx.h"
#include <string>
#include <cstdlib>
#include <string>
#include <sstream>
#include <iostream>
#include "org_csj_hook_JavaHook.h"
static HHOOK g_hkb=NULL;
static HINSTANCE g_hins;
static JNIEnv* g_env;
static jclass g_jcs;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//MessageBox(NULL,"DllMain","测试",MB_OK);
if (g_hins == NULL) { //这里会被加载进入多次,说明它们不是同一实例
MessageBox(NULL,"DllMain","测试",MB_OK);
g_hins=(HINSTANCE)hModule;
}
//hins=::LoadLibrary("D:\\Java\\jdk1.5.0_06\\jre\\bin\\client\\jvm.dll");
return TRUE;
}
LRESULT __stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
MessageBox(NULL,"KeyboardProc","测试",MB_OK);
if(g_env){//这里的使终是false,说明它从来都没有被赋过值
MessageBox(NULL,"KeyboardProc->env","测试",MB_OK);
}
if(g_jcs){//这里的使终是false,说明它从来都没有被赋过值
MessageBox(NULL,"KeyboardProc->obj","测试",MB_OK);
}
//查找org.csj.hook.JavaHook类,返回JAVA类的CLASS对象
//jclass cls = env->FindClass("org/csj/hook/JavaHook");
//jclass cls = env->GetObjectClass(obj);
//if(cls){
// MessageBox(NULL,"cls","测试",MB_OK);
//}
//获取类中的方法,最后一个参数是方法的签名,通过javap -s -p 文件名可以获得
//jmethodID mid = env->GetMethodID(cls, "hookCallback","(III)V");
//if(mid){
// MessageBox(NULL,"mid","测试",MB_OK);
//}
//env->CallObjectMethod(obj, mid, 0, 1,2);
//unsigned int* a =(unsigned int*)wParam;
//unsigned long* b = (unsigned long*)lParam;
//MessageBox(NULL,a,"测试",MB_OK);
//MessageBox(NULL,"7777","测试",MB_OK);
//switch(wParam)
//{
//case '0':default;
//}
}
LRESULT RetVal = CallNextHookEx( g_hkb, nCode, wParam, lParam );
return RetVal;
}
//安装钩子
//BOOL __declspec(dllexport)__stdcall InstallHook()
JNIEXPORT jboolean JNICALL __stdcall Java_org_csj_hook_JavaHook_installHook
(JNIEnv * jenv, jclass jcs)
{
//hins=::LoadLibrary("G:\\winWorks\\Hook\\Debug\\Hook.dll");
g_hins=GetModuleHandle("G:\\winWorks\\Hook\\Debug\\Hook.dll");
//::FreeLibrary(g_hins);
if(g_hins){
g_hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,g_hins,0);
if(g_hkb){//这里已经可以为true,说明已经成功,而且到了这一步后只要你按键,KeyboardProc就会被回调
MessageBox(NULL,"installHook: true ","测试",MB_OK);
g_env = jenv;//这里对要使用的静态变量赋值
g_jcs = jcs;//这里对要使用的静态变量赋值
return TRUE;
}
}
MessageBox(NULL,"installHook: false ","测试",MB_OK);
return FALSE;
}
//释放钩子
//BOOL __declspec(dllexport) UnHook()
JNIEXPORT jboolean JNICALL __stdcall Java_org_csj_hook_JavaHook_unHook
(JNIEnv * jenv, jclass jcs)
{
if(g_env){//如果上面成功注册事件,那么这里都是为true,因为Java_org_csj_hook_JavaHook_installHook,Java_org_csj_hook_JavaHook_unHook这两个方法都是在java类中调用,所以它们应该是同一个实例
MessageBox(NULL,"unHook->env","测试",MB_OK);
}
if(g_jcs){//如果上面成功注册事件,那么这里都是为true,因为Java_org_csj_hook_JavaHook_installHook,Java_org_csj_hook_JavaHook_unHook这两个方法都是在java类中调用,所以它们应该是同一个实例
MessageBox(NULL,"unHook->obj","测试",MB_OK);
}
if(g_hkb){//这里都是true的.
BOOL unhooked = UnhookWindowsHookEx(g_hkb);
if(unhooked){
MessageBox(NULL,"unHook: true","测试",MB_OK);
return unhooked;
}
MessageBox(NULL,"unHook: false","测试",MB_OK);
//::FreeLibrary(hins);
return unhooked;
}
return false;
}
using namespace std;
extern "C"
{
//导出共享段变量
string extern m_gOPCDATASET;
}
#pragma data_seg("SHARED_OPCDATASET")
/* volatile */string m_gOPCDATASET = "AA";
#pragma data_seg()
#pragma comment(linker,"/SECTION:SHARED_OPCDATASET,RWS")
#pragma comment(lib, "Debug/Hook.lib")//這行有問題
Linking...
Creating library Debug/Hook.lib and object Debug/Hook.exp
LINK : error : Internal error during IdentifyAssignedOrdinals
ExceptionCode = C0000005
ExceptionFlags = 00000000
ExceptionAddress = 0040C768
NumberParameters = 00000002
ExceptionInformation[ 0] = 00000001
ExceptionInformation[ 1] = 00B80000
CONTEXT:
Eax = 00000008 Esp = 0013EEC4
Ebx = 00039B00 Ebp = 00000008
Ecx = 00000002 Esi = 00402AB4
Edx = 00000008 Edi = 00B80000
Eip = 0040C768 EFlags = 00010212
SegCs = 0000001B SegDs = 00000023
SegSs = 00000023 SegEs = 00000023
SegFs = 0000003B SegGs = 00000000
Dr0 = 0013EEC4 Dr3 = 00039B00
Dr1 = 00000008 Dr6 = 00000002
Dr2 = 00000000 Dr7 = 00000000
LINK : fatal error LNK1141: failure during build of exports file
Error executing link.exe.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}