-1

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

主文件

typedef void(*SendChat)(char*);

主文件

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 时,它可以工作并执行它应该做的事情,但是一旦我在以下类中使用它,它就不起作用:

客户端.h

#include "main.h"

客户端.cpp

#include "client.h"

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

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

欢迎任何提示。

4

2 回答 2

1

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

extern SendChat _SendChat;
于 2015-08-09T08:28:01.700 回答
0

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

extern SendChat _SendChat;

但是,这样做会使您的全局命名空间变得混乱,而不是成为一个好公民。我认为您应该真正将您的 DLL 函数放入它们自己的命名空间或类中,并让一切共享它。

DLLFuncs.h

typedef void(*SendChatFunc)(char*);

namespace DLLFunctions
{
  SendChatFunc SendChat;
}

主文件

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

客户端.cpp

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

void MyClient::Send(char* Message)
{
    DLLFunctions::SendChat(Message);
}
于 2015-08-09T08:35:13.877 回答