Мне нужно динамически загружать .dll из управляемого кода C ++.
Код ниже делает это
[DllImport("kernel32.dll", SetLastError = true,
CharSet = CharSet::Unicode, ExactSpelling = true,
CallingConvention = CallingConvention::StdCall)]
static HMODULE LoadLibrary(LPCTSTR lpFileName);
[DllImport("kernel32.dll", SetLastError = true,
CharSet = CharSet::Unicode, ExactSpelling = true,
CallingConvention = CallingConvention::StdCall)]
static BOOL FreeLibrary(HMODULE hModule);
[DllImport("kernel32.dll", SetLastError = true,
CharSet = CharSet::Unicode, ExactSpelling = true,
CallingConvention = CallingConvention::StdCall)]
static FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
typedef int (*CFunction)();
int _tmain()
{
HMODULE pLib = LoadLibrary(TEXT("FunctionDLL.dll"));
if(pLib != 0)
{
FARPROC function = GetProcAddress(pLib, "QFunction");
if (function != 0)
MessageBox::Show(Convert::ToString(function()));
FreeLibrary(pLib);
}
else
{
MessageBox::Show(L"Error", L"Couldn't load ell");
Close();
}
return 0;
}
Но функция всегда равна нулю. Я думаю, что мы не правы. Ниже код dll:
.ч файл
#ifdef __FUNCTIONDLL__
#define __FUNCTIONDLL__
#ifdef FUNCTIONDLL_EXPORTS
#define FUNCTIONDLL_API __declspec(dllexport)
#else
#define FUNCTIONDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"{
#endif
FUNCTIONDLL_API int QFunction();
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // __FUNCTIONDLL__
.файл cpp
#include "FunctionDLL.h"
int QFunction()
{
return 42;
}
У вас есть .def в вашем проекте C ++? если не просто добавить .def с
LIBRARY FunctionDLL
EXPORTS
QFunction @1
Других решений пока нет …