1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Как изучить технологию COM ?

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 17 окт 2018.

  1. M0rg0t

    M0rg0t Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    536
    Брался за эту технологию раза 4. Каждый раз мозг вскипает и я отступаю. Как можно осилить эту технологию, при условии, что я не знаю ООП и С++? Свои компоненты я писать не планирую, мне бы просто понять, как юзать те, что уже есть в винде. Ну вот пример
    https://docs.microsoft.com/en-us/wi...core/nf-shobjidl_core-ifileoperation-copyitem

    Делаю копипаст оттуда, собираю
    Код (Text):
    1. cannot convert from 'const CLSID' to 'const IID *const '
    2. too few arguments for call
    3. Release' : is not a member of 'IFileOperation'
    Как такое может быть, что код с мсдн не собирается в 2008 студии? Настройки все по дефолту. Причем последние две ошибки вообще удивили - это какой-то новый компонент, или с версии в версию винды меняется к-тво аргументов и методы объекта? В общем, еще раз попробую, если не пойдет, значит не судьба.
     
  2. CrawlUp

    CrawlUp Member

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

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    468
    Какие заголовки подключены?
    Собираешь в C или C++, поскольку эта ошибка обычно появляется когда собираешь на C (код в мсдн на C++). В C нужно напрямую через виртуальную таблицу вызывать вместе с передачей объекта, также там нет __uuidof:
    Код (C):
    1. HRESULT CopyItem(__in PCWSTR pszSrcItem, __in PCWSTR pszDest, PCWSTR pszNewName)
    2. {
    3.     //
    4.     // Initialize COM as STA.
    5.     //
    6.     HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
    7.     if (SUCCEEDED(hr))
    8.     {
    9.         IFileOperation *pfo;
    10.  
    11.         //
    12.         // Create the IFileOperation interface
    13.         //
    14.         hr = CoCreateInstance(&CLSID_FileOperation,
    15.                               NULL,
    16.                               CLSCTX_ALL,
    17.                               &IID_IFileOperation,
    18.                               &pfo);
    19.         if (SUCCEEDED(hr))
    20.         {
    21.             //
    22.             // Set the operation flags. Turn off all UI from being shown to the
    23.             // user during the operation. This includes error, confirmation,
    24.             // and progress dialogs.
    25.             //
    26.             hr = pfo->lpVtbl->SetOperationFlags(pfo, FOF_NO_UI);
    27.             if (SUCCEEDED(hr))
    28.             {
    29.                 //
    30.                 // Create an IShellItem from the supplied source path.
    31.                 //
    32.                 IShellItem *psiFrom = NULL;
    33.                 hr = SHCreateItemFromParsingName(pszSrcItem,
    34.                                                  NULL,
    35.                                                  &IID_IShellItem,
    36.                                                  &psiFrom);
    37.                 if (SUCCEEDED(hr))
    38.                 {
    39.                     IShellItem *psiTo = NULL;
    40.  
    41.                     if (NULL != pszDest)
    42.                     {
    43.                         //
    44.                         // Create an IShellItem from the supplied
    45.                         // destination path.
    46.                         //
    47.                         hr = SHCreateItemFromParsingName(pszDest,
    48.                                                          NULL,
    49.                                                          &IID_IShellItem,
    50.                                                          &psiTo);
    51.                     }
    52.                  
    53.                     if (SUCCEEDED(hr))
    54.                     {
    55.                         //
    56.                         // Add the operation
    57.                         //
    58.                         hr = pfo->lpVtbl->CopyItem(pfo, psiFrom, psiTo, pszNewName, NULL);
    59.  
    60.                         if (NULL != psiTo)
    61.                         {
    62.                             psiTo->lpVtbl->Release(psiTo);
    63.                         }
    64.                     }
    65.                  
    66.                     psiFrom->lpVtbl->Release(psiFrom);
    67.                 }
    68.              
    69.                 if (SUCCEEDED(hr))
    70.                 {
    71.                     //
    72.                     // Perform the operation to copy the file.
    73.                     //
    74.                     hr = pfo->lpVtbl->PerformOperations(pfo);
    75.                 }      
    76.             }
    77.          
    78.             //
    79.             // Release the IFileOperation interface.
    80.             //
    81.             pfo->lpVtbl->Release(pfo);
    82.         }
    83.  
    84.         CoUninitialize();
    85.     }
    86.     return hr;
    87. }
    88.  
    В COM первым аргументом передается ссылка на объект, а сама таблица методов содержится по этому адресу (указатель на интерфейс). Ты вызываешь метод напрямую - так не пойдет, т.к. тут нет ООП - нужно все делать руками. Получаешь указатель на таблицу методов lpVtbl и затем уже вызываешь нужный метод, передавая первым параметром указатель на объект (интерфейсный указатель).
    Вот еще по теме создание COM библиотеки на чистом C без каких-либо зависимостей и вызов из VB6. Также в той теме есть примеры работы на ассемблере и вообще там целая дискуссия на эту тему.
     
    M0rg0t и TermoSINteZ нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.765
    M0rg0t,
    1. WASM.IN "Публикации" "COM и OOP"
    2. Win x64 Tutorial #37f: video-player and Component Object Model
    3. Глава 4. Объектно-ориентированное программирование глава из "Турбо Ассемблер 3.0/tasm/#1-2. Руководство пользователя"
    4. Object-Oriented Programming example (Win32 Asm) статья с сайта AsmGuru62
    5. Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI статья igorsk
    6. Методы реализации ООП на низком уровне топик на wasm.in
    7. Win32 OOP ASM Source Code Generator 47k Generates Object-Oriented ASM source code for:
      • Base class.
      • Derived class.
    8. Object Oriented Programming In Assembly статья Martyn.Rae
    9. Object-Oriented Programming in Assembly Language статья Randall Hyde
    10. RSDN.ORG COM/DCOM/COM+ Сборник статей
      • Основы
      • Исследования
      • Практика
      • Проблемы
      • COM и Script
     
    inginegr и M0rg0t нравится это.