Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Windows APIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 14

Автор А. Π›Π΅Π³Π°Π»ΠΎΠ²

  hr = ::CoCreateInstance(classId, 0, CLSCTX_SERVER, IID_IUnknown, (void**)&_iUnk);

 }

 if (FAILED(hr)) throw HEx(hr, "Couldn't create instance");

}

Π§Π΅Ρ€Π΅Π· ΠΌΠ³Π½ΠΎΠ²Π΅Π½ΠΈΠ΅ я объясню странный Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ HEx.

Π’ нашСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ AcquireInterface просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ QueryInterface ΠΈΠ· IUnknown (ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ я Π³ΠΎΠ²ΠΎΡ€ΡŽ, Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ QueryInterface ΠΈΠ· Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ IUnknown).

void* SObject::AcquireInterface(IID const& iid) {

 void * p = 0;

 HRESULT hr = _iUnk->QueryInterface(iid, &p);

 if (FAILED(hr)) {

  if (hr == E_NOINTERFACE) throw "No such interface";

  else throw HEx(hr, "Couldn't acquire interface");

 }

 return p;

}

ΠœΠ΅Ρ‚ΠΎΠ΄ AcquireInterface β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…, ΠŸΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² УправлСния рСсурсами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‚ рСсурсы. ΠœΡ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΈΠ½Π°Ρ‡Π΅, ΠΊΠ°ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ конструктора ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля интСрфСйса. (ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ шаблона β€” это IID ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ компилятор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ссылки ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ шаблона. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.)

Π˜Ρ‚Π°ΠΊ, имССтся шаблон для ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ указатСля интСрфСйса.

template<class I, IID const * iid>

class SFace {

public:

 ~SFace() {

  if (_i) _i-> Release();

 }

 I* operator->() { return _i; }

protected:

 SFace() : _i(0) {}

 SFace(void * i) {

  _i = static_cast<I*>(i);

 }

protected:

 I * _i;

};

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, этот спСцифичСский шаблон Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ экзСмпляры. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС Π΅Π³ΠΎ конструкторы Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹. Но Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ, ΠΌΡ‹ создадим Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ обСспСчим ΠΈΡ… собствСнными спСциализированными конструкторами.

Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ наш CoObject (ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Π½Π΅Π³ΠΎ) ΠΊΠ°ΠΊ источник интСрфСйса.

template<class I, IID const * iid>

class SObjFace: public SFace<I, iid> {

public:

 SObjFace(CoObject& obj) : SFace<I, iid>(obj.AcquireInterface(*iid)) {}

};

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ класс HEx (HRESULT Exception). Π­Ρ‚ΠΎ β€” класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся способным ΠΊ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Для достиТСния ΠΌΠΎΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ, я просто ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽ сообщСния нСпосрСдствСнно Π½Π° холстС основного экрана. НС Π±ΠΎΠΉΡ‚Π΅ΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ваш собствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ с использованиСм ΠΎΠΊΠ½Π° сообщСний ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Ρ‡Π΅Π³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

class HEx {

public:

 HEx(HRESULT hr, char const * str = 0) : _hr (hr), _str (str) {}

 void Display(int x, int y, Canvas& canvas) {

  if (_str != 0) {

   canvas.Text (x, y, _str);

   y += 20;

  }

  if (FAILED (_hr)) {

   char * msg;

   ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, _hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast<char*>(&msg), 0, 0);

   canvas.Text(x, y, msg);

   ::LocalFree(msg);

  }

 }

private:

 HRESULT _hr;

 char const * _str;

};

Π”Π°Π»Π΅Π΅: Π‘ΡƒΠ΄Π΅Ρ‚ прСдставлСн Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Автоматизация.

ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠ° для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ

Автоматизация

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ А. И. Π›Π΅Π³Π°Π»ΠΎΠ²Π°

Англоязычный ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» находится Π½Π° сСрвСрС ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Reliable Software

