IDXGISwapChain::GetBuffer как обратиться к методу на языке ассемблера.

Тема в разделе "LANGS.C", создана пользователем CrawlUp, 26 авг 2018.

  1. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Желательно в формате Fasma. Получил я ссылку на Объект(com) а как к его методам добраться?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Код (Text):
    1. interface IWebBrowser2,\
    2.     QueryInterface,AddRef,Release,GetTypeInfoCount,GetTypeInfo,GetIDsOfNames,Invoke,GoBack,GoForward,GoHome,GoSearch,Navigate,Refresh,Refresh2,Stop,get_Application,get_Parent,get_Container,get_Document,get_TopLevelContainer,\
    3.     get_Type,get_Left,put_Left,get_Top,put_Top,get_Width,put_Width,get_Height,put_Height,get_LocationName,get_LocationURL,get_Busy,Quit,ClientToWindow,PutProperty,GetProperty,get_Name,get_HWND,get_FullName,get_Path,get_Visible,\
    4.     put_Visible,get_StatusBar,put_StatusBar,get_StatusText,put_StatusText,get_ToolBar,put_ToolBar,get_MenuBar,put_MenuBar,get_FullScreen,put_FullScreen,Navigate2,QueryStatusWB,ExecWB,ShowBrowserBar,get_ReadyState,get_Offline,\
    5.     put_Offline,get_Silent,put_Silent,get_RegisterAsBrowser,put_RegisterAsBrowser,get_RegisterAsDropTarget,put_RegisterAsDropTarget,get_TheaterMode,put_TheaterMode,get_AddressBar,put_AddressBar,get_Resizable,put_Resizable
    6.  
    Код (Text):
    1.  
    2. locals
    3. iWebBrowser2 IWebBrowser2
    4. endl
    5. pushdata pbinIID_IWebBrowser2,MIDL_INTERFACE D30C1661-CDAF-11d0-8A3E-00C04FC9E26E
    6.     lea eax,[iWebBrowser2]
    7.     cominvk browserObject,QueryInterface,[pbinIID_IWebBrowser2],eax
    8. popdata
    9. test eax,eax
    10. .if ZERO?
    11.     lea eax,[vtUrl]
    12.     invoke VariantInit,eax
    13.     mov [vtUrl.vt],VT_BSTR
    14.     pushdatanp du 'about:blank'\,0
    15.         invoke SysAllocString,esp
    16.     popdata
    17.     mov DWORD[vtUrl.value],eax
    18.     cominvk iWebBrowser2,Navigate2,addr vtUrl,0,0,0,0
    минус пара макросов так примерно. interface и cominvk стоковые макросы фасма. В примерах в комплекте фасма есть ddraw, там com используется, можешь это посмотреть.
     
  3. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    От нефиг делать даже покажу.
    Гуглишь "IDXGISwapChain filetype:h"
    Находишь https://github.com/apitrace/dxsdk/blob/master/Include/dxgi.h
    В нем:
    Код (Text):
    1. #else     /* C style interface */
    2.  
    3.     typedef struct IDXGISwapChainVtbl
    4.     {
    5.         BEGIN_INTERFACE
    6.      
    7.         HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
    "C style interface" удобней брать, там с учетом всех наследований начиная с IUnknown все методы:
    Код (Text):
    1.  
    2.         HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
    3.             IDXGISwapChain * This,
    4.             /* [in] */ REFIID riid,
    5.             /* [annotation][iid_is][out] */
    6.             _COM_Outptr_  void **ppvObject);
    7.      
    8.         ULONG ( STDMETHODCALLTYPE *AddRef )(
    9.             IDXGISwapChain * This);
    10.      
    11.         ULONG ( STDMETHODCALLTYPE *Release )(
    12.             IDXGISwapChain * This);
    13. ...
    Выписываешь их внимательно:
    Код (Text):
    1. interface IDXGISwapChain,\
    2. QueryInterface,\
    3. AddRef,\
    4. Release,\
    5. SetPrivateData,\
    6. SetPrivateDataInterface,\
    7. GetPrivateData,\
    8. GetParent,\
    9. GetDevice,\
    10. Present,\
    11. GetBuffer,\
    12. SetFullscreenState,\
    13. GetFullscreenState,\
    14. GetDesc,\
    15. ResizeBuffers,\
    16. ResizeTarget,\
    17. GetContainingOutput,\
    18. GetFrameStatistics,\
    19. GetLastPresentCount
    А потом задумываешься тот ли ты язык выбрал :)

    Если не передумал:
    Код (Text):
    1. locals
    2.     iDxgiSwapChain IDXGISwapChain
    3. endl
    4. mov [iDxgiSwapChain],<твой адрес объекта> ;вообще они обычно с других интерфейсов должны получаться
    5. cominvk iDxgiSwapChain,Release
     
    Последнее редактирование: 27 авг 2018
    betrayer и CrawlUp нравится это.
  4. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Спасибо за подробное объяснение, без него я бы точно долго разбирался.
    Когда выбирал с какого языка начать изучать программирование оказалось что в ассемблере хоть что-то понятно, начал с него. Сейчас решил расширить свою базу знаний дополнив его C++,
    и мат при изучении этого языка звучит так же часто как и на работе. Частенько приходится использовать метод научного тыка, что бы всё начало компилироваться. Ну надеюсь это временное явление.
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Когда я пытаюсь в студии что-то делать, у меня тот же голый апи в сишном синтаксисе получается. Асм вырабатывает вредные привычки. Что касается com - там на самом деле дофига нюансов, в которых я так и не понял как в хидерах разбираться. Где-то вариант нужно правильно инициализировать, где-то нет, где-то вариант указателем передается методу, где-то прямо в аргументы вываливается. Где-то строку можно так сунуть, где-то подойдет только строка, полученная SysAllocString. То, что в студии делается просто, на фасме будешь вымучивать. Выручает только vbs, где можно использовать нужный метод, поставить на него бряк и посмотреть правильные аргументы.
     
  6. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    А какое отношение ко всей этой петрушке имеет GUID. Допустим я сейчас пытаюсь вызвать метод
    Код (Text):
    1.  
    2. //Visual Studio
    3. hr = g_pSwapChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer );
    4. // Мой вызов на Fasm  
    5. cominvk iDXGISwapChain,GetBuffer,0,iD3D11Texture2D,[adrBuffTargetView];
    Во втором аргументе если смотреть ассемблерный листинг Visual Studio передается какой-то адрес из смещение GUID_6f15aaf2_d208_4e89_9ab4_489535d34f9c. Я знаю что GUID идентефикатор который присваивается com объекту при его создании, но он никакого участия не принимает при объявлении интерфейса на ассемблере.
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Вообще-то у каждого интерфейса есть такой же ид, через CoCreateInstance или QueryInterface по нему интерфейс создается. Здесь по всей видимости может быть куча разных версий ppSurface, вот ид нужного интерфейса, с которым умеешь работать, ты и заказываешь. Макрос чтоб эти идентификаторы объявлять:
    Код (Text):
    1. macro MIDL_INTERFACE value {
    2.     match arg1-arg2-arg3-arg4-arg5,value \{
    3.     dq    0x\#arg1 + (0x\#arg2 * 0x100000000)        + (0x\#arg3 * 0x1000000000000),\
    4.         (0x\#arg4 and 0x00FF) shl 8                + (0x\#arg4 and 0xFF00)    shr 8 +\
    5.         (0x\#arg5 and 0xFF0000000000) shr 24    + (0x\#arg5 and 0xFF00000000) shr 8 +\
    6.         (0x\#arg5 and 0xFF000000) shl 8            + (0x\#arg5 and 0xFF0000) shl 24 +\
    7.         (0x\#arg5 and 0xFF00) shl 40            + (0x\#arg5 and 0xFF) shl 56 \} }
    Этот идентификатор статичный
    https://github.com/apitrace/dxsdk/blob/master/Include/d3d11.h
    Код (Text):
    1.     MIDL_INTERFACE("6f15aaf2-d208-4e89-9ab4-489535d34f9c")
    2.     ID3D11Texture2D : public ID3D11Resource
     
    Последнее редактирование: 27 авг 2018
  8. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Казалось бы ларчик просто открывался, но нет. Всё же я что-то не до понял.
    Код (Text):
    1.  
    2. //функция в которой создаются объекты из неё получаю указатель на объект
    3.  invoke D3D11CreateDeviceAndSwapChain,0,D3D_DRIVER_TYPE_HARDWARE,0,0,fLevels,\
    4.                  3,D3D11_SDK_VERSION,_sd,_pSwapChain,_pd3dDevice,_featureLevel,_pImmediateContext
    5. ......
    6. mov eax,_pSwapChain;
    7. mov [iDXGISwapChain],eax
    8. cominvk iDXGISwapChain,GetBuffer, 0,IID_ID3D11Texture2D,[adrBuffTargetView]
    9.  
    если смотреть код в отладчике в итоге происходит вызов [eax+24], но у меня там пустота, а в Visual Studio код из библиотеки dxgi.dll, т.е. com объект который находится в этой библиотеки, у меня не как не задействован. Какая же функция соединяет мои интерфейсы с их библиотекой?
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Ты взял указатель на объект и сунул его в указатель. Передавай функции сразу указатель на объект.
    Код (Text):
    1. include 'win32ax.inc'
    2. ...
    3. invoke D3D11CreateDeviceAndSwapChain,0,D3D_DRIVER_TYPE_HARDWARE,0,0,fLevels,\
    4.                  3,D3D11_SDK_VERSION,_sd,addr iDXGISwapChain,_pd3dDevice,_featureLevel,_pImmediateContext
    5. ...
    6. cominvk iDXGISwapChain,GetBuffer, 0,IID_ID3D11Texture2D,[adrBuffTargetView]
     
    CrawlUp нравится это.
  10. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Вроде всё уже разжовано, пережёвано, но каменный цветок всё равно не выходит. Проверял, перепроверял свою программу и ошибок вроде нет,
    все возвращаемые значение правильные, все аргументы функций такие как в работающем примере С++, но когда дело доходит до Render(отрисовки)
    в задний буфер помещаются данные, метод выдаёт исключение и связано оно с тем что когда идет обращение к [iD3D11RenderTargetView+C0h] внутри вызова
    в моём случае там ноль, а в примере С++ какой-то адрес. Заполнение заднего буфера цветом не работает.
    Вот значимый код и исходник на всякий случай, открывать в Sublime Text3 форматирование 4. Чтобы он был в удобочитаемом виде.

    Код (Text):
    1.  
    2. .......
    3. ;Цикл сообщений
    4. @@:
    5.                  cmp[_msg.message],WM_QUIT;
    6.                  jz .exit;
    7.                  ;
    8.                  invoke PeekMessageW,_msg,0,0,0,PM_REMOVE
    9.                  test eax,eax;
    10.                  jz .render;
    11.                  invoke TranslateMessage,_msg;
    12.                  invoke DispatchMessageW,_msg;
    13.                  jmp @b;
    14.             .render:
    15.                  stdcall Render          
    16.                  jmp @b;
    17. ........
    18. proc InitDevice uses ebx esi edi;
    19.             ;Заполнение структуры DXGI_SWAP_CHAIN_DESC :: structure filling DXGI_SWAP_CHAIN_DESC
    20.                  mov [_sd.BufferCount],1;
    21.                  mov [_sd.BufferDesc.Width],WIDTH;
    22.                  mov [_sd.BufferDesc.Height],HEIGHT;
    23.                  mov [_sd.BufferDesc._Format],DXGI_FORMAT_R8G8B8A8_UNORM;
    24.                  mov [_sd.BufferDesc.RefreshRate.Numerator],75;
    25.                  mov [_sd.BufferDesc.RefreshRate.Denominator],1;
    26.                  mov [_sd.BufferUsage],DXGI_USAGE_RENDER_TARGET_OUTPUT;
    27.                  mov eax,[_hwnd];
    28.                  mov [_sd.OutputWindow],eax;
    29.                  mov [_sd.SampleDesk.Count],1;
    30.                  mov [_sd.SampleDesk.Quality],0;
    31.                  mov [_sd.Windowed],TRUE;
    32.             ;Создаем устройства device,swapcain,contest и получаем указатели на созданные объекты
    33.                 ;                    
    34.                  invoke D3D11CreateDeviceAndSwapChain,0,D3D_DRIVER_TYPE_HARDWARE,0,0,fLevels,\
    35.                  3,D3D11_SDK_VERSION,_sd,iDXGISwapChain,iD3D11Device,_featureLevel,iD3D11DeviceContext
    36.        
    37.             ;Cоздаем объект заднего буфера
    38.                  cominvk iDXGISwapChain,GetBuffer,\
    39.                                                 0,IID_ID3D11Texture2D,iD3D11Texture2D;
    40.        
    41.                  cominvk iD3D11Device,CreateRenderTargetView,\
    42.                                                  [iD3D11Texture2D],0,iD3D11RenderTargetView;
    43.                  cominvk iD3D11Texture2D,Release;
    44.            ;Подключаем объект заднего буфера к контексту
    45.                  cominvk iD3D11DeviceContext,OMSetRenderTargets,\
    46.                                                  1,iD3D11RenderTargetView,0;
    47.             ;Настройка и подключение вьюпорта
    48.                  mov [_vp.Width], 100.0;
    49.                  mov [_vp.Height],100.0;
    50.                  mov [_vp.MinDepth],0.0;
    51.                  mov [_vp.MaxDepth],1.0;
    52.                  mov [_vp.TopLeftX],0.0;
    53.                  mov [_vp.TopLeftY],0.0;                              
    54.                  cominvk iD3D11DeviceContext,RSSetViewports,\
    55.                                                  1,_vp;
    56.                  xor eax,eax;
    57.         ret;
    58.         endp;
    59. ;_________Render________________________________________________________________4
    60.     ;Рисование кадра
    61.     proc Render ;
    62.             ;Очищаем задний буфер
    63.             cominvk iD3D11DeviceContext,ClearRenderTargetView,\          ;<======== НЕ РАБОТАЕТ
    64.             iD3D11RenderTargetView,ClearColor;
    65.             ;устанавливаем задний буфер на экран
    66.                  cominvk iDXGISwapChain,Present,0,0;
    67.     ret;
    68.     endp;
    69.  
    70.  
    71. ..... data
    72.  
    73.  ClearColor          dd 0.0,0.0,1.0,1.0;
    74.  
    И ещё один момент не понятен, но возможно в будущем решится сам собой. Хочу что бы вывод directx занимал не всё окно а квадрат 100 на 100, и везде указываю этот размер. Но он в любом случае занимает всё окно.
     

    Вложения:

    • BlueSquare.ASM
      Размер файла:
      16,4 КБ
      Просмотров:
      734
    Последнее редактирование: 29 авг 2018
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Указатель на указатель ты обычно передаешь при создании объекта. При передаче методу значение указателя. Логика такая. Можно в отладчике было посмотреть на чем крашится.
    Код (Text):
    1. cominvk iD3D11DeviceContext,ClearRenderTargetView,[iD3D11RenderTargetView],ClearColor
    Код (Text):
    1.  
    2. invoke GetModuleHandleA,0
    3. invoke CreateWindowExA,0,szStatic,szNull,WS_VISIBLE+WS_CHILD,0,0,100,100,[hwnd],0,eax,0
    4. mov [hChildWindow],eax
    5. ...
    6. mov eax,[hChildWindow]
    7. mov [_sd.OutputWindow],eax;  
    8.  
     

    Вложения:

    • BlueSquare.ASM
      Размер файла:
      14,6 КБ
      Просмотров:
      767
    CrawlUp нравится это.
  12. CrawlUp

    CrawlUp Member

    Публикаций:
    0
    Регистрация:
    1 фев 2018
    Сообщения:
    90
    Спасибо большое, за помощь, сейчас посмотрел на код C++ а ведь действительно скобок то и не хватало.