В общем, фигня такая. Есть большая необходимость использовать 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-файлы. Может кто чем поможет? Или вот такое предложение: взять и написать всем миром. Скажем, по файлу на одного человека.
По поводу статей на этом сайте... Сам подход, описанный в статьях по программированию игр, на мой взгляд, абсолютно тупиковый! Реализовывать вызовы методов интерфейсов с помощью множества неповоротливых макросов (DD4INVOKE, DDS4INVOKE, и т.д. - для каждого интерфейса свой!) очень плохая идея, да к тому же ещё не предусматривающая возможность "играть" регистрами для оптимизации. Зачем тогда вообще писать всё это на ASM'е? Тот пример кода, что я привёл выше - самый естественный. Любой интерфейс COM - это просто СТРУКТУРА (struc/ends)! Можно ещё реализовать макросы DECLARE_INTERFACE/DECLARE_METHOD, чтобы было подобно оригинальным H-файлам. И незачем изобретать всякие извращения! Rustem, за линк спасибо, - есть где полазить... Правда под MASM32 там мало что интересного.
Интерфейс COM — упорядоченный набор функций с чётко определёнными прототипами. Структура (я так понимаю, имеется в виду то, что в C++ называется таблицей виртуальных методов) — реализация доступа к ним. Зачем писать программы, использующие COM, на языке ассемблера? Потому что можем! Если макросы кажутся корявыми, напиши свои. «Что тебе мешает выдумать порох непромокаемый?»
Вот именно: IDirectDrawPalette STRUC ;IUnknown methods IUnknown <> ;наследование в MASM32, гы-гы ;IDirectDrawPalette methods GetCaps PTR_PROTO(WORD, WORD) ? GetEntries PTR_PROTO(WORD, WORD,WORD,WORD,WORD) ? Initialize PTR_PROTO(WORD, WORD,WORD,WORD) ? SetEntries PTR_PROTO(WORD, WORD,WORD,WORD,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 на языке ассемблера не намного сложнее, чем на пресловутом С++. А вот качество кода намного выше! Кроме того, в ассемблере не так остро стоит проблема оптимизации, да и отлаживать программы куда проще.
и чем же проще? Любой интерфейс COM это соглашение, которое обязана поддерживать реализация. В коде же выглядит это как список указателей на методы реализации интерфейса на который указывет поинтер на интерфейс . Если не залезать в реализации интерфейсов то отладка одинакова что на асме что на VB имхо.
Я имел ввиду, что отладка программ на ASM'е вообще несколько проще, чем в C++ (в прочем, это для меня так, можете со мной не соглашаться). Но не это главное! Насколько я понимаю, этот сайт посвящён программированию на ассемблере, а не на Delphi, VB, и проч. высокоуравневой пурге. По-этому и вопрос поставлен о программировании COM именно на MASM32. Просто, я рассчитываю на помощь энтузиастов, каковым и сам немного являюсь.