ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

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')
set(gca,'Xtick',[],'Ytick',[],'Box','on')
fp = get(hf,'Position');
mwsampPosition = get(hf,'DefaultAxesPosition').*fp([3 4 3 4]) ;
mwsamp = actxcontrol('MWSAMP.MwsampCtrl.2', mwsampPosition+1, hf)

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

 
hExcel =
 
	COM.excel_application

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

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

get(mwsamp)
            Label: 'Label'
           Radius: 20
    Ret_IDispatch: [1x1 Interface.mwsamp2_ActiveX_Control_module._DMwsamp2]

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

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

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

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

out = set(mwsamp)
out = 

            Label: {}
           Radius: {}
    Ret_IDispatch: {}

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

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

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

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

get(hExcel,'DefaultSaveFormat')
ans =

xlOpenXMLWorkbook

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

set(hExcel,'DefaultSaveFormat')
ans = 

    'xlAddIn'
    'xlCSV'
    'xlCSVMac'
    'xlCSVMSDOS'
    'xlCSVWindows'
    'xlDBF2'
    'xlDBF3'
    'xlDBF4'
    'xlDIF'
    'xlExcel2'
    'xlExcel2FarEast'
    'xlExcel3'
    'xlExcel4'
    'xlExcel5'
    'xlExcel5'
    'xlExcel9795'
    'xlExcel4Workbook'
    'xlIntlAddIn'
    'xlIntlMacro'
    'xlWorkbookNormal'
    'xlSYLK'
    'xlTemplate'
    'xlCurrentPlatformText'
    'xlTextMac'
    'xlTextMSDOS'
    'xlTextPrinter'
    'xlTextWindows'
    'xlWJ2WD1'
    'xlWK1'
    'xlWK1ALL'
    'xlWK1FMT'
    'xlWK3'
    'xlWK4'
    'xlWK3FM3'
    'xlWKS'
    'xlWorks2FarEast'
    'xlWQ1'
    'xlWJ3'
    'xlWJ3FJ3'
    'xlUnicodeText'
    'xlHtml'
    'xlWebArchive'
    'xlXMLSpreadsheet'
    'xlExcel12'
    'xlOpenXMLWorkbook'
    'xlOpenXMLWorkbookMacroEnabled'
    'xlOpenXMLTemplateMacroEnabled'
    'xlTemplate'
    'xlOpenXMLTemplate'
    'xlAddIn'
    'xlOpenXMLAddIn'
    'xlExcel8'
    'xlOpenDocumentSpreadsheet'
    'xlOpenXMLWorkbook'

関数 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')
 
ans =
 
	COM.MWSAMP_MwsampCtrl_2

get(mwsamp,'ExcelHandle')
 
ans =
 
	COM.excel_application

get(mwsamp,'TestValue')
ans =

    0.8147

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

deleteproperty(mwsamp,'TestValue');

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

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

