答案 0 :(得分:5)
我假设您正在使用Windows。在WINAPI中,您有LoadLibrary和GetProcAddress个函数。这是一个example用法
答案 1 :(得分:1)
答案 2 :(得分:1)
我知道你知道DLL函数签名而你没有标题。
对于具有已知签名的给定函数dll_function
:
long dll_function(long, long, char*, char*);
您可以使用Windows API中的LoadLibrary
和GetProcAddress
,例如以下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,则需要使用其他人建议的LoadLibrary
和GetProcAddress
。