Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   Need Help Making a DLL in C++ (http://www.go4expert.com/forums/help-dll-cpp-t13439/)

fyndr 31Aug2008 05:02

Need Help Making a DLL in C++
 
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 31Aug2008 10:25

Re: Need Help Making a DLL in C++
 
Check this Creating a simple DLL


All times are GMT +5.5. The time now is 02:11.