我在这里遇到了麻烦。我不知道如何在头文件中的 C++ DLL 中链接和定义方法。如何将其链接到 Code::Blocks?另外,如何在头文件中定义方法?我知道这似乎是一个愚蠢的问题,但我在网上的任何地方都找不到。
问问题
1198 次
1 回答
0
假设您因为 MinGW 而指的是 Windows,那还不错。例如,“theDLL.dll”中名为“someDllFunction”的函数接受 adouble
并返回 anint
可能有以下摘录:
//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
于 2013-05-06T01:55:38.673 回答