Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2018.07.01;
Скачать: [xml.tar.bz2];

Вниз

Объявление метода интерфейса с индексом   Найти похожие ветки 

 
Eraser ©   (2013-01-18 20:12) [0]

Суть проблемы такая. Имеется интерфейс с большим числом методов и всякими сложными параметрами (D3D11), заголовочный файл на C++. Переношу на Delphi, в интерфейсе многие методы не нужны, необходимо использовать только штуки 2-3.

Вопрос. Каким образом можно, при объявлении метода интерфейса, указать его индекс, чтобы был корректный вызов.

Например, вот интерфейс

 ID3D11DeviceContext = interface(ID3D11DeviceChild)
   ["{C0BFA96C-E089-44FB-8EAF-26F8796190DA}"]

   procedure CopySubresourceRegion(
     DstResource: ID3D11Resource;
     DstSubresource: UINT;
     DstX: UINT;
     DstY: UINT;
     DstZ: UINT;
     SrcResource: ID3D11Resource;
     SrcSubresource: UINT;
     pSrcBox: PD3D11_BOX); stdcall;
 end;


нужно каким-то образом указать, что он под индексом 40 (если считать с 1), а не первый. вроде бы крутится в голове, что можно было как-то. можно ли?

если оставить как есть, то при вызове этого метода, на самом деле будет вызван реальный первый метод VSSetConstantBuffers.


 
Игорь Шевченко ©   (2013-01-18 20:26) [1]

Индексы это для dispinterface


 
Eraser ©   (2013-01-18 22:39) [2]

пока сделал такое извращение - вроде работает :D
 ID3D11DeviceContext = interface(ID3D11DeviceChild)
   ["{C0BFA96C-E089-44FB-8EAF-26F8796190DA}"]

   procedure DummyMethod_1; stdcall;
   procedure DummyMethod_2; stdcall;
   procedure DummyMethod_3; stdcall;
   procedure DummyMethod_4; stdcall;
   procedure DummyMethod_5; stdcall;
   procedure DummyMethod_6; stdcall;
   procedure DummyMethod_7; stdcall;
   procedure DummyMethod_8; stdcall;
   procedure DummyMethod_9; stdcall;
   procedure DummyMethod_10; stdcall;
   procedure DummyMethod_11; stdcall;
   procedure DummyMethod_12; stdcall;
   procedure DummyMethod_13; stdcall;
   procedure DummyMethod_14; stdcall;
   procedure DummyMethod_15; stdcall;
   procedure DummyMethod_16; stdcall;
   procedure DummyMethod_17; stdcall;
   procedure DummyMethod_18; stdcall;
   procedure DummyMethod_19; stdcall;
   procedure DummyMethod_20; stdcall;
   procedure DummyMethod_21; stdcall;
   procedure DummyMethod_22; stdcall;
   procedure DummyMethod_23; stdcall;
   procedure DummyMethod_24; stdcall;
   procedure DummyMethod_25; stdcall;
   procedure DummyMethod_26; stdcall;
   procedure DummyMethod_27; stdcall;
   procedure DummyMethod_28; stdcall;
   procedure DummyMethod_29; stdcall;
   procedure DummyMethod_30; stdcall;
   procedure DummyMethod_31; stdcall;
   procedure DummyMethod_32; stdcall;
   procedure DummyMethod_33; stdcall;
   procedure DummyMethod_34; stdcall;
   procedure DummyMethod_35; stdcall;
   procedure DummyMethod_36; stdcall;
   procedure DummyMethod_37; stdcall;
   procedure DummyMethod_38; stdcall;
   procedure DummyMethod_39; stdcall;

   procedure CopySubresourceRegion(
     DstResource: ID3D11Resource;
     DstSubresource: UINT;
     DstX: UINT;
     DstY: UINT;
     DstZ: UINT;
     SrcResource: ID3D11Resource;
     SrcSubresource: UINT;
     pSrcBox: PD3D11_BOX); stdcall;
 end;


 
Rouse_ ©   (2013-01-18 22:49) [3]


