如何在C ++中使用没有头的DLL

时间:2011-08-09 14:00:49

标签: c++ eclipse winapi dll mingw

请帮忙。一个有一个DLL文件。我知道它的功能和参数。如何在Eclipse中使用MinGW?

4 个答案:

答案 0 :(得分:5)

我假设您正在使用Windows。在WINAPI中,您有LoadLibraryGetProcAddress个函数。这是一个example用法

答案 1 :(得分:1)

我创建了一个wrapper来简化此类事情。

更新:我完全忘记了这篇文章并删除了博文和相关的源代码。我在这里用一个悬垂的指针结束了; - )

幸运的是,有人做得比我做得好得多:Boost.DLL

答案 2 :(得分:1)

我知道你知道DLL函数签名而你没有标题。

对于具有已知签名的给定函数dll_function

long dll_function(long, long, char*, char*);

您可以使用Windows API中的LoadLibraryGetProcAddress,例如以下C ++代码:

#include <windows.h>
#include <iostream>

typedef long(__stdcall *f_funci)(long, long, char*, char*);


struct dll_func_args {
    long arg1;
    long arg2;
    std::string arg3;
    std::string arg4;
};

// Borrowing from https://stackoverflow.com/a/27296/832621
std::wstring s2ws(const std::string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    std::wstring r(buf);
    delete[] buf;
    return r;
}

int main()
{
    std::string filename = "C:\\...\\mydllfile.dll";
    dll_func_args args;
    args.arg1 = 1;
    args.arg2 = 2;
    args.arg3 = "arg3";
    args.arg4 = "arg4";

   std::wstring tmp = s2ws(filename);
    HINSTANCE hGetProcIDDLL = LoadLibrary(tmp.c_str());

    if (!hGetProcIDDLL)
    {
        std::cerr << "Failed to load DLL" << std::endl;
        return EXIT_FAILURE;
    }

    // resolve function address here
    dll_func_ptr func = (dll_func_ptr)GetProcAddress(hGetProcIDDLL, "dll_function");
    if (!func)
    {
        std::cout << "Failed to load function inside DLL" << std::endl;
        return EXIT_FAILURE;
    }

    std::cout << "Return value " << func(args.arg1, args.arg2, (char *)args.arg3.c_str(), (char *)args.arg4.c_str()) << std::endl;

    return EXIT_SUCCESS;
}

答案 3 :(得分:0)

如果你有适当的.LIB文件,并且你有确切的函数原型,你不需要标题。只需声明自己的功能(可能在您自己的自定义标头中)。直接调用这些功能。链接.LIB文件。 DLL将由OS加载,并且将调用函数。

如果您没有.LIB文件链接到DLL,则需要使用其他人建议的LoadLibraryGetProcAddress