NOM

INDEX

NOMとは?

NOMはレジストリ登録なしにDLLからオブジェクトを生成するCOMオブジェクトです。

以下のことが可能です。

動作環境
パッケージ内容
NOM.dll
本体
注意事項
  1. 本ソフトウェアの利用は良識の範囲内でお願い致します。
  2. 本ソフトウェアの利用による損害の保証はお受けできません。
  3. 本ソフトウェアの利用は楽しんで行っていただきますようお願い致します。
インストール方法
  1. "NOM.dll" をRegsvr32。
利用方法
ネイティブDLLのCOMオブジェクトを生成するには
例(VBScript)
set o = GetObject("NOM:C:\MyCOM\arucom.dll#{0CD3EAA2-EAB2-419c-9307-D8F8AF349B11}"):
※注意事項※
  • 生成対象のCOMオブジェクトがレジストリ登録を前提として動作するような場合は利用できません。
マネージドDLLの.NETオブジェクトを生成するには
例(VBScript)
set o = GetObject("NOM:C:\MyNET\arunet.dll#MyNamespace.MyClass"):
※注意事項※
  • 生成対象の.NETオブジェクトは ComVisible(true)属性 が指定されている必要があります。
NOM対応ライブラリ作成方法
ネイティブDLLのCOMオブジェクトの場合
●レジストリ登録を前提とした作りこみをしない

Visual Studio で IDispatchImpl を利用して作成したCOMオブジェクトはレジストリ登録を必要とします。
このようなCOMオブジェクトは

GetObject("NOM:xxx...#{yyy...}")
の処理は成功しますが、生成されたオブジェクトのプロパティやメソッドを呼んだ時点で
「ライブラリは登録されていません。」
などのエラーとなり、オブジェクトを利用することができません。
レジストリ登録を前提とした作りこみをしないようにしてください。

●NOM名によって生成するためには DllGetClassObject(...) を拡張する

作成するCOMライブラリをNOM名に対応させることで、

GetObject("NOM:C:\xxx...dll#Hoge")
のように、NOM名(Hoge)によってオブジェクトを生成することができるようになります。
この生成方法はGUIDを指定する方法よりもわかりやすいものとなります。
NOM名に対応させる場合は COM APIである
DllGetClassObject(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv)
を拡張してください。
NOM名によってオブジェクトを生成させる場合、rclsid に CLSID_NULL、ppv に NOM名 が引き渡されてきます。
拡張は以下の例のように行ってください。

STDAPI DllGetClassObject(IN REFCLSID rclsid, IN REFIID riid, OUT LPVOID FAR* ppv) { if(::IsEqualGUID(rclsid, CLSID_NULL)) { wchar_t* pClassName = (wchar_t*)*ppv; if(!pClassName || pClassName[0] == L'\0') { return ((IClassFactory*)&g_oCF_Hoge)->QueryInterface(riid, ppv); } else if(::wcscmp(pClassName, L"Hoge") == 0) { return ((IClassFactory*)&g_oCF_Hoge)->QueryInterface(riid, ppv); } else { return CLASS_E_CLASSNOTAVAILABLE; } } else if(::IsEqualGUID(rclsid, CLSID_Hoge)) { return ((IClassFactory*)&g_oCF_Hoge)->QueryInterface(riid, ppv); } else { return CLASS_E_CLASSNOTAVAILABLE; } }

マネージドDLLの.NETオブジェクトの場合
●ComVisible(true)属性 を指定する

作成する.NETオブジェクトには ComVisible(true)属性 を指定する必要があります。

using System; using System.Text; namespace MyNETLib { [System.Runtime.InteropServices.ComVisible(true)] public class MyClass001 { public String Hello() { return "Hellooooo!!!"; } } }

たとえばこのような.NETオブジェクトの場合、

GetObject("NOM:C:\xxx...dll#MyNETLib.MyClass001")
によって生成することが可能です。

更新履歴
2007/11/09
  • Version: 1.0.0.0
2007/12/19
  • Version: 1.1.0.0
  • レジストリ登録時に ThreadingModel=Both の設定を追加
  • DllCanUnloadNow時にCLRが動作中の場合S_FALSEを返すよう変更
2009/05/27
  • Version: 1.1.1.0
  • NOMのReleaseに失敗する不具合対処
  • NOM.html に「NOM対応ライブラリ作成方法」を加筆
2010/04/02
  • Version: 1.1.2.0
  • x64対応
2013/10/08
  • Version: 1.2.0.0
  • v4.0 までの CLR に対応