0

我在这里遇到了麻烦。我不知道如何在头文件中的 C++ DLL 中链接和定义方法。如何将其链接到 Code::Blocks?另外,如何在头文件中定义方法?我知道这似乎是一个愚蠢的问题,但我在网上的任何地方都找不到。

4

1 回答 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 回答