Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Minchanin-Bel
5 / 5 / 1
Регистрация: 19.09.2010
Сообщений: 173
#1

Вызов метода класса из DLL - C++

25.12.2015, 19:21. Просмотров 448. Ответов 2
Метки нет (Все метки)

Добрый вечер. Имеется длл, в которой есть:

1. Класс, содержащий метод
2. Функция, возвращающая объект этого класса

Если п.2 реализуется через GetProcAddress, то как обратиться к полю класса, если при попытке обращения к нему возникает ошибка LNK2019? Как понимаю, реализацию методов не видно в DLL для данного класса. Как это исправить?

Ниже код, проблема возникает на 31 строке третьего файла(main.cpp).

8.2 DLL.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef MY82DLL_EXPORTS
#define MY82DLL_API __declspec(dllexport)
#else
#define MY82DLL_API __declspec(dllimport)
#endif
 
#include <iostream>
#include <string>
#include <bitset>
 
#define ALPABET_SIZE 26
 
class MY82DLL_API CMy82DLL{
public:
    CMy82DLL();
    void getDrives(std::wstring* str);
    ~CMy82DLL();
};
 
extern "C" MY82DLL_API void GetDrives(std::wstring* str);
extern "C" MY82DLL_API CMy82DLL* Create();
8.2 DLL.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "8.2 DLL.h"
 
MY82DLL_API void GetDrives(std::wstring* str){
    return;
};
 
CMy82DLL* Create(){
    return (new CMy82DLL);
};
 
CMy82DLL::CMy82DLL(){}
 
void CMy82DLL::getDrives(std::wstring* str){
    return;
};
 
CMy82DLL::~CMy82DLL(){}
main.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "afxwin.h"
#include "..\8.2 DLL\8.2 DLL.h"
#include <iostream>
 
class CMyWinApp :public CWinApp{
public:
    CMyWinApp(){}
 
    virtual BOOL InitInstance(){
        std::wstring MsgFromDll;            // в эту переменную будет помещено сообщение из функции DLL
        CMy82DLL(*pCreate)();
        HMODULE hDll = AfxLoadLibrary(L"8.2 DLL.dll");  // загрузка DLL
 
        if (hDll == NULL){
            AfxMessageBox(L"Error on DLL load");
            FreeModule(hDll);           // освобождает память, которую занимаемает DLL
            return FALSE;
        };
        AfxMessageBox(L"DLL loaded successfully");
 
        (FARPROC&)pCreate = GetProcAddress(hDll, "Create"); 
 
        if (pCreate == NULL){
            AfxMessageBox(L"Unable to load function Create from DLL");
            FreeModule(hDll);           // освобождает память, которую занимаемает DLL
            return FALSE;
        };
 
        CMy82DLL classObj = pCreate();
 
        classObj.getDrives(&MsgFromDll);                // вызов метода из класса
        AfxMessageBox(const_cast<TCHAR*>(MsgFromDll.c_str()));  
 
        FreeModule(hDll);       
 
        return TRUE;
    };
};
 
CMyWinApp mainApp;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2015, 19:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов метода класса из DLL (C++):

Вызов метода класса из метода другого класса - C++
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Вызов метода класса без создания экземпляра класса. - C++
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов. Я это делаю с помощью new - delete. Мне...

Вызов метода внутреннего класса методом внешнего класса - C++
Не могу разобраться как реализовать вложенный класс и как его вызвать. Занимаюсь по Лафоре, про вложенные классы ничего, а задача в конце...

Вызов динамического метода класса по указателю на объект класса - C++
Как это можно сделать? И хотелось бы как можно проще.

Вызов метода базового класса из класса-потомка - C++
Нужно вызывать из метода, переопределенного в потомке, соответствующий метод базового класса. При этом они являются виртуальными. Вот...

2
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
25.12.2015, 19:42 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
CMy82DLL(*pCreate)();
Цитата Сообщение от Minchanin-Bel Посмотреть сообщение
CMy82DLL* Create();
Найди отличие
Надо
C++
1
2
typedef CMy82DLL * (*pCreateType)();
pCreateType pCreate;
Во-вторых:
C++
1
pCreate = (pCreateType)GetProcAddress(hDll, "Create");
В третьих:
C++
1
2
CMy82DLL * classObj = pCreate();
classObj->getDrives(&MsgFromDll);                // вызов метода из класса
Работать кстати это будет только если dll и программа собраны одним компилятором с совместимым ABI.
Для переносимого (относительно) решения смотри сюда: Интерфейсы в с++ дайте кто нибудь годный рабочий пример

Добавлено через 9 минут
Кстати твой пример работать все равно не будет, т.к. линкер не увидит определения функции. Так что вариант по ссылке фактически единственный нормальный способ это обеспечить
2
Minchanin-Bel
5 / 5 / 1
Регистрация: 19.09.2010
Сообщений: 173
25.12.2015, 20:13  [ТС] #3
DrOffset, спасибо Вам большое, все получилось!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2015, 20:13
Привет! Вот еще темы с ответами:

Вызов метода класса - C++
main.cpp: #include &quot;Processor.h&quot; int main() { pr.show(); //здесь пишет ошибку return 0; }

STL вызов метода класса - C++
Доброго времени суток!:) У меня есть класс, в нем поле вектор пар, я хочу реализовать метод вывода этого вектора внутри класса, но что-то...

Вызов метода класса из main - C++
Как вызвать функцию plus в меин? пробовал вариант р3.=р3.plus(p1,p2), но не получилось #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Вызов метода родительского класса - C++
Всем доброго вечера! Читаю Р. Лафоре. Он пишет: Т.е. исходя из этого, можно предположить, что производный класс имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.