如何在运行时链接期间从我的DLL调用函数?

时间:2014-01-15 00:10:08

标签: c++ dll runtime

我不太了解DLL,所以我构建了一个简单的例子,我喜欢一些帮助。我这里有一个简单的dll。

// HelloDLL.cpp

#include "stdafx.h"

int     __declspec(dllexport)   Hello(int x, int y);    

int Hello(int x, int y)
{
    return (x + y);
}

在我运行Hello(int x, int y)后,如何在单独的程序中调用LoadLibrary()功能?这是我到目前为止的粗略布局,但我不确定我所拥有的是否正确,如果是,如何继续。

// UsingHelloDLL.cpp

#include "stdafx.h"
#include <windows.h> 

int main(void) 
{ 
    HINSTANCE hinstLib;  

    // Get the dll
    hinstLib = LoadLibrary(TEXT("HelloDLL.dll")); 

    // If we got the dll, then get the function
    if (hinstLib != NULL) 
    {
        //
        // code to handle function call goes here.
        //

        // Free the dll when we're done
        FreeLibrary(hinstLib); 
    } 
    // else print a message saying we weren't able to get the dll
    printf("Could not load HelloDLL.dll\n");

    return 0;
}

有人可以帮我解决如何处理函数调用吗?我应该注意的任何特殊情况,以便将来使用dll吗?

1 个答案:

答案 0 :(得分:1)

加载库后,您需要找到函数指针。 Microsoft提供的功能是GetProcAdderess。不幸的是,你必须知道功能原型。如果您不知道,我们将一直到COM / DCOM等。可能超出您的范围。

FARPROC WINAPI GetProcAddress( _In_  HMODULE hModule, _In_  LPCSTR lpProcName ); 

所以在你的例子中,你所做的就是这样:

typedef int (*THelloFunc)(int,int);  //This define the function prototype

if (hinstLib != NULL) 
{
    //
    // code to handle function call goes here.
    //

    THelloFunc f = (THelloFunc)GetProcAddress(hinstLib ,"Hello");

    if (f != NULL )
        f(1, 2);

    // Free the dll when we're done
    FreeLibrary(hinstLib); 
}