我在这里遇到麻烦。我不知道如何链接和定义头文件中的C ++ DLL中的方法。如何将其链接到Code :: Blocks?另外,如何在头文件中定义方法?我知道这似乎是一个愚蠢的问题,但我无法在网上找到它。
答案 0 :(得分:0)
假设你因为MinGW而意味着Windows,那并不是那么糟糕。例如,名为“someDllFunction”的“theDLL.dll”中的一个函数需要double
并返回int
,可能会有这样的摘录:
//dllfunctions.h
int someDllFoo(double d) {
auto dll = LoadLibraryW(L"theDLL");
if (!dll) {
//error
}
using FooType = int(*)(double);
auto func = (FooType)GetProcAddress(dll, "someDllFunction");
if (!func) {
//error
}
int result = func(d);
if (!FreeLibrary(dll)) {
//error
}
return result;
}
//whatever.cpp
#include "dllfunctions.h"
int main() {
int result = someDllFoo(3.2);
}
你可以通过编写更通用的调用者来进一步做到这一点。以下内容不适用于void返回类型,因为它分配结果,但这是可添加的:
template<typename Ret, typename... Args>
Ret callDllFunction(const std::wstring &dllName, const std::string &funcName, Args... args) {
auto dll = LoadLibraryW(dllName.c_str());
if (!dll) {
//error
}
using FuncType = Ret(*)(Args...);
auto func = (FuncType)GetProcAddress(dll, funcName.c_str());
if (!func) {
//error
}
Ret result = func(args...);
if (!FreeLibrary(dll)) {
//error
}
return result;
}
int main() {
//tested example
callDllFunction<int>(L"user32", "MessageBoxW", nullptr, nullptr, nullptr, 0);
}
应该工作,或者至少是在正确的轨道上。当然,正如我所说,在添加其他版本之前,这对void返回类型不起作用。您也可以为__stdcall函数扩展它。同样,建立一个错误机制是一个好主意,这样就可以处理DLL错误中的函数。如果它是使用SetLastError
的内容,则可能会被FreeLibrary
调用覆盖。这实际上取决于你究竟需要做什么。您也可以考虑将dll
放入一个在函数结束时调用FreeLibrary
的智能指针。