2015-08-09 3 views
-1

Я использую DLL, предоставленную другим программистом, который предлагает определенные функции, которые я хочу использовать в своем приложении. Ниже код работает до тех пор, как я использую импортируемые функции в одном файле .cpp - но не на протяжении всех отдельных классов:Использование функции GetProcAddress во всех классах

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

Это имеет смысл, так как нет никакого определения _SendChat нигде в client.cpp кроме я пытался, глядя, как решить это, но я не нашел ничего, что заставляет меня думать, что я не выгляжу правильно.

Любые подсказки приветствуются.

+0

Глядя на ваш код, я предполагаю, что вы строите dl л. Вы отлаживали в MyClient :: Send и проверяли точки _SendChat на значение в возвращаемом значении GetProcAddress()? – XPD

+0

Вы получаете компиляцию или ошибку времени выполнения? Какая ошибка? –

+0

Ошибка компилятора: «_SendChat: идентификатор не найден» в client.cpp. – Roel

ответ

1

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

extern SendChat _SendChat; 
+0

Действительно, как только я прочитал это, я подумал, почему я сам не думал об этом. Большое спасибо. Иногда я не должен слушать всех программистов С вокруг меня, слишком сложный взгляд на вещи. Еще раз спасибо. – Roel

0

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