МнС Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΎΡ€Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ Microsoft Developers Studio. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ простой Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Ρ‚.ΠΊ. DevStudio, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ прилоТСниям MS, прСдоставляСт Π΅Π³ΠΎ интСрфСйсы Ρ‡Π΅Ρ€Π΅Π· OLE ΠΠ²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ. НС ΡΡ‚ΠΎΠ»ΡŒ просто! Как Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Microsoft Ρ€Π΅ΡˆΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ интСрфСйсов Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ VC ++ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Visual Basic, ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΡƒΠΌΠ½Ρ‹Ρ… мастСров DevStudio. Π―, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, люблю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° C++ (Π’Π°ΠΌ Π½Π΅ каТСтся, Ρ‡Ρ‚ΠΎ Microsoft Visual C++ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ Π² Microsoft Visual MFC Wizard? Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠ·ΠΈΠ»ΠΎ C++ Π΄ΠΎ Ρ€ΠΎΠ»ΠΈ языка сцСнариСв для MFC.)

Π’ любом случаС, ΠΊΠΎΠ³Π΄Π° я выяснил, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ оказалось Π½Π΅ Π±Ρ‹Ρ‚ΡŒ слишком Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹ΠΌ. Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Π³Π΄Π΅ вся нСобходимая информация сохраняСтся Π² рССстрС. Π’ частности IID всСх интСрфСйсов. Π‘ΠΎΠ²Π΅Ρ‚: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ OLE-COM Object Viewer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ поставляСтся с VC ++, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ². Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ, Ссли Π±Ρ‹ Microsoft прСдоставлял исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ obj Ρ„Π°ΠΉΠ»Ρ‹ с опрСдСлСниями ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² интСрфСйсов. Π’ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΆΠ΅ ситуации я Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΈΠ· Object Viewer'Π° ΠΈ Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΡ… Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто. НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

static const IID IID_IApplication = { 

 0xEC1D73A1, 0x8CC4, 0x11CF, { 0x9B, 0xE9, 0x00, 0xA0, 0xC9, 0x0A, 0x63, 0x2C }

};

Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ DevStudio? Π’ Π½Π°Ρ‡Π°Π»Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ OLE ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ класса этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ класса ΠΎΡ‚ систСмы (эта информация хранится Π² рССстрС), Ссли Π·Π½Π°Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, устроСн Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Developer Studio ΠΈΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ "MSDEV.APPLICATION". Π­Ρ‚ΠΎ Ρ‚Π°ΠΊ просто.

ИмСя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ класса, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ наш SObject. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° запуска ΠΊΠ°ΠΊ true, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠΏΠΈΠ΅ΠΉ MSDEV.APPLICATION, Ссли это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ интСрфСйса ΠΈΠ· SObject ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ просто ΠΊΠ°ΠΊ созданиС экзСмпляра шаблона SObjFace с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. Π˜Ρ‚Π°ΠΊ, нашСй ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚, интСрфСйс ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

CLSID idMsDev;

HRESULT hr = ::CLSIDFromProgID(L"MSDEV.APPLICATION", &idMsDev);

if (FAILED (hr)) throw HEx(hr, "Couldn't convert prog id to class id");

SObject obj(idMsDev, true);

SObjFace<IApplication, &IID_IApplication> app(obj);

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ строка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π’Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚Π΅ ΠΊ CLSIDFromProgID, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ Unicode. ΠŸΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ L ΠΏΠ΅Ρ€Π΅Π΄ строковым Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠΌ обСспСчиваСт это.

Π― надСюсь, Ρ‡Ρ‚ΠΎ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ простоту этого ΠΊΠΎΠ΄Π°. Он ΠΏΠΎΡ‡Ρ‚ΠΈ ΡΡ‚ΠΎΠ»ΡŒ ΠΆΠ΅ прост, ΠΊΠ°ΠΊ ΠΈ Π΅Π³ΠΎ VB эквивалСнт.

Dim app as Application

Set app = GetObject(, "MSDEV.APPLICATION")

if (app = NULL)

 Set app = CreateObject("MSDEV.APPLICATION")

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сдСлаСм с этим интСрфСйсом. Π’Π°ΠΊ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ IApplication ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ Visible, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. Когда Π’Ρ‹ устанавливаСтС Visible Π² истину, ΠΎΠΊΠ½ΠΎ прилоТСния становится Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ. НиТС приводится синтаксис для «установки» Ρ‡Π»Π΅Π½Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² OLE Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ обозначСния с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ VARIANT_BOOL ΠΈ VARIANT_TRUE вмСсто bool ΠΈ true. Π­Ρ‚ΠΎ дСлаСтся Ρ€Π°Π΄ΠΈ совмСстимости с Basic (Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π‘ΠΈΠ»Π»Π° счастливым).

