Створення COM компонента на Visual C + + h2>
Воробйов Станіслав p>
У цій статті я хотів би описати створення простенького
COM компонента на Visual C + +, він, в принципі, нічого корисного робити не буде,
він просто послужить моделлю для створення COM'ов, які будуть більш
функціанальнимі. p>
Отже приступимо, відкрийте Visual C + +, в меню New
виберіть ATL COM AppWizard, потім напишіть в поле Project Name: MyCom та натисніть
Ok. У цьому Wizard'е всього 1 крок, ви повинні вибрати тип, виберіть DLL, ви також
можете, наприклад, додати підтримку MFC, але ми не будемо цього робити, так як наш
компонент не буде якимось дуже замудреним, він буде простим і буде служити
для ознайомлювальних цілей, тому не треба навантажувати його додатковими
кілобайтами бібліотеки MFC. p>
Проект створений, тепер треба додати в нього COM-об'єкт,
натисніть на Insert в головному меню і виберіть New ATL Object ... p>
Виберіть категорію Objects і об'єкт Simple Object.
Тепер ви бачите діалогове вікно, клацніть на вкладці Names, У сфері Short Name
Введіть ім'я компонента, який ви плануєте створити, Пусь це буде
MyObject, зауважте що всі інші поля заповнюються автоматично,
рекомендується так і залишити. p>
Якщо хочете, можете змінити поле type, це просто опис
COM'а, давайте введемо My first Class. Тепер клацніть на вкладці Attributes, виберіть Single threading model, Custom interface і No Aggregation. Все,
ви створили компонент, ну а тепер треба зробити його робочим. У вкладці
ClassView ви бачите створений вами клас CMyObject і інтерфейс IMyObject, він
потрібний для створення бібліотеки типів. p>
Виберіть інтерфейс IMyObject у вкладці ClassView,
клацніть по ньому правою кнопкою миші і з контекстного меню виберіть Add
Method ... p>
Тепер ви бачите перед собою діалогове вікно Add
Method to Interface, в полі Method Name введіть ShowMessageBox, а в полі
parameters введіть: [in] const BSTR StringToWrite, [out, retval] long
* Result.Поясняю в Кратц цей рядок: [in] вказує на те, що StringToWrite
вводиться в функцію, а [out] на те, що цей параметр повертається, [retval]
означає, що цей параметр буде повертатися всій функцією, це потрібно для
того, щоб компонент міг працювати, наприклад, в середовищі Visual Basic, т.к VB НЕ
підтримує тип даних HRESULT, який повертає ця функція. Замість того
щоб повертати дане типу HRESULT, в VB цей метод поверне дане типу long.
Метод створений. У нашому прикладі він буде показувати користувачеві вікно повідомлення з
текстом, що знаходиться в перемменой StringToWrite. p>
Давайте тепер створимо властивість строкового типу,
яке буде відповідати за заголовок вікна повідомлення, можна було б звичайно в
властивість ShowMessageBox додати іще один [in] параметр, який би відповідав за
це, але щас наша мета розробити демонстраційний компонент, тому створимо
властивість. Клацніть знову по інтерфейсу IMyObject правою кнопкою миші і виберіть
Add Property ... У полі Property Type виберіть BSTR, а в полі Property Name
введіть Caption і клацніть на Ok. У вкладці ClassView виберіть СMyObject-> IMyObject
ви бачите 2 функції: get_Caption, put_Caption. Функція put_Caption викликається, коли ви привласнюєте
властивості Caption нове значення, а get_Caption, коли зчитується. В інтерфейсі
цих функцій не буде, можете щас відкомпілювати проект і зайти в Visual
Basic. P>
Виберіть
в менюProject-> References, знайдіть у списку MyCom 1.0 Type Library відзначте
його галочкою і клацніть на Ok. У модулі напишіть: p>
Dim MyObj As New
MyObject p>
Private Sub
Form_Load () p>
MyObj. p>
End Sub p>
Перед вами відкривається список методів і властивостей, як
бачите тут тільки 1 метод ShowMessageBox і тільки 1 властивість Caption. Ні те
ні інше поки що не працює, тому що ми ще не реалізували метод
ShowMessageBox і функції put_Caption і get_Caption. Давайте змусимо їх
працювати! Спочатку реалізуємо метод ShowMessageBox. У вкладці
ClassViewвиберітеCMyObject-> IMyObject-> ShowMessageBox і напишіть тут
наступний код: p>
_bstr_t
temp (StringToWrite); p>
_bstr_t
caption (m_Caption); p>
* Result = MessageBox (NULL, temp, caption, MB_YESNO | MB_ICONINFORMATION); p>
temp. ~ _bstr_t (); p>
caption. ~ _bstr_t (); p>
return S_OK; p>
Тут ви бачите змінну m_Caption, яку нам
належить створити в майбутньому для зв'язку властивості Caption і компонента, а також
напевно незнайомий клас _bstr_t. _bstr_t надає корисні оператори та
методи для роботи з типом BSTR, але щоб його використовувати ви повинні підключити
header comdef.h, відкрийте MyObject.h і після рядка # include
"resource.h"// main symbols додайте # include "comdef.h".
У цьому коді MessageBox поверне або IDYES або IDNO, залежно від того, на
яку кнопку натисне користувач, і це значення буде повертати функція, т.к
ми написали * Result = MessageBox ..., а Result повертається параметр. Можливо,
тип long для Result був вибраний невірно, так як MessageBox повертає числа від 1 до
9, але як я вже казав, цей компонент - просто тест. Тепер залишилося
реалізувати функції put_Caption і get_Caption. Щоб це зробити, треба спочатку
додати в клас CMyObject захищену змінну m_Caption типу BSTR, її також
не буде в інтерфейсі, але вона буде використовуватися, щоб зберігати те значення,
яке користувач присвоїть властивості Caption. Відкрийте файл MyObject.h і після рядків: p>
public: p>
STDMETHOD (get_Caption )(/*[ out, retval] */BSTR
* pVal); p>
STDMETHOD (put_Caption )(/*[ in] */BSTR newVal); p>
STDMETHOD (ShowMessageBox )(/*[ in] */const BSTR
StringToWrite,/* [out, retval] */long * Result); p>
напишіть: p>
protected: p>
BSTR m_Caption; p>
Тут же в конструкторі класу напишіть: p>
_bstr_t
temp ( "Just a test !"); p>
m_Caption = temp.copy (); p>
temp. ~ _bstr_t (); p>
Тепер мінлива m_Caption ініціалізірованна, за
умовчанням в ній буде знаходитися рядок "Just a test!". Ну а зараз
можна нарешті заповнити функції get_Caption і put_Caption. Відкрийте файл
MyObject.cpp, знайдіть там функцію get_Caption і напишіть у ній: p>
* pVal = m_Caption; p>
return S_OK; p>
Тепер знайдіть функцію put_Caption і напишіть в ній
наступне: p>
m_Caption = newVal; p>
return S_OK; p>
Ну ось і все в принципі, тепер можна компілювати
компонент. p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net/
p>