Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 30.07.2014
Сообщений: 5

Как экспортировать интерфейс из dll

02.08.2014, 19:19. Показов 4963. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
делал всё по примеру в инете, не работает

код интерфейса
C++
1
2
3
4
5
6
struct I_MyInterface
{
   virtual bool  Init(int parms)=0;
   virtual bool  Release()=0;
   virtual void  DoStuff() =0;
};
код dll
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
41
42
43
44
45
46
47
48
49
extern "C"
{
HRESULT  GetMyInterface(I_MyInterface ** pInterface);
typedef HRESULT (*GETINTERFACE)(I_MyInterface  ** pInterface);
 
HRESULT  FreeMyInterface(I_MyInterface ** pInterface);
typedef HRESULT (*FREEINTERFACE)(I_MyInterface ** pInterface);
}
 
 
//============================================================
//Реализация интерфейса в Dll
// MyInterface.h
 
class CMyClass: public I_MyInterface
{
public:
   bool  Init(int parms);
   bool  Release();
   void  DoStuff();
 
   CMyClass();
   ~CMyClass();
 
   //любые другие члены класса
   ............
private:
   //любые члены класса
   ............
};
 
HRESULT GetMyInterface(I_MyInterface ** pInterface)
{
   if(!*pInterface)
   {
      *pInterface= new CMyClass;
      return S_OK;
   }
   return E_FAIL;
}
 
HRESULT FreeMyInterface(I_MyInterface ** pInterface)
{
   if(!*pInterface)
      return E_FAIL;
   delete *pInterface;
   *pInterface= 0;
   return S_OK;
}
клиент
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
41
42
43
44
45
int main(){
 
GETINTERFACE pfnInterface=0;//указатель на функцию GetMyInterface
I_MyInterface * pInterface  =0;//указатель на структуру MyInterface
 
HINSTANCE hMyDll = ::LoadLibrary("myinterface.dll");
 
if(hMyDll != NULL)
{
   //Определяем адрес функции
   pfnInterface= (GETINTERFACE)::GetProcAddress(hMyDll,
          "GetMyInterface");
 
   //Выгружаем DLL, если предыдущая операция окончилась неудачей
   if(pfnInterface == 0)   
   {
      ::FreeLibrary(hMyDll);
      return;
   }
 
   //Вызываем функцию
   HRESULT hr = pfnInterface(&pInterface);
   
   //Выгружаем, если неудачно
   if(FAILED(hr))   
   {   
      ::FreeLibrary(hMyDll);
      return;
   }
 
   //Интерфейс загружен, можно вызывать функции
   pInterface->Init(1);
   pInterface->DoStuff();
   pInterface->Release();
 
   //Освобождаем интерфейс
 
   FREEINTERFACE pfnFree = 
       (FREEINTERFACE )::GetProcAddress(hMyDll,"FreeMyInterface");
   if(pfnFree != 0)
      pfnFree(&hMyDll);
 
   //Выгружаем DLL
   ::FreeLibrary(hMyDll);
}}
пожалуйста покажите как это делать правильно, желательно примерчик, чтобы можно было собрать и посмотреть. очень-очень нужно
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2014, 19:19
Ответы с готовыми решениями:

Как экспортировать структуру из DLL?
Как експортировать структуру из DLL Добавлено через 1 час 5 минут Что же я в тупике?

Как импортировать и экспортировать из dll класс?
Помогите, плз. Создал dll: //... class __declspec(dllexport) a { public : a(); }; a::a() {

Как экспортировать переменную (константу) из dll
Понимаю что очень глупый вопрос, но нету времени.. Как экспортировать константу и потом ее получить, динамически подгрузив библу. ...

5
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2014, 19:25
http://msdn.microsoft.com/ru-r... zzkb6.aspx
0
0 / 0 / 0
Регистрация: 30.07.2014
Сообщений: 5
02.08.2014, 19:40  [ТС]
это не то. я в кодблокс работаю. проблема в том что это даже не компилируется. совсем. после танцев с бубном скомпилилось, но на этапе загрузки длл при получении объекта, всё наступает алес капут
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
02.08.2014, 22:05
все верно вроде.

Добавлено через 20 секунд
Вот только ошибочка
C++
1
2
if(pfnFree != 0)
      pfnFree(&hMyDll);
pfnFree(&pInterface);
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2014, 23:05
C++
1
2
3
4
5
6
struct I_MyInterface
{
   virtual bool  Init(int parms)=0;
   virtual bool  Release()=0;
   virtual void  DoStuff() =0;
};
А есть гарантии что методы (адреса) не будут переставлены компилятором?
(например если собиралось в одном компиляторе а вызываются в другом)
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.08.2014, 23:37
Dobbermann, здесь не помешало бы добавить для
GetMyInterface и FreeMyInterface соглашение о вызовах -
stdcall или cdecl, чтобы они всегда оставались одинаковыми, и
для клиента, и для библиотеки, независимо от настроек компилятора.

Далее.
delete в данном примере работает не так, как Вы думаете.
Строго говоря, по стандарту удалять класс через указатель на
базу, когда она не имеет виртуального деструктора - это
неопределенное поведение (UB).

И еще.
Почему нельзя вместо HRESULT и каких-то корявых плясок с двойной
косвенностью указателей сразу вернуть клиенту <I_MyInterface *>,
либо NULL в случае ошибки ?

А за код вида
C++
1
if(!*pInterface)
надо карать, причем лучше как-нибудь изощренно, чтобы осталась
зарубка: лаконично - не значит интуитивно понятно.

Ну и напоследок я бы посоветовал почитать про устройство COM
(Component Object Model) и поизучать на низком уровне, как там
сделан экспорт интерфейсов, переносимым образом между практически
любыми компиляторами и средами. Может, глядишь, и отпала бы нужда
городить свой велосипед, тем более такой, извиняюсь, корявый...
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.08.2014, 23:37
Помогаю со студенческими работами здесь

Как экспортировать функцию из dll? У меня ошибка выдаётся
Как экспортировать ф-ю из dll? У меня ошибка выдаётся

Народ подскажите, чета я забыл DLL как экспортировать
Вот например есть в DLL код функции: void OpenAbout(HINSTANCE hInst, int cmdMode, HWND hWnds) { .... return; }

Как экспортировать класс из DLL
Проблема в следующем есть класс написанный на С++, который надо поместить в DLL. Во - первых : неясно как этот класс...

Как экспортировать функции фреймфорка в DLL
Добрый день! Вот уже через неделю сдаю работу, хотелось бы чтобы клиент не &quot;таскал&quot; за собой &quot;гигантский&quot; фреймворк. ...

Как экспортировать COM-интерфейсы из чужой сторонней DLL? А этот "Import a Type Library" падает
Доброй ночи! Есть некая DLL от компании Intel. По некоторым сведениям там есть COM-объект и имеются интерфейсы/константы/перечисления....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru