我正在使用由程序员提供的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的定义,除了我试着看看如何解决这个问题,但我发现几乎没有 - 这让我觉得我看起来不对。
欢迎任何提示。
答案 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);
}