整个类中的GetProcAddress函数用法

时间:2015-08-09 07:22:11

标签: c++ getprocaddress

我正在使用由程序员提供的DLL,它提供了我想在我的应用程序中使用的某些功能。只要我在同一个.cpp文件中使用导入的函数,下面的代码就可以工作 - 但不是在所有单独的类中都使用:

main.h

typedef void(*SendChat)(char*);

的main.cpp

SendChat _SendChat;

HINSTANCE hMain = 0;
BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
    if(reason == DLL_PROCESS_ATTACH)
    {
        _beginthread(WorkerThread,0,NULL);

        hMain = LoadLibraryA("calculate.dll");
        if (hMain)
            _SendChat = (SendChat)GetProcAddress(hMain, "SendChat");
    }
    if (reason == DLL_PROCESS_DETACH)
    {
        //..
    }
    return 1;
}

当我在main.cpp中使用它时,_SendChat可以正常工作,但是只要我在下面的类中使用它就不起作用:

client.h

#include "main.h"

client.cpp

#include "client.h"

void MyClient::Send(char* Message)
{
    _SendChat(Message);
}

这是有道理的,因为在client.cpp中没有_SendChat的定义,除了我试着看看如何解决这个问题,但我发现几乎没有 - 这让我觉得我看起来不对。

欢迎任何提示。

2 个答案:

答案 0 :(得分:1)

要修复编译错误,您需要声明变量_SendChat在您要使用它的文件中可见。在main.h之后typedef void(*SendChat)(char*);,您可以写下以下内容:

extern SendChat _SendChat;

答案 1 :(得分:0)

工作解决方案的最小路径是在main.h文件中将_SendChat声明为extren。这告诉编译器这个变量名是有效的并在某处声明,链接器会在链接时对其进行排序:

extern SendChat _SendChat;

然而,这样做会使你的全局命名空间变得混乱而不是一个好公民。我认为你应该把你的DLL函数放到他们自己的命名空间或类中,让一切都共享它。

<强> DLLFuncs.h

typedef void(*SendChatFunc)(char*);

namespace DLLFunctions
{
  SendChatFunc SendChat;
}

<强>的main.cpp

#include "DllFuncs.h"

HINSTANCE hMain = 0;
BOOL WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID)
{
    if(reason == DLL_PROCESS_ATTACH)
    {
        _beginthread(WorkerThread,0,NULL);

        hMain = LoadLibraryA("calculate.dll");
        if (hMain)
            DLLFunctions::SendChat = (SendChatFunc)GetProcAddress(hMain, "SendChat");
    }
    if (reason == DLL_PROCESS_DETACH)
    {
        //..
    }
    return 1;
}

<强> client.cpp

#include "client.h"
#include "DLLFuncs.h"

void MyClient::Send(char* Message)
{
    DLLFunctions::SendChat(Message);
}