ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Windows® の COM を使ったプログラミング

この例では、Windows® でコンポーネント オブジェクト モデル (COM) を使ってプログラミングする方法を示します。

COM は、オブジェクト指向のテクノロジーの集合であり、自身のアプリケーション ソリューション内に異なるベンダーからのアプリケーション特有のコンポーネントを統合するためのソフトウェア開発ツールです。

COM は、比較的容易な方法で 1 つのアプリケーション内への大きく異なる機能の統合を支援します。たとえば、開発者は、COM を使用することで、あるベンダーのデータベースアクセス コンポーネントと、別のベンダーのビジネス グラフ コンポーネントを選び、さらに別のベンダーが開発した数値解析パッケージにこれらを統合することができます。

COM は、再利用可能なバイナリ ソフトウェアのコンポーネントをアプリケーションに統合するための枠組みを提供します。コンポーネントは、コンパイルされたコードで実装されるため、COM をサポートする多くのプログラミング言語のうちのどの言語を使ってもソース コードを記述することができます。アプリケーションのアップグレードは、該当するアプリケーション全体の再コンパイルの必要はなく、単にコンポーネントを交換するだけで済むため簡単に行えます。これに加え、コンポーネントの場所はアプリケーションから透過的であるため、コンポーネントを別のプロセスやリモート システムに移行した場合もアプリケーションを修正する必要はありません。

オートメーションは、COM クライアントとサーバー間の通信の手法です。IDispatch と呼ばれる単一の標準 COM インターフェイスを使用します。クライアントは、このインターフェイスを使って COM オブジェクトにサポートされているメソッドとプロパティについての情報入手、呼び出しおよびアクセスを行います。IDispatch を使って通信を行うクライアントとサーバーは、オートメーション クライアントおよびオートメーション サーバーと呼ばれています。IDispatch は、MATLAB® でサポートされている唯一のインターフェイスです。カスタム インターフェイスおよびデュアル インターフェイスはサポートされません。MATLAB は、オートメーション サーバーとコントロールの両方と通信できます。

例の要件

この例は Windows® システム上のみで動作します。この例では、Microsoft® Excel® も必要です。

MWSamp2 オブジェクトは、MATLAB のインストール中に既に登録されています。ただし、この例では、COM コンポーネントとの動作についての概要をよりよく理解するため、ユーザーはコントロールも登録する必要があるとしています。さらに、regsvr32.exe が DOS パス上にあることも前提にしています。次の手順に従って、マシン上にコンポーネントを登録してください。

1."regsvr32 < path >" コマンドを実行します。ここで、< path > はコンポーネントと共に提供される ocx/dll ファイルへの絶対パスです。

2.MATLAB を再起動します。

if ~ispc
   errordlg('COM Example is for PC only.')
   return
end

cmd = sprintf('regsvr32 /s "%s"', ...
   fullfile(matlabroot,'toolbox','matlab','winfun',computer('arch'),'mwsamp2.ocx'));

[s,c] = dos(cmd);

MATLAB® における COM オブジェクトの作成

次のコマンドを使って、MATLAB でオートメーション制御オブジェクトとオートメーション サーバー オブジェクトを作成します。

% Create an Automation control object and put it in a figure.
hf = figure;
title('ActiveX Sample Control')
ax = gca;
ax.XTick = [];
ax.YTick = [];
box on
fp = hf.Position;
mwsampPosition = [0.13 0.11 0.77 0.81].*fp([3 4 3 4]) ;
mwsamp = actxcontrol('MWSAMP.MwsampCtrl.2', mwsampPosition+1, hf)

% Create an Automation server object.
hExcel = actxserver('excel.application')

COM オブジェクトのプロパティの表示

COM オブジェクトのプロパティは、関数 GET を使って MATLAB コマンド ウィンドウに表示することができ、プロパティ インスペクターを使ってグラフィカルに表示されます。プロパティ インスペクターの動作については、この例のグラフィカル インターフェイスの節をご覧ください。

get(mwsamp)

COM オブジェクト プロパティの変更

COM オブジェクトのプロパティは、関数 SET を使って変更することができます。

% This makes the Excel(R) Automation server application visible.
set(hExcel,'Visible',1)

関数 SET は、COM オブジェクトへのハンドルが引数として渡される場合にのみ構造体配列を返します。

out = set(mwsamp)

関数 SET を使って COM オブジェクトの複数のプロパティを同時に変更することもできます。

set(mwsamp,'Label','Mathworks Sample Control','Radius',40)

列挙型プロパティ タイプの表示と変更

関数 SET と GET を使って、列挙値のあるプロパティを表示、変更することができます。

get(hExcel,'DefaultSaveFormat')

関数 SET を使って、特定プロパティに設定できる列挙値をすべて表示することができます。

set(hExcel,'DefaultSaveFormat')

関数 SET は、列挙型をサポートするプロパティに列挙値を設定するためにも使用できます。

set(hExcel,'DefaultSaveFormat','xlWorkbookNormal');

COM オブジェクトに対するカスタム プロパティの作成

MATLAB で COM オブジェクトのカスタム プロパティを作成できます。たとえば、Excel COM オブジェクトへのハンドルを MWSamp2 コントロールのプロパティにしたり、MWSamp2 コントロールへのハンドルを Excel COM オブジェクトのプロパティにしたりすることができます。