> Переношу на Delphi, в интерфейсе многие методы не нужны,
>  необходимо использовать только штуки 2-3.

Да какая разница? Объяви интерфейс нормальным способом, тем более послезавтра у тебя появится нюанс в виде того, что метод А (известный тебе) вдруг откуда ни возьмись вызывает
procedure DummyMethod_37; stdcall;
а потом сиди гадай чего там было...
Зачем делать себе больно сразу на этапе разработки?


 
брат Птибурдукова   (2013-01-19 00:10) [4]

dispinterface+dispid не прокатят (правда не знаю)?


 
Eraser ©   (2013-01-19 03:25) [5]


> брат Птибурдукова   (19.01.13 00:10) [4]

реализация то объектов не моя, а MS, так что увы.

> Rouse_ ©   (18.01.13 22:49) [3]

нет абсолютно никакого желания портировать весь direct3d11 на делфи (много тысяч строк кода), итак многое уже портировал, но много меньше даже половины. есть уже готовые порты, но там ужасное качество кода. мне же от этого интерфейса нужен всего один метод.


 
brother ©   (2013-01-19 07:50) [6]

уж не содание и удаление поверхностей ли? :)


 
Dimka Maslov ©   (2013-01-19 11:12) [7]

В советские времена практиковался метод продаж «в нагрузку». Например покупатель хочет купить себе нужную книгу «Детерминисткие принципы вариационного исчисления», но прост так ему не продадут, а только в комплекте с другой книгой, покупателю не нужной, например «Избранные цитаты из речи Л.И. Брежнева на XXV cъезде КПСС».

Или например уже при победившем капитализме, музыкальные записи продавались в виде магнитофонных кассет. Если надо было заиметь одну-две песни, приходилось покупать весь альбом. Даже сейчас, в эпоху массового бесконтрольного распространения музыкальных записей, проще сначала скачать всё, а потом выбрать нужное, нежели рыться по всяким поисковикам и искать именно ту композицию, которую хочется.

Теперь по существу. Такое баловство с интерфейсами в конечном итоге приведёт к конфликту доступа или разрушению стека. Я сам сколько раз пытался «упростить» вызовы и рано или поздно приходил к тому, что надо делать точно так, как в описании интерфейса. Это надёжнее. В данном примере, если нам нужен метод №33, его адрес находится по смещению 33 * SizeOf(Pointer) от указателя на интерфейс, который, в принципе, можно трактовать и как простой массив указателей. При этом при вызове такого метода «напрямую» не стоит забывать, что первым параметром уже явно должен идти указатель на интерфейс. Но это, по моему мнению, опять будет забиванием костыля в железобетонную шпалу. Я бы посоветовал написать на C++ динамическую библиотеку-оболочку, в которой все интефейсы будут нормально реализованы, и которая будет экспортировать только нужне функции. Да, принцип продаж «в нагрузку» тут сохраняется. Но становится контролируемым.


 
Eraser ©   (2013-01-19 14:12) [8]


> Dimka Maslov ©   (19.01.13 11:12) [7]

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

> brother ©   (19.01.13 07:50) [6]

нужен исключительно один метод, тот который я и показал.
есть подозрения, что эмбаркадеро таки портируют сами эти заголовки. очень многое у них уже сделано, только с d3d11 засада.


 
DevilDevil ©   (2013-01-22 09:49) [9]

> Eraser ©

нормальный у тебя способ

плюсую к вопросу "dispinterface+dispid не прокатят ?"
попробуй переименовать interface в dispinterface



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2018.07.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.001 c
15-1473276737
Тимохов Дима
2016-09-07 22:32
2018.07.01
Свой Highlighter для TSynEdit


8-1242059975
noH@ker
2009-05-11 20:39
2018.07.01
О DirectSound


1-1358525546
Eraser
2013-01-18 20:12
2018.07.01
Объявление метода интерфейса с индексом


2-1467746107
dmk
2016-07-05 22:15
2018.07.01
TThread


2-1467622935
Andrey K
2016-07-04 12:02
2018.07.01
Не ищет переменную по Ctrl левая клавиша мыши.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский