Need Help Making a DLL in C++

fyndr's Avatar, Join Date: Aug 2008
Newbie Member
Firstly, let me say that I have only very limited experience with C++.

I am writing a program in Java that is supposed to recognize and respond to global input, i.e. keyboard and mouse events, even when the form is not in focus. I have searched for examples of keyboard and mouse hooks for Windows using the Java Native Interface. The only decent example I could find on the internet was at forums.sun.com, where the following code is offered to create a JNI DLL in C++:

Code:
// syshook.cpp
/*
 *	SysHook - 7/17/05
 *	Jacob Gohlke
 *	
 *	JNI Interface for setting a Keyboard Hook and monitoring
 *	it Java-side
 *
 *	(c) Copyright 2005 Jacob Gohlke
 *	
 *	Feel free to use and learn from this code, royalty-free!
 *	I only ask you acknkowlege what library you are using
 *	and who made it. Thanks, and happy hooking!
 */
 
#include <windows.h>
#include <winuser.h>
#include "jni.h"
#include "syshook.h"
 
#pragma data_seg(".HOOKDATA") //Shared data among all instances.
static HHOOK hkb = NULL;
static HANDLE g_hModule = NULL;
static WPARAM g_wParam = NULL;
static LPARAM g_lParam = NULL;
 
JNIEXPORT void NotifyJava(JNIEnv *env, jobject obj, WPARAM wParam, LPARAM lParam)
{		
	jclass cls = env->GetObjectClass(obj);
	jmethodID mid;
 
	mid = env->GetMethodID(cls, "Callback", "(ZIZZ)V");
	if (mid == NULL) 
			return;
 
	if( (HIWORD( lParam ) & KF_UP) )
		env->CallVoidMethod(obj, mid, (jboolean)FALSE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
	else
		env->CallVoidMethod(obj, mid, (jboolean)TRUE, (jint)(wParam), (jboolean)(HIWORD( lParam ) & KF_ALTDOWN), (jboolean)(HIWORD( lParam ) & KF_EXTENDED));
}
 
#pragma data_seg() 
 
#pragma comment(linker, "/SECTION:.HOOKDATA,RWS")
 
JNIEXPORT LRESULT CALLBACK HookKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode < 0)  // do not process message 
		return CallNextHookEx(hkb, nCode, wParam, lParam); 
 
	g_wParam = wParam;
	g_lParam = lParam;
	return CallNextHookEx(hkb, nCode, wParam, lParam);
} 
 
JNIEXPORT void JNICALL Java_PollThread_checkKeyboardChanges(JNIEnv *env, jobject obj)
{
	if(g_wParam != NULL && g_lParam != NULL)
	{
		NotifyJava(env, obj, g_wParam, g_lParam);
		g_wParam = NULL;
		g_lParam = NULL;
	}
}
 
static void Init()
{
	hkb = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)HookKeyboardProc, (HINSTANCE)g_hModule, 0 );
}
 
static void Cleanup()
{
	if( hkb != NULL )
		UnhookWindowsHookEx( hkb );
 
	hkb = NULL;
}
 
BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
	switch(ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
			g_hModule = hModule;
			Init();
			return TRUE;
 
		case DLL_PROCESS_DETACH:
			Cleanup();
			return TRUE;
	}
 
    return TRUE;
}

Code:
// syshook.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class PollThread */
 
#ifndef _Included_PollThread
#define _Included_PollThread
#ifdef __cplusplus
extern "C" {
#endif
#undef PollThread_MIN_PRIORITY
#define PollThread_MIN_PRIORITY 1L
#undef PollThread_NORM_PRIORITY
#define PollThread_NORM_PRIORITY 5L
#undef PollThread_MAX_PRIORITY
#define PollThread_MAX_PRIORITY 10L
/*
 * Class:     PollThread
 * Method:    checkKeyboardChanges
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_PollThread_checkKeyboardChanges
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif
Unfortunately, I have not even the slightest clue as to how to create a DLL in C++. Does anyone know of any step-by-step guides to create a DLL with the following code for Microsoft Visual C++ 2008 Express Edition, preferably written with C++-illiterate people in mind? Alternatively, could someone create a DLL with the given C++ code? I know it is a bit of an inconvenience, but I have been searching the Web for days and found nothing that can assist me.
shabbir's Avatar, Join Date: Jul 2004
Go4Expert Founder
Check this Creating a simple DLL