我已经实现了一个简单的dll项目,在visual studio 2010中添加了两个数字。我已经在dll文件中实现了添加功能,并编写了.def文件来导出添加功能。 其次,我使用visual studio 2010创建了另一个控制台应用程序,该应用程序调用在上面的dll文件和不同位置创建的add函数。 问题是如何加载这个位于.exe文件中不同位置的dll文件。
答案 0 :(得分:1)
我认为您需要使用LoadLibrary
HMODULE hmDLL = LoadLibrary(TEXT("path\\to\\your\\.dll"));
您可能必须使用GetProcAddress
来定位您希望从DLL调用的函数。
typedef YourFuncReturnType (*YourFuncPtr)(FunctionArgType1, FunctionArgType2);
YourFuncPtr ptr = (YourFuncPtr)GetProcAddress(hmDLL, "YourFunctionName");
YourFunctionReturnType ret = ptr(arg1, arg2);
当你完成它时FreeLibrary
FreeLibrary(hmDLL);
假设我有一个DLL,在那个DLL中我有一个函数,Foo
DLL.cpp
DLLEXPORT int Foo(int a, int b)
{
return a + b;
}
我有另一个项目,我希望从我的DLL访问函数Foo
Program.cpp
#include <Windows.h>
#include <iostream>
// Define the pointer type for the function Foo
typedef int (*funcptr)(int, int);
char g_szDLLPath[] = "path\\to\\foo.dll";
int main() {
HMODULE hmDLL = LoadLibrary(g_szDLLPath);
if(NULL != hmDLL) {
funcptr fooPtr = (funcptr)GetProcAddress(hmDLL, "Foo");
if(NULL != fooPtr) {
int result = fooPtr(5, 10);
if(result == 15)
std::cout << "Yay! Foo worked as expected!" << std::endl;
else
std::cout << "What the deuce! Foo returned " << result << std::endl;
result = fooPtr(10, 10);
if(result == 20)
std::cout << "Yay! Foo worked as expected!" << std::endl;
else
std::cout << "What the deuce! Foo returned " << result << std::endl;
} else {
perror("Error Locating Foo");
return -1;
}
} else {
perror("Error Loading DLL");
return -1;
}
return 0;
}