invoke(hExcel)
	Calculate = void Calculate(handle)
	DDEExecute = void DDEExecute(handle, int32, string)
	DDEInitiate = int32 DDEInitiate(handle, string, string)
	DDEPoke = void DDEPoke(handle, int32, Variant, Variant)
	DDERequest = Variant DDERequest(handle, int32, string)
	DDETerminate = void DDETerminate(handle, int32)
	Evaluate = Variant Evaluate(handle, Variant)
	ExecuteExcel4Macro = Variant ExecuteExcel4Macro(handle, string)
	Intersect = handle Intersect(handle, handle, handle, Variant(Optional))
	Range = handle Range(handle, Variant, Variant(Optional))
	Run = Variant Run(handle, Variant(Optional))
	SendKeys = void SendKeys(handle, Variant, Variant(Optional))
	Union = handle Union(handle, handle, handle, Variant(Optional))
	ActivateMicrosoftApp = void ActivateMicrosoftApp(handle, XlMSApplication)
	AddCustomList = void AddCustomList(handle, Variant, Variant(Optional))
	CentimetersToPoints = double CentimetersToPoints(handle, double)
	CheckSpelling = bool CheckSpelling(handle, string, Variant(Optional))
	ConvertFormula = Variant ConvertFormula(handle, Variant, XlReferenceStyle, Variant(Optional))
	DeleteCustomList = void DeleteCustomList(handle, int32)
	DoubleClick = void DoubleClick(handle)
	GetCustomListContents = Variant GetCustomListContents(handle, int32)
	GetCustomListNum = int32 GetCustomListNum(handle, Variant)
	GetOpenFilename = Variant GetOpenFilename(handle, Variant(Optional))
	GetSaveAsFilename = Variant GetSaveAsFilename(handle, Variant(Optional))
	Goto = void Goto(handle, Variant(Optional))
	Help = void Help(handle, Variant(Optional))
	InchesToPoints = double InchesToPoints(handle, double)
	InputBox = Variant InputBox(handle, string, Variant(Optional))
	MailLogoff = void MailLogoff(handle)
	MailLogon = void MailLogon(handle, Variant(Optional))
	NextLetter = handle NextLetter(handle)
	OnKey = void OnKey(handle, string, Variant(Optional))
	OnRepeat = void OnRepeat(handle, string, string)
	OnTime = void OnTime(handle, Variant, string, Variant(Optional))
	OnUndo = void OnUndo(handle, string, string)
	Quit = void Quit(handle)
	RecordMacro = void RecordMacro(handle, Variant(Optional))
	RegisterXLL = bool RegisterXLL(handle, string)
	Repeat = void Repeat(handle)
	SaveWorkspace = void SaveWorkspace(handle, Variant(Optional))
	Undo = void Undo(handle)
	Volatile = void Volatile(handle, Variant(Optional))
	Wait = bool Wait(handle, Variant)
	GetPhonetic = string GetPhonetic(handle, Variant(Optional))
	CalculateFull = void CalculateFull(handle)
	FindFile = bool FindFile(handle)
	FileDialog = handle FileDialog(handle, MsoFileDialogType)
	CalculateFullRebuild = void CalculateFullRebuild(handle)
	CheckAbort = void CheckAbort(handle, Variant(Optional))
	DisplayXMLSourcePane = void DisplayXMLSourcePane(handle, Variant(Optional))
	CalculateUntilAsyncQueriesDone = void CalculateUntilAsyncQueriesDone(handle)
	SharePointVersion = int32 SharePointVersion(handle, string)
	MacroOptions = void MacroOptions(handle, Variant(Optional))
methods(mwsamp)
Methods for class COM.MWSAMP_MwsampCtrl_2:

AboutBox             GetVariantArray      addproperty          
AddDouble            GetVariantVector     constructorargs      
Beep                 Redraw               delete               
FireClickEvent       RetErrorInfo         deleteproperty       
FireEventArgs        ReturnVTError        events               
FireMouseDownEvent   SetBSTR              get                  
Fire_Double_Click    SetBSTRArray         interfaces           
GetBSTR              SetI4                invoke               
GetBSTRArray         SetI4Array           load                 
GetI4                SetI4Vector          move                 
GetI4Array           SetIDispatch         propedit             
GetI4Vector          SetR8                release              
GetIDispatch         SetR8Array           save                 
GetR8                SetR8Vector          send                 
GetR8Array           ShowVariant          set                  
GetR8Vector          VariantOfTypeHandle  

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')
 
hmatlab =
 
	COM.matlab_application_single

