Как я могу получить доступ к переменной в вызывающем приложении из DLL? - PullRequest
0 голосов
/ 30 января 2009

Я пытаюсь провести небольшой концептуальный тест, чтобы изменить одну из функций клавиатуры Logitech 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;
}

Мне нужно иметь доступ к тому, что возвращает SetWindowsHookEx (hHook) из библиотеки DLL, чтобы вызвать CallNextHookEx ().

Ответы [ 4 ]

2 голосов
/ 30 января 2009

Возможно, возможно, но не стоит тратить время на расследование.

Вместо этого, переместите код установки хука в DLL.

О, и я думаю, вам нужно передать дескриптор модуля DLL в функцию установки хука, а не NULL

1 голос
/ 30 января 2009

Один из возможных способов справиться с этим - иметь другую экспортируемую функцию в вашей 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;
}
0 голосов
/ 21 января 2010

В NT / XP / 2003 и т. Д. Первый параметр CallNextHookEx игнорируется. См. Документацию для CallNextHookEx:

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

НТН

0 голосов
/ 30 января 2009

Код в DLL не может напрямую обращаться к переменным в вызывающем приложении, потому что нет гарантии, что приложение, загружающее DLL, определит эти переменные, и даже если это произойдет, у DLL нет возможности узнать, где она будет храниться.

У вас может быть глобальная переменная в DLL и дополнительная точка входа для ее установки, которую вы вызываете после вызова SetWindowsHookEx. DLL должна подождать, пока эта точка входа не будет вызвана, прежде чем вызывать CallNextHookEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...