如何从dll访问调用应用程序中的变量?

时间:2009-01-30 20:38:10

标签: c winapi

我正在尝试进行一些概念测试,以更改罗技MS3200键盘的一项功能(缩放功能)。我有从变焦控制发送的键。所以,我有一个主应用程序,以及一个包含钩子程序的DLL。

这是主要的应用程序:

#include <stdio.h>
#include <windows.h>

HANDLE hHook;

int main()
{
    HINSTANCE hMod = GetModuleHandle(NULL);

    hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc,0,0);

    if(hHook == NULL)
        printf("Unable to set hook! Error: %d", GetLastError());
    else
        printf("Hook set successfully!");

    while(TRUE)
    {
        Sleep(1000);
    }

    return 0;
}

这是钩子程序dll:

#include <windows.h>

int __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0)
    {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }


    if(wParam == VK_ADD || wParam == VK_SUBTRACT)
    {
        short status = GetKeyState(VK_CONTROL);

        if(status == 1)
        {
            if(wParam == VK_ADD)
                wParam = VK_UP;
            else
                wParam = VK_DOWN;
        }
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int WINAPI dllmain(HINSTANCE hMod, DWORD data, LPVOID lpVOid)
{
  return 0;
}

我需要能够从dll访问SetWindowsHookEx(hHook)返回的内容,以便调用CallNextHookEx()。

4 个答案:

答案 0 :(得分:2)

这可能是可能的,但是不值得你花时间去调查。

而是将钩子设置代码移动到DLL。

哦,我认为你需要将DLL模块句柄传递给钩子设置函数,而不是NULL

答案 1 :(得分:1)

处理此问题的一种可能方法是在DLL中使用另一个导出函数将hHook传递给,并将其保存在DLL中的本地变量中,以便在HookProc中使用。


HANDLE dllHook;
void __declspec (dllexport) HookHandle(HANDLE hHook)
{
  dllHook = hHook;
}

int __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode < 0 && dllHook!= NULL)
    {
        return CallNextHookEx(dllHook, nCode, wParam, lParam);
    }
    //....
}

int WINAPI dllmain(HINSTANCE hMod, DWORD data, LPVOID lpVOid)
{
  dllHook = NULL; //initialize
  return 0;
}

答案 2 :(得分:0)

DLL中的代码无法直接访问调用应用程序中的变量,因为无法保证加载DLL的应用程序会定义这些变量,即使这样做,DLL也无法知道它在哪里将被存储。

你可以在DLL中有一个全局变量和一个额外的入口点来设置它,你在调用SetWindowsHookEx之后调用它。在调用CallNextHookEx之前,DLL需要等到这个入口点被调用。

答案 3 :(得分:0)

在NT / XP / 2003等上,CallNextHookEx的第一个参数被忽略。请参阅CallNextHookEx的文档:

http://msdn.microsoft.com/en-us/library/ms644974%28VS.85%29.aspx

HTH