类 中的 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);
}
我正在使用一位程序员同事提供的 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);
}