Я искал ответы о том, как ссылаться на неуправляемые библиотеки DLL из C ++,
Есть ли лучший способ загрузить DLL в C ++?
Ссылки на DLL в Visual C ++
и кажется, что DLL не может быть загружена в C ++ без вызывающей стороны, также имеющей файл .LIB . Правда ли, что файл .lib абсолютно необходим, если я хочу динамически загружать DLL во время выполнения следующим образом?
#include <Windows.h>
HMODULE h;
LPCWSTR l;
DWORD error;
wchar_t *myDLL = L"E:\\...\\myWin32DLL.dll";
l = (LPCWSTR)myDLL;
h = LoadLibrary(l);
error = GetLastError();
Если я вызываю LoadLibrary с использованием кода выше, я получаю результат NULL. Код ошибки из GetLastError (): 193: ERROR_BAD_EXE_FORMAT . Почему?
EDIT / UPDATE:
Я понял, что не так - у меня была целевая платформа программы (которая вызывает DLL) как x64, и как только я изменил ее на Win32, LoadLibrary теперь возвращает ненулевой результат.
DLL состоит из одного исходного файла expFns.cpp:
#include <Windows.h>
#define Pi 3.14159
extern _declspec(dllexport)
double circumference(double radius)
{
return 2.0 * radius * Pi;
}
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
return TRUE;
}
Вот как это скомпилировано:
cl expFns.cpp /link /DLL /out:mywin32dll.dll
Если я использую известную DLL-библиотеку, например unrar3.DLL, я все равно получаю код ошибки 193. Почему я получаю этот код ошибки?
С другой стороны, если я использую P / Invoke в управляемом C #, все, что мне нужно, это полный путь к .DLL, файл LL не нужен, и вызов функции для DLL будет работать. Почему в C ++ необходимо иметь файл .LIB, а C # не нужен файл .LIB?
[DllImport(@"E:\...\myDLL.dll"
, CallingConvention = CallingConvention.Cdecl
, EntryPoint = "get_value")]
internal static extern double get_value(double l, double w, double h);