在Code :: Blocks中使用头文件访问DLL

时间:2013-05-06 01:07:34

标签: c++ dll header codeblocks

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

1 个答案:

答案 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的智能指针。