invoke(hmatlab)
	GetFullMatrix = [SafeArray Pointer(double), SafeArray Pointer(double)] GetFullMatrix(handle, string, string, SafeArray Pointer(double), SafeArray Pointer(double))
	PutFullMatrix = void PutFullMatrix(handle, string, string, SafeArray(double), SafeArray(double))
	Execute = string Execute(handle, string)
	MinimizeCommandWindow = void MinimizeCommandWindow(handle)
	MaximizeCommandWindow = void MaximizeCommandWindow(handle)
	Quit = void Quit(handle)
	GetCharArray = string GetCharArray(handle, string, string)
	PutCharArray = void PutCharArray(handle, string, string, string)
	GetWorkspaceData = Variant(Pointer) GetWorkspaceData(handle, string, string)
	PutWorkspaceData = void PutWorkspaceData(handle, string, string, Variant)
	Feval = Variant(Pointer) Feval(handle, string, int32, Variant(Optional))
	GetVariable = Variant GetVariable(handle, string, string)
get(hmatlab)
    Visible: 1

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

hmatlab.Execute('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])
B =

    91    16    96    66    32    45    50    89    24
    13    97    66    17    95    65    96    96    93
    91    96     4    71     3    71    34    55    35
    63    49    85     3    44    75    59    14    20
    10    80    93    28    38    28    22    15    25
    28    14    68     5    77    68    75    26    62
    55    42    76    10    80    66    26    84    47
    96    92    74    82    19    16    51    25    35
    96    79    39    69    49    12    70    81    83


z_none =

     0     0

delete(hmatlab)

イベント処理

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

events(hExcel)
	NewWorkbook = void NewWorkbook(handle Wb)
	SheetSelectionChange = void SheetSelectionChange(handle Sh, handle Target)
	SheetBeforeDoubleClick = void SheetBeforeDoubleClick(handle Sh, handle Target, bool Cancel)
	SheetBeforeRightClick = void SheetBeforeRightClick(handle Sh, handle Target, bool Cancel)
	SheetActivate = void SheetActivate(handle Sh)
	SheetDeactivate = void SheetDeactivate(handle Sh)
	SheetCalculate = void SheetCalculate(handle Sh)
	SheetChange = void SheetChange(handle Sh, handle Target)
	WorkbookOpen = void WorkbookOpen(handle Wb)
	WorkbookActivate = void WorkbookActivate(handle Wb)
	WorkbookDeactivate = void WorkbookDeactivate(handle Wb)
	WorkbookBeforeClose = void WorkbookBeforeClose(handle Wb, bool Cancel)
	WorkbookBeforeSave = void WorkbookBeforeSave(handle Wb, bool SaveAsUI, bool Cancel)
	WorkbookBeforePrint = void WorkbookBeforePrint(handle Wb, bool Cancel)
	WorkbookNewSheet = void WorkbookNewSheet(handle Wb, handle Sh)
	WorkbookAddinInstall = void WorkbookAddinInstall(handle Wb)
	WorkbookAddinUninstall = void WorkbookAddinUninstall(handle Wb)
	WindowResize = void WindowResize(handle Wb, handle Wn)
	WindowActivate = void WindowActivate(handle Wb, handle Wn)
	WindowDeactivate = void WindowDeactivate(handle Wb, handle Wn)
	SheetFollowHyperlink = void SheetFollowHyperlink(handle Sh, handle Target)
	SheetPivotTableUpdate = void SheetPivotTableUpdate(handle Sh, handle Target)
	WorkbookPivotTableCloseConnection = void WorkbookPivotTableCloseConnection(handle Wb, handle Target)
	WorkbookPivotTableOpenConnection = void WorkbookPivotTableOpenConnection(handle Wb, handle Target)
	WorkbookSync = void WorkbookSync(handle Wb, Variant SyncEventType)
	WorkbookBeforeXmlImport = void WorkbookBeforeXmlImport(handle Wb, handle Map, string Url, bool IsRefresh, bool Cancel)
	WorkbookAfterXmlImport = void WorkbookAfterXmlImport(handle Wb, handle Map, bool IsRefresh, Variant Result)
	WorkbookBeforeXmlExport = void WorkbookBeforeXmlExport(handle Wb, handle Map, string Url, bool Cancel)
	WorkbookAfterXmlExport = void WorkbookAfterXmlExport(handle Wb, handle Map, string Url, Variant Result)
	WorkbookRowsetComplete = void WorkbookRowsetComplete(handle Wb, string Description, string Sheet, bool Success)
	AfterCalculate = void AfterCalculate()
	SheetPivotTableAfterValueChange = void SheetPivotTableAfterValueChange(handle Sh, handle TargetPivotTable, handle TargetRange)
	SheetPivotTableBeforeAllocateChanges = void SheetPivotTableBeforeAllocateChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
	SheetPivotTableBeforeCommitChanges = void SheetPivotTableBeforeCommitChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd, bool Cancel)
	SheetPivotTableBeforeDiscardChanges = void SheetPivotTableBeforeDiscardChanges(handle Sh, handle TargetPivotTable, int32 ValueChangeStart, int32 ValueChangeEnd)
	ProtectedViewWindowOpen = void ProtectedViewWindowOpen(handle Pvw)
	ProtectedViewWindowBeforeEdit = void ProtectedViewWindowBeforeEdit(handle Pvw, bool Cancel)
	ProtectedViewWindowBeforeClose = void ProtectedViewWindowBeforeClose(handle Pvw, Variant Reason, bool Cancel)
	ProtectedViewWindowResize = void ProtectedViewWindowResize(handle Pvw)
	ProtectedViewWindowActivate = void ProtectedViewWindowActivate(handle Pvw)
	ProtectedViewWindowDeactivate = void ProtectedViewWindowDeactivate(handle Pvw)
	WorkbookAfterSave = void WorkbookAfterSave(handle Wb, bool Success)
	WorkbookNewChart = void WorkbookNewChart(handle Wb, handle Ch)

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

