2017-02-16 7 views
0

У меня есть тестовая dll. После события в dll я хочу использовать функцию обратного вызова из dll в exe.функция вызова из dll в exe C++

test.dll .h

extern "C" __declspec(dllimport) int __stdcall getSum(int , int); 

extern "C" __declspec(dllexport) int __stdcall callSum(int , int); 

.cpp

int callSum(int a, int b) 
{ 
    return getSum(a, b); 
} 

myexe .cpp

extern "C" __declspec(dllexport) 
int __stdcall getSum(int a, int b) 
{ 
    return a + b; 
} 


typedef int(__stdcall * callSumFn)(int a, int b); 

и нагрузки

hLib=LoadLibrary(L"test.dll"); 
    if(hLib==NULL) 
    { 
     ... 
     return -1; 
    } 


    callSumFn callSum = (callSumFn)GetProcAddress(hLib, L"[email protected]"); 
    if (!callSum) 
    { 
     //cerr << "Failed to get function address" << endl; 
     FreeLibrary(hLib); 
     return 1; 
    } 

    callSum(3, 4); 

Ошибка:

Error 18 error LNK2019: unresolved external symbol __imp_getSum referenced in function callSum test.obj test

с test.dll компиляции

что не так? Может быть, есть лучший способ? Спасибо.

+0

Файл .h поврежден, он объявляет getSum() как '__declspec (dllexport)'. Это верно только тогда, когда вы создаете DLL, это не может быть правдой при создании теста. Тогда это 'dllimport'. Использование макроса для выбора между двумя является шаблоном. –

+0

После того, как вы связали myexe.exe, вы должны были получить файл «myexe.lib». Добавьте это к вам linker command of test.dll. – ssbssa

ответ

0

Вы определили переменную функцию getSum в своей DLL, но вы ее не объявили. Объявление getSum в test.dll должно избавить вас от ошибки.

1

У вас есть круговая зависимость: exe зависит от callsum() от dll, а dll зависит от getsum() от dll.

Если вам нужен обратный вызов, вам нужно определить указатель на функцию и передать функцию из exe в качестве параметра в функцию dll.