Как передать переменные в функцию, экспортируемую DLL, я получаю ошибку LNK2001 - PullRequest
1 голос
/ 14 августа 2011

Я должен передать переменную HWND из основной программы в функцию, экспортируемую DLL.Переменная называется mainHwnd, и DLL определяется следующим образом:

mydll.h

#ifdef MYDLL_EXPORTS
#define MYDLL_API extern "C" __declspec(dllexport)
#else
#define MYDLL_API extern "C" __declspec(dllimport)
#endif

MYDLL_API HWND mainHwnd;
MYDLL_API void testFunction(void);
MYDLL_API LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam);

mydll.cpp

#include "stdafx.h"
#include "mydll.h"
#include <string>

#define CLASSNAMELEN    5

MYDLL_API HWND mainHwnd = 0;

// This is an example of an exported function.
MYDLL_API void testFunction(void)
{
MessageBox(NULL, (LPCWSTR)L"Test", (LPCWSTR)L"Test", MB_OK);
}

MYDLL_API LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// processes the message
if(nCode >= 0)
{
    if(wParam != NULL && (wParam == WM_RBUTTONDOWN || wParam == WM_RBUTTONUP))
    {
        std::wstring s;
        MessageBox(NULL, (LPCWSTR)L"Captured mouse right button", (LPCWSTR)L"Test", MB_OK);
        MOUSEHOOKSTRUCT *m = (MOUSEHOOKSTRUCT*) lParam;
        GetClassName(m->hwnd, (LPWSTR) s.c_str(), CLASSNAMELEN);
        if(s == L"Edit")
            SendMessage(mainHwnd, WM_APP, 0, (LPARAM) lParam);
    }
}

// calls next hook in chain
return CallNextHookEx(NULL, nCode, wParam, lParam);
}

основная программа

MYDLL_API HWND mainHwnd;
...
case WM_CREATE:
    {   
        // now it will load DLL and set up hook procedure for mouse events

        // declares local variables
        HOOKPROC hkprcMouseProc;
        HINSTANCE hinstDLL; 
        HHOOK hhookMouseProc;
        // loads DLL
        if((hinstDLL = LoadLibrary(TEXT("C:\\Users\\Francesco\\Dropbox\\poli\\bi\\not\\pds\\sp\\wk5\\lsp5\\Debug\\mydll.dll"))) == NULL)
        {
            MessageBox(hWnd, (LPCWSTR)L"Error loading DLL", (LPCWSTR)L"Error", MB_OK | MB_ICONERROR);
            break;
        }

        // saves main window handle for DLL functions
        mainHwnd = hWnd;
...

Компиляция Я получаю

error LNK2001: unresolved external symbol __imp__mainHwnd

при использовании dumpbin / exports mydll.dll Я получаю, что имя глобальной переменной искажено как:

mainHwnd = _mainHwnd

Я просмотрел много страниц в Google безрезультатно.Возможно, есть концептуальная ошибка .. Спасибо

1 Ответ

1 голос
/ 14 августа 2011

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

Для динамически загружаемых библиотек DLL вам необходимо использовать GetProcAddress, чтобы получить адрес переменной во время выполнения. (Несмотря на название, оно будет работать как с экспортированными переменными, так и с экспортированными функциями, и вам лучше будет относиться к результату как к правильному!)

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

...