dbtype e_handler.m 1:3
1     function e_handler(varargin)
2     
3     disp(['Event ',varargin{end},' triggered!!!'])
registerevent(mwsamp, {'Click' 'e_handler';...
   'DblClick' 'e_handler';...
   'MouseDown' 'e_handler';...
   'Event_Args' 'e_handler'})
eventlisteners(mwsamp)
ans = 

    'Click'         'e_handler'
    'DblClick'      'e_handler'
    'MouseDown'     'e_handler'
    'Event_Args'    'e_handler'

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

unregisterallevents(mwsamp)
eventlisteners(mwsamp)
ans = 

     {}

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

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

    'Click'         'e_handler'
    'DblClick'      'e_handler'
    'MouseDown'     'e_handler'
    'Event_Args'    'e_handler'

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

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

    'Click'       'e_handler'
    'DblClick'    'e_handler'

エラー処理

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

set(hExcelw,'Saved',1);
invoke(hExcelWorkbooks,'Close')
try
    Open(hExcelWorkbooks,'thisfiledoesnotexist.xls')
catch e
    disp(e.message)
end
Invoke Error, Dispatch Exception: 
Source: Microsoft Excel
Description: 'thisfiledoesnotexist.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct.

If you are trying to open the file from your list of most recently used files, make sure that the file has not been renamed, moved, or deleted.
Help File: xlmain11.chm
Help Context ID: 0

COM オブジェクトの破棄

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

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

whos mwsamp hExcel
  Name        Size            Bytes  Class                      Attributes

  hExcel      1x1                    COM.excel_application                
  mwsamp      1x1                    COM.MWSAMP_MwsampCtrl_2              

release(hExcelw)
whos mwsamp hExcel
  Name        Size            Bytes  Class                      Attributes

  hExcel      1x1                    COM.excel_application                
  mwsamp      1x1                    COM.MWSAMP_MwsampCtrl_2              

Quit(hExcel)
delete(hExcel);
delete(mwsamp);
close
whos mwsamp hExcel
  Name        Size            Bytes  Class     Attributes

  hExcel      1x1                    handle              
  mwsamp      1x1                    handle              

この情報は役に立ちましたか?