DirectX и COM-интерфейсы в MASM32

Тема в разделе "WASM.BEGINNERS", создана пользователем LShadow77, 5 окт 2010.

  1. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    В общем, фигня такая. Есть большая необходимость использовать DirectX в программах на MASM32. Примерно так:

    .............................
    include DirectX\ddraw.inc
    .............................
    mov ebx,offset IDD
    mov esi,[ebx]
    assume esi:ptr IDirectDraw
    ............................
    invoke [esi].SetCooperativeLevel,ebx, hAppWnd,DDSCL_EXCLUSIVE
    ............................

    Одна беда, где взять инклюды. Желательно, чтобы полностью повторяли структуру соответствующих хедеров C++.
    Я вижу всего три пути:
    1) заняться ручным переписыванием (а там оч-чень много, влом)
    2) писать собственный КРУТОЙ конвертор (писанины немеряно, тоже влом)
    3) найти уже готовые и выложенные кем-то добрым INC-файлы.
    Может кто чем поможет?

    Или вот такое предложение: взять и написать всем миром. Скажем, по файлу на одного человека.
     
  2. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    LShadow77
    статьи на этом сайте есть
    еще тут http://extcode.com/
     
  3. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    По поводу статей на этом сайте... Сам подход, описанный в статьях по программированию игр, на мой взгляд, абсолютно тупиковый! Реализовывать вызовы методов интерфейсов с помощью множества неповоротливых макросов (DD4INVOKE, DDS4INVOKE, и т.д. - для каждого интерфейса свой!) очень плохая идея, да к тому же ещё не предусматривающая возможность "играть" регистрами для оптимизации. Зачем тогда вообще писать всё это на ASM'е?
    Тот пример кода, что я привёл выше - самый естественный. Любой интерфейс COM - это просто СТРУКТУРА (struc/ends)! Можно ещё реализовать макросы DECLARE_INTERFACE/DECLARE_METHOD, чтобы было подобно оригинальным H-файлам. И незачем изобретать всякие извращения!

    Rustem, за линк спасибо, - есть где полазить... Правда под MASM32 там мало что интересного.
     
  4. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Интерфейс COM — упорядоченный набор функций с чётко определёнными прототипами. Структура (я так понимаю, имеется в виду то, что в C++ называется таблицей виртуальных методов) — реализация доступа к ним. Зачем писать программы, использующие COM, на языке ассемблера? Потому что можем! :derisive:

    Если макросы кажутся корявыми, напиши свои. «Что тебе мешает выдумать порох непромокаемый?» :derisive:
     
  5. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    Вот именно:

    IDirectDrawPalette STRUC

    ;IUnknown methods
    IUnknown <> ;наследование в MASM32, гы-гы :)

    ;IDirectDrawPalette methods
    GetCaps PTR_PROTO(:lol: WORD, :lol: WORD) ?
    GetEntries PTR_PROTO(:lol: WORD, :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD) ?
    Initialize PTR_PROTO(:lol: WORD, :lol: WORD,:lol: WORD,:lol: WORD) ?
    SetEntries PTR_PROTO(:lol: WORD, :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD) ?
    IDirectDrawPalette ENDS

    Где макрос PTR_PROTO описан в некотором общем файле так:
    IFNDEF PTR_PROTO
    PTR_PROTO MACRO _TypeList:VARARG
    local ProtoType,ProtoPtr
    __?ProtoTypeList textequ <_TypeList>
    IFNB __?ProtoTypeList
    ProtoType TYPEDEF PROTO __?ProtoTypeList
    ELSE
    ProtoType TYPEDEF PROTO
    ENDIF
    ProtoPtr TYPEDEF PTR ProtoType
    EXITM <ProtoPtr>
    ENDM
    ENDIF ;PTR_PROTO

    Неправда ли, изящное решение?

    Если подойти к делу творчески, то программировать с COM на языке ассемблера не намного сложнее, чем на пресловутом С++. А вот качество кода намного выше! Кроме того, в ассемблере не так остро стоит проблема оптимизации, да и отлаживать программы куда проще.
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    и чем же проще?
    Любой интерфейс COM это соглашение, которое обязана поддерживать реализация.
    В коде же выглядит это как список указателей на методы реализации интерфейса на который указывет поинтер на интерфейс .
    Если не залезать в реализации интерфейсов то отладка одинакова что на асме что на VB имхо.
     
  7. LShadow77

    LShadow77 New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    36
    Я имел ввиду, что отладка программ на ASM'е вообще несколько проще, чем в C++ (в прочем, это для меня так, можете со мной не соглашаться). Но не это главное! Насколько я понимаю, этот сайт посвящён программированию на ассемблере, а не на Delphi, VB, и проч. высокоуравневой пурге. По-этому и вопрос поставлен о программировании COM именно на MASM32. Просто, я рассчитываю на помощь энтузиастов, каковым и сам немного являюсь.