addproperty(mwsamp,'ExcelHandle');
addproperty(hExcel,'mwsampHandle');
addproperty(mwsamp,'TestValue');
set(mwsamp,'ExcelHandle',hExcel);
set(mwsamp,'TestValue',rand);
set(hExcel,'mwsampHandle',mwsamp);
get(hExcel,'mwsampHandle')
get(mwsamp,'ExcelHandle')
get(mwsamp,'TestValue')

関数 ADDPROPERTY を使って作成されるカスタム プロパティは、削除することもできます。

deleteproperty(mwsamp,'TestValue');

COM オブジェクトのメソッドの表示

関数 INVOKE、METHODS および METHODSVIEW を使って、COM オブジェクトのメソッドを MATLAB で表示することができます。METHODSVIEW は、COM オブジェクトへのメソッドをグラフィカルに表示する方法を提供します。関数 METHODSVIEW の動作については、この例のグラフィカル インターフェイスの節をご覧ください。

invoke(hExcel)
methods(mwsamp)

COM オブジェクトのメソッドは、次のいずれかの方法で呼び出すことができます。

関数 INVOKE を使用する

hExcelWorkbooks = get(hExcel,'Workbooks');
hExcelw = invoke(hExcelWorkbooks, 'Add');

メソッド名を使用する

hExcelRange = Range(hExcel,'A1:D4');
set(hExcelRange,'Value',rand(4));

参照による引数渡し

COM オブジェクトによっては、出力としても使用される引数をもつメソッドを提供するものがあります。これは、参照による引数渡しと呼ばれます。MATLAB では、出力をメソッドの呼び出しからの戻り値として送信することにより、これを行います。

MATLAB オートメーション サーバーの GetFullMatrix メソッドは、参照によって引数を受け取る COM メソッドの例です。この例では、MATLAB で参照による引数渡しが行われる方法を示します。

% Register MATLAB session as the automation server version.
regmatlabserver;

hmatlab = actxserver('matlab.application.single')
invoke(hmatlab)
get(hmatlab)

PutFullMatrix、Execute および GetFullMatrix メソッドを使って、オートメーション サーバーとして実行されている MATLAB と対話します。

Execute(hmatlab,'B2 = round(100*rand(1+round(10*rand)))')

次の手順で、MATLAB オートメーション サーバーから取得する配列のサイズを手動で確認することなく決定できます。

Execute(hmatlab,'[r,c] = size(B2); B2_size = [r,c];');
[B_size, z_none] = GetFullMatrix(hmatlab,'B2_size','base',[0 0],[0,0]);

サイズが決定されたので、GetFullMatrix メソッドを使って B2 データを取得できます。

[B, z_none] = GetFullMatrix(hmatlab,'B2','base',zeros(B_size),[0,0])
delete(hmatlab)

イベント処理

オートメーション制御に関連付けられているイベントはイベント ハンドラー ルーチンに登録することができ、オートメーション制御オブジェクトを MATLAB で作成した後に登録解除することもできます。

events(hExcel)

次のコマンドで、MWSamp2 でサポートされているイベントのうちの 5 つをイベント ハンドラー e_handler.m に登録します。

dbtype e_handler.m 1:3
registerevent(mwsamp, {'Click' 'e_handler';...
   'DblClick' 'e_handler';...
   'MouseDown' 'e_handler';...
   'Event_Args' 'e_handler'})
eventlisteners(mwsamp)

別の方法としては、最初にすべてのイベントを登録し、その後、不要なイベントを登録解除します。最初に、オートメーション制御をイベントが何も登録されていない元の状態に復元します。

unregisterallevents(mwsamp)
eventlisteners(mwsamp)

次に、この COM オブジェクトがサポートするすべてのイベントをイベント ハンドラー e_handler.m に登録します。

registerevent(mwsamp,'e_handler')
eventlisteners(mwsamp)

最後に、不要なイベントを登録解除します。

unregisterevent(mwsamp,{'Event_Args' 'e_handler';...
   'MouseDown' 'e_handler'})
eventlisteners(mwsamp)

エラー処理

メソッドを呼び出すときにエラーが発生した場合、COM オブジェクトでサポートされている場合には、スローされたエラーはソース、エラーの説明、ソース ヘルプ ファイル、ヘルプのコンテキスト ID を表示します。

set(hExcelw,'Saved',1);
invoke(hExcelWorkbooks,'Close')
try
   Open(hExcelWorkbooks,'thisfiledoesnotexist.xls')
catch e
   disp(e.message)
end

COM オブジェクトの破棄

COM オブジェクトは、オブジェクトへのハンドルまたはオブジェクトのインターフェイスのいずれかへのハンドルが関数 DELETE へ渡されると、MATLAB で破棄されます。特定のオブジェクトまたはインターフェイスで使用されるリソースは、オブジェクトまたはインターフェイスのハンドルが関数 RELEASE に渡されると解放されます。

WHOS コマンドを使って MATLAB ワークスペースの内容を表示することにより、関数 RELEASE および DELETE を使用する前後に COM オブジェクトとインターフェイス ハンドルを確認できます。

whos mwsamp hExcel
release(hExcelw)
whos mwsamp hExcel
Quit(hExcel)
delete(hExcel);
delete(mwsamp);
close
whos mwsamp hExcel
この情報は役に立ちましたか?