如何加载.exe中位于不同位置的.dll

时间:2014-02-28 07:48:36

标签: c visual-studio-2010 dll

我已经实现了一个简单的dll项目,在visual studio 2010中添加了两个数字。我已经在dll文件中实现了添加功能,并编写了.def文件来导出添加功能。 其次,我使用visual studio 2010创建了另一个控制台应用程序,该应用程序调用在上面的dll文件和不同位置创建的add函数。                             问题是如何加载这个位于.exe文件中不同位置的dll文件。

1 个答案:

答案 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;
}