Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 5.00
StarikPro
0 / 0 / 0
Регистрация: 19.02.2008
Сообщений: 9
#1

interface - C++

19.02.2008, 16:08. Просмотров 4690. Ответов 7
Метки нет (Все метки)

Помогите кто чем может! Пишу приложение использующее модули расширения. Программный интерфейс модулей реализован в виде экспортных функций. Данный интерфейс является "входной дверью" обеспечивающий доступ к ресурсам размещённым в модуле. Есть огромная необходимость создания множества подобных дверей. Пытаюсь релизовать поместив все экспортные функции в структуру типа interface. А в экспорт разместил лишь две функции: CreateInterface и DestroyInterface - соответсвенно создание и уничтожение интерфейса. На Делфи удалось реализовать функцию по созданию интерфейса следующим образом:

Delphi
1
2
3
4
5
6
7
8
//сначало определим интерфейс
IDLLInterface = interface(IUnknown)
    ['{AC8948EC-F86D-43e2-96DE-31FC35F96D9E}']//кстати, данный идентификатор (GUID) создаётся нажатием клавиш Ctrl+Shift+G
    procedure Do1; stdcall;
    procedure Do2; stdcall;
    procedure DoN; stdcall;
 
end;
Delphi
1
2
3
4
5
6
7
//теперь класс реализующий функции данного интерфейса
TDLLInterface = class(TObject, IDLLInterface)
  public
    procedure Do1; stdcall;
    procedure Do2; stdcall;
    procedure DoN; stdcall;
end;
В функции CreateInterface помещаю код:
Delphi
1
2
3
4
5
6
7
8
9
10
var
DLLInterface : TDLLInterface; 
IDLL       : IDLLInterface;
begin
 DLLInterface := TDLLInterface.create;
 //функцией из класса TObject получаю указатель на интерфейс 
 DLLInterface.GetInterface(StrToGuid('AC8948EC-F86D-43e2-96DE-31FC35F96D9E'), IDLL); 
 //возвращаем результат
 CreateInterface := IDLL; 
end;
В Builder подобное никак не удаётся проделать.
Пытался реализовывать функции интерфейса как и в классе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DEFINE_GUID(IID_IDLLInterface, 0xAC8948EC, 0xF86D, 0x43e2, 0x96, 0xde, 0x31, 0xfc, 0x35, 0xf9, 0x6d, 0x9e); 
DECLARE_INTERFACE_(IDLLInterface, IUnknown) 
{
public
    void __stdcall Do1(); 
    void __stdcall Do2();
    void __stdcall DoN();
 
}
//реализую методы
void __stdcall IDLLInterface::Do1()
{}
 
void __stdcall IDLLInterface::Do2()
{}
void __stdcall IDLLInterface::DoN()
{}
В функции CreateInterface помещаю код:
C++
1
2
IDLLInterface * DLLInterface = new (IDLLInterface);
// здесь методы доступны и вызываются но из приложения уже нет
С помощью класса TObject не удалось ничего сделать. Хотелось бы чтобы и для VC решение можно было натянуть.
В си подобных языках я делитант поэтому если что не так не судите строго.
:huh:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2008, 16:08     interface
Посмотрите здесь:

