投稿者 魔界の仮面弁士  (社会人) 投稿日時 2024/4/10 13:55:23
> xls = GetObject(, "Excel.Application")
これは、
 xls =  Marshal.GetActiveObject("Excel.Application")
と書いても良いですね。

機能的には同じもので、ROT(Running Object Table) から、
指定した COM オブジェクトの実行中のインスタンスを返します。

COM サーバーとの通信が確立できなければ例外になるので、
Try~Catch する必要があるのも同じ。


ちなみにこれは、Win32 API の GetActiveObject 関数 (oleaut32.dll) を呼び出しているだけです。
https://learn.microsoft.com/ja-jp/windows/win32/api/oleauto/nf-oleauto-getactiveobject?WT.mc_id=DT-MVP-8907

> Tryの分で処理すると時間がかかるような気がするのです。
元の API 自体が、取得失敗時に HRESULT エラー コードを返す実装なので、
例外処理が必要なのは仕方ないです…。

どうしても Try ~ Catch したくないのであれば、.NET の Managed ライブラリではなく、
同等機能の Win32 API を直接 DllImport (あるいは Declare) して呼び出すようにすることで、
HRESULT を例外としてではなく、32bit整数値として直接受け取ることができます。