类 中的 GetProcAddress 函数用法

GetProcAddress function usage throughout classes

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

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 时,_SendChat 可以正常工作,但当我在下面的 class 中使用它时,它就不起作用了:

client.h

#include "main.h"

client.cpp

#include "client.h"

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

这是有道理的,因为 client.cpp 中的任何地方都没有 _SendChat 的定义,除了我尝试寻找如何解决这个问题,但我几乎什么也没找到 - 这让我觉得我看起来不对。

欢迎任何提示。

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

extern SendChat _SendChat;

有效解决方案的最小途径是在 main.h 文件中将 _SendChat 声明为 extren。这告诉编译器这个变量名是有效的并在某处声明,linker 将在 link 时间将它整理出来:

extern SendChat _SendChat;

但是,这样做会使您的全局名称空间变得混乱,并且不是一个好公民。我认为你真的应该将你的 DLL 函数放入它们自己的命名空间或 class 并让所有东西共享它。

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);
}