Я использую 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;
}
_SendChat работает и делает то, что должен делать, когда я использую его в main.cpp, но как только я использую его в следующем классе, он не работает:
client.h
#include "main.h"
client.cpp
#include "client.h"
void MyClient::Send(char* Message)
{
_SendChat(Message);
}
Это имеет смысл, поскольку нигде в файле client.cpp нет определения _SendChat, за исключением того, что я пытался найти способ решить эту проблему, но почти ничего не нашел — что заставляет меня думать, что я не выгляжу правильно.
Любые намеки приветствуются.
Чтобы исправить ошибку компиляции, вам нужно объявить переменную _SendChat
быть видимым в файле, где вы хотите его использовать. В main.h
после typedef void(*SendChat)(char*);
Вы можете написать следующее:
extern SendChat _SendChat;
Минимальный путь к рабочему решению должен был бы объявить _SendChat
как extren
в вашем файле main.h Это говорит компилятору, что это имя переменной допустимо и где-то объявлено, и компоновщик разберут его во время ссылки:
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);
}