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");
}
};