Использование функции GetProcAddress во всех классах

Я использую 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, за исключением того, что я пытался найти способ решить эту проблему, но почти ничего не нашел — что заставляет меня думать, что я не выгляжу правильно.

Любые намеки приветствуются.

-1

Решение

Чтобы исправить ошибку компиляции, вам нужно объявить переменную _SendChat быть видимым в файле, где вы хотите его использовать. В main.h после typedef void(*SendChat)(char*); Вы можете написать следующее:

extern SendChat _SendChat;
1

Другие решения

Минимальный путь к рабочему решению должен был бы объявить _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);
}
0

По вопросам рекламы [email protected]