Views Foundation > ActiveX コントロールをグラフィック・オブジェクトとして Rogue Wave Views アプリケーションに追加する > 例を使った Rogue Wave Views アプリケーションの説明 > 手順 2:オブジェクト•インターフェースの取得
 
手順 2:オブジェクト•インターフェースの取得
この手順では、IOleObject インターフェース - 挿入できるすべてのコントロールに存在します - を取得して、Ctrl-i に連結されるアクセラレーターを介して、ユーザーのタイプ名を印刷します。
IlvGraphicCOMAdapter クラスでは、2 つのインターフェースだけを直接使用します。すなわち、IOleObject および IViewObject です (ATL API ではさらに多くのインターフェースを使用します)。ただし、このコントロールによって提供される機能を使用するため、新しいインターフェースを要求することは可能です。それを行うには、IlvGraphicCOMAdapter::queryInterface メンバー関数を使用します。この関数は単に、同じパラメーターおよび同じ戻り値を持つ COM 関数 QueryInterface のカプセル化したものです。
以下にコードを示します。
// --------------------------------------------------------------------------
// This function, associated to an accelerator, gets the user type name of
// the control and prints it.
static void
GetTypeAccelerator(IlvManager* man, IlvView*, IlvEvent& ev, IlvAny)
{
// Gets the object above which is the mouse pointer.
IlvGraphic* graphic = man->lastContains(IlvPoint(ev.x(), ev.y()));
// Any object?
 
if (graphic) {
// Is it an IlvGraphicCOMAdapter?
IlvGraphicCOMAdapter* adapt=
ILVDYNAMICCAST(IlvGraphicCOMAdapter*, graphic);
 
if (adapt) {
// Queries for the IOleObject interface.
IOleObject* pInterface;
HRESULT hr =
adapt->queryInterface(IID_IOleObject, (void**)&pInterface);
// Smart pointer.
IlvCOMInterface<IOleObject> oleObject(pInterface);
 
// Succeeded?
if (SUCCEEDED(hr)) {
// Asks for the user type name.
LPOLESTR userType;
hr = oleObject->GetUserType(USERCLASSTYPE_FULL, &userType);
 
// Succeeded?
if (SUCCEEDED(hr)) {
// Prints the result.
IlvCOut << "The type is:" << userType << ".\n";
// Asks for the global allocator.
LPMALLOC pMalloc;
if (SUCCEEDED(CoGetMalloc(1, &pMalloc))) {
// Releases the memory allocated by GetUserType.
pMalloc->Free(userType);
// Releases the global allocator.
pMalloc->Release();
}
}
}
}
}
}
UNICODE で文字列を印刷するため、次のオペレータも定義します。
// --------------------------------------------------------------------------
// This operator prints wchar_t strings into a standard ostream.
ostream&
operator<<(ostream& o, const wchar_t* str)
{
size_t len = wcslen(str);
size_t size = wcstombs(0, str, len) + 1;
char* buf = new char[size];
wcstombs(buf, str, len+1);
o << buf;
delete[] buf;
return o;
}
ここからわかるように、このコードの大半は純粋な COM のコードです。このコードではスマート•ポインターを使用して、インターフェースのリリースに関する懸念を回避します。
ここでは、クラス IlvCOut を使用します。したがって、ヘッダー•ファイル ilviews/base/error.h のインクルードが必要です。

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.