Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2012, 14:52   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию DLL и структуры

Как экспортировать структуру в DLL это понятно:

Код:
extern "C" __declspec(dllexport) struct Test
{
     public:
     int Test;
};
А вот как её использовать. Как создать её экземпляр в программе. Или как создать указатель на эту структуру в программе. Просто в инете много раз слышал, что можно сделать функцию в DLL которая возвращает указатель на эту структуру. Вот как в программе его объявить я что то разобраться не могу. Всё написано а как это сделать нет.

Загрузка DLL явная.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 19.07.2012, 16:13   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Как экспортировать структуру в DLL это понятно:
Под явной загрузке я понимаю речь идет о LoadLibrary()? В таком случае надо будет експротировать не структуру а функцию, которая будет возрващать указатель на екземпляр структуры.

Делать dllexport описания структуры смысла нет.

Можно попробовать сделать dllexport переменной такого типа (в принципе так и делается) и потом попробовать через GetProcAddress() получить адрес - эдакая GetVarAddress получится. Не знаю сработает или нет, теоретически должно, на практике я так никогда не делал.
waleri вне форума Ответить с цитированием
Старый 19.07.2012, 19:35   #3
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Да я что то все равно не догоняю.

DLL
Код:
struct Test
{
public:
	void get();
	int Value;
};

Test test;

extern "C" __declspec(dllexport) Test *getStr()
{
	return &test;
}
Main.cpp

Код:
#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
	HINSTANCE dll = LoadLibrary(L"DLL.dll");


	FreeLibrary(dll);
	system("PAUSE");
	return 0;
}
Как получить то указатель на экземпляр класса.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 19.07.2012, 20:39   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Думаю так:
Код:
// МойКласс.h
struct Test
{
public:
	void get();
	int Value;
};
Код:
#include "МойКласс.h"
...
extern "C" __declspec(dllexport) Test *getStr()
{
	return new test();
}
Код:
#include "МойКласс.h"
...
int main()
{
	HINSTANCE dll = LoadLibrary(L"DLL.dll");
 Test *t=getStr();
 t-> Четтам делаем
 delete t;
	FreeLibrary(dll);
	system("PAUSE");
	return 0;
}
Идея ясна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.07.2012, 20:54   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

как обычно с помощью GetProcAdress()
onewho вне форума Ответить с цитированием
Старый 19.07.2012, 22:01   #6
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Неее пишет что тип неразрешенные внешний символ get();

Вот код:
Код:
//DLL
struct Test
{
public:
	int get();
	int Value;
};


Код:
//cpp
#include <iostream>
#include "StructDLL.h"
using namespace std;

Test *test;

int Test::get()
{
	return Value;
}

extern "C" __declspec(dllexport) Test *getStr()
{
	return new Test;
}




Код:
//main.cpp
#include <Windows.h>
#include <iostream>
#include "StructDLL.h"
using namespace std;

int main()
{
	HINSTANCE dll = LoadLibrary(L"DLL.dll");
	Test*(*getPtr)();
	(FARPROC &)getPtr = GetProcAddress(dll,"getStr");
	Test *test = getPtr();

	test->Value = 10;
	cout << test->get() << endl;

	delete test;
	FreeLibrary(dll);
	system("PAUSE");
	return 0;
}
Вот ошибка:
error LNK2019: ссылка на неразрешенный внешний символ "public: int __thiscall Test::get(void)" (?get@Test@@QAEHXZ) в функции _main C:\Documents and Settings\Admin\Мои документы\Visual Studio 2010\Projects\TestStr\Main\Main.obj Main
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 19.07.2012, 22:19   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а методы кто будет экспортировать?

и при динамической линковке без вирт методов поидее не запашет. ИМХО.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.07.2012, 22:21   #8
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

а на примере можно. Если не сложно
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 19.07.2012, 23:45   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от kineziz Посмотреть сообщение
Да я что то все равно не догоняю.

DLL
Код:
struct Test
{
public:
	void get();
	int Value;
};

Test test;

extern "C" __declspec(dllexport) Test *getStr()
{
	return &test;
}
Main.cpp

Код:
#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
	HINSTANCE dll = LoadLibrary(L"DLL.dll");


	FreeLibrary(dll);
	system("PAUSE");
	return 0;
}
Как получить то указатель на экземпляр класса.
После LoadLibrary() вставьте GetProcAddress("getStr") ну и так далее
waleri вне форума Ответить с цитированием
Старый 20.07.2012, 09:53   #10
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Цитата:
cout << test->get() << endl;
Так не получиться. Тебе же Пепел Феникса написал:
Цитата:
а методы кто будет экспортировать?
Сделай обертку для метода
Код:
extern "C" __declspec(dllexport) void testget()
{
	test.get();
}
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Debugger Kernel BORDBK160.DLL or BORDBK160N.DLL is missing or not registered. Человек_Борща Общие вопросы Delphi 0 15.07.2012 14:01
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) Green Gin Фриланс 2 27.04.2012 15:26
Управляющие структуры. Программирование алгоритмов разветвляющейся структуры. Лёнка Компоненты Delphi 1 23.04.2012 15:03
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36