Реализация interface - C++
Подскажите, как реализовывать интерфейс на с++. На языке Джава это делается так: public interface NewInterface { void...

IDispatch interface ADODB - C++ COM
Уже приходилось иметь дело с IDispatch при работе с Excel.Application, но теперь решил поработать с ADODB интерфейсами таким же способом....

Фильтр DirectShow. Query Interface выдает E_NOINTERFACE - C++ COM
В общем, ситуация следующая: есть самописный transfer-фильтр DirectShow, который успешно регистрируется в системе и с помощью которого...

Интерфейс класса и ошибка "Unresolved external 'Interface::Read() '" - C++
interface Interface { __int32 Read(); }; //--------------------------------------------------------------------------- ...

Interface - Java SE
Подскажи те плиз чайнику,что надо сделать. У меня есть интерфейс который выглядит так public interface AmortisationSchedule { ...

*interface{} в interface{} - Язык Go
Есть интерфейс, который может принять как тип, так и указатель на тип. С первым вариантом все понятно, а вот в случае указателя на тип я...

Interface Builder 4.2 - Objective-C
добрый день. итак, я занялся изучением Objective-C не так давно, и столкнулся с некоторой проблемой, а именно: я начал изучение с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
19.02.2008, 17:14     interface #2
а в билдере есть же спецовые проекты, он тебе все пропишет, а тебе только методы нужно будет описать...
StarikPro
0 / 0 / 0
Регистрация: 19.02.2008
Сообщений: 9
20.02.2008, 13:06  [ТС]     interface #3
Да, я в курсе по поводу редактора интерфейсов и их методов. Они используются для создания объектов ActiveX и Com. Но мне не нужны все навороты связанные с этими технологиями. Хотелось бы по возможности использовать только лишь понятие интерфейса. Он позволяет снять языковой барьер и соответственно организовать обмен данными между модулями и приложением написанных на разных языках. Теоретически это возможно.

Спасибо за ответ.
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
20.02.2008, 13:09     interface #4
так погоди, библиотеки на сях ты с таким же успехом можешь юзать, где угодно, и без понятия интерфейса тут никак... просто не пойму, чем тебя не устраивает стандартное построение твоих библиотек... пиши тогда на визуал студии, там все более углублено, почти все руками делать надо, без автоматизации....
StarikPro
0 / 0 / 0
Регистрация: 19.02.2008
Сообщений: 9
20.02.2008, 13:38  [ТС]     interface #5
При многопоточном варианте одна библиотека может потребоваться несколько раз в разных потоках. Идея заключается в том чтобы в разных потоках через размножение интерфейсов помещёных в модуль независимо друг от друга работать с ними. Это всё равно что одну и туже длл для каждого случая переименовывать перед загрузкой что заставит систему смапировать новый её образ. Но такой вариант я не уверен что всегда будет работать + размер модуля может быть разным: например в одном сценарии выполняют работу двадцать модулей и десять из них повторяются на различных этапах сценария. В случае переименования модуля умножай объём занимаемой памяти на 10. А ведь некоторые модули могут весить не мало.
При стандартном построении (работать только через экспортные функции) у нас всегда один интерфейс и соответственно если он занят одним из потоков то другим туда уже не обратится.
StarikPro
0 / 0 / 0
Регистрация: 19.02.2008
Сообщений: 9
20.02.2008, 13:50  [ТС]     interface #6
Насчёт вызова - попробую
Lord_Voodoo
Супер-модератор
8584 / 2184 / 61
Регистрация: 07.03.2007
Сообщений: 10,868
Завершенные тесты: 1
20.02.2008, 14:38     interface #7
многопоточность можно и в длл запихнуть, если на то пошло, просто я не знаю твоей задачи, сложно что-то сказать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2009, 14:22     interface
Еще ссылки по теме:

L3 interface j2320 - Juniper
Всем привет! опять я с вопросами с которыми сам не могу разобраться в силу того что нету времени а надо "вчера" имеется j2320 version...

@interface и @property - Objective-C
Здравствуйте! Объясните пожалуйста, вот я накатал класс: @interface Good : NSObject { int c; } @property int a; ...

Создать interface - Java SE
Добрый день помогите решить задачу : Создать interface Зарплата, в котором предусмотреть метод зарплата (). Создать класс Сотрудник с...

StackOverflowException в Interface - C#
Здравствуйте! Есть два интерфейса в разных .cs namespace Deposit { interface IPerson { int...

Не работает interface - PHP
Не работает почему то интерфейс. <?php interface A { public function d(); } interface B


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

Или воспользуйтесь поиском по форуму:
toXXIc
Сообщений: n/a
06.03.2009, 14:22     interface #8
Позвольте поинтересоваться, разрешился ли как-нибудь сей вопрос? У самого сейчас та же проблема.
Yandex
Объявления
06.03.2009, 14:22     interface
Ответ Создать тему
Опции темы

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