VARIANT_BOOL b = VARIANT_TRUE;

app->put_Visible(b);

Как я ΡƒΠ·Π½Π°Π», Ρ‡Ρ‚ΠΎ IApplication ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ Visible? Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ вопрос! Π˜ΠΌΠ΅Π΅Ρ‚ΡΡ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ objmodel Π² VC ++, Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ include, Π³Π΄Π΅ Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ‹ΡΠΊΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ Appauto.h, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат строки, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ΅ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Ρ„Π°ΠΉΠ»Ρ‹. Π˜Ρ… ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠ° связана с (Π³Π»ΡƒΠΏΡ‹ΠΌ!) Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ Π² C, Ρ‚Π°ΠΊ ΠΈ Π² C++ ΠΊΠΎΠ΄. А Microsoft Π½Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Π»Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², поэтому здСсь ΠΌΡ‹ поступаСм Ρ‚Π°ΠΊ.

STDMETHOD(get_Visible)(THIS_ VARIANT_BOOL FAR* Visible) PURE;

STDMETHOD(put_Visible)(THIS_ VARIANT_BOOL Visible) PURE;

Π’Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ дальшС, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π½Π°ΡˆΠΈΡ… Ρ€ΡƒΠΊΠ°Ρ…? Как насчСт выяснСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ являСтся Π² настоящСС врСмя Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ интСрфСйс IApplication Π² качСствС источника, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ OLE ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставит Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚. Π­Ρ‚ΠΎΡ‚ спСцифичСский OLE ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, SActiveDocument, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ источник Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… интСрфСйсов, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся IGenericDocument. ΠœΡ‹ Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ этот интСрфСйс стандартным способом β€” создавая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ шаблона SObjFace. SActiveDocument, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ всСм нашим ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ OLE/COM, наслСдуСт ΠΎΡ‚ CoObject, исходныС интСрфСйсы.

IGenericDocument ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π»Π΅Π½ FullName, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½, Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° get_FullName. К соТалСнию, ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Basic снова наносит ΡƒΠ΄Π°Ρ€: Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ пСрСдаСтся Π² Ρ„ΠΎΡ€ΠΌΠ΅ BSTR, ΠΈΠ»ΠΈ Basic строки. Π― создал Π΄Π²Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… класса BString ΠΈ CString, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ этой ΡΠ²Π΅Ρ€Ρ…ΡŠΠ΅ΡΡ‚Π΅ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΠΈ. Π’ частности BString удостовСряСтся, Ρ‡Ρ‚ΠΎ строка освобоТдСна, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈ этом Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ API SysFreeString.

SActiveDocument docObj(app);

if (docObj) {

 SObjFace<IGenericDocument, &IID_IGenericDocument> doc(docObj);

 BString bPath;

 doc->get_FullName(bPath.GetPointer());

 CString path(bPath);

 canvas.Text(20, y, "Active Document:");

 canvas.Text (200, y, path);

}

Π­Ρ‚ΠΎ типичная ситуация для OLE Автоматизации. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ интСрфСйсный ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния (app Π² Π΄Π°Π½Π½ΠΎΠΌ случаС) Π’Ρ‹ ΠΎΠ²Π»Π°Π΄Π΅Π²Π°Π΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (docObj) ΠΈ Π΅Π³ΠΎ собствСнными интСрфСйсами. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΌΡ‹ создадим Π½ΠΎΠ²Ρ‹ΠΉ класс ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ возмоТностями ΠΈΡ… конструкторов. НапримСр, имССтся класс SActiveDocument.

class SActiveDocument: public DispObject {

public:

 SActiveDocument(SObjFace<IApplication, &IID_IApplicationication> &app) {

  HRESULT hr = app->get_ActiveDocument(&_idisp);

  if (FAILED (hr)) throw HEx(hr, "get_ActiveDocument failed");

 }

};