|
■No82170 (hama さん) に返信 > 以下でコンパイル時にGUIDが取得出来る事が分かりました。 > Dim myGuid As Guid = System.Guid.NewGuid() > Console.WriteLine(myGuid.ToString())
「コンパイル時」では無く「実行時」です。 NewGuid メソッドを呼ぶたびに、新しい GUID が生成されます。
Visual Studio の場合、[ツール]-[GUID の作成]ツールからも生成できます。
もしくは、Visual Studio をインストールしたフォルダの .\Common7\Tools\guidgen.exe を使う事もできますし、 コマンドライン版なら Uuidgen.exe を利用できます。
VBA/VBScript で生成するなら、 s = Left(CreateObject("Scriptlet.TypeLib").GUID, 38) です。
> @実行形式(exe)ファイルから、GUIDを取得する方法はありますか?
一口に GUID といっても、タイプライブラリに付与されるものもあれば、 コクラスに付くもの、インターフェイスに付くもの、 ユーザー定義型に付くものといったように、役割の異なる 複数の GUID/UUID が記録されているわけですが、それはさておき。
プログラム的に取得したいというのであれば、VBA 等で TypeLib Information (TLINFO32.DLL)を参照設定すれば、 調査することができます。レイトバインドで使うなら、 CreateObject("TLI.TLIApplication") です。
自身のプログラムからの取得では無く、ツール等による目視確認で良いのなら、 スタートメニューから Visual Studio コマンドプロンプトを起動し、 そこから『OLEVIEW.EXE』を呼び出してみてください。
このツールは、VBA でいうところの「オブジェクト ブラウザ」のように、 COM コンポーネントの型情報を得るためのものです。
左から 2 番目のアイコン [View TypeLib] から、調査対象の VB6 製 ActiveX コンポーネント(EXE / DLL / OCX) やタイプライブラリを選ぶと、 詳しい情報が得られます。 (開けるファイルは、COM の型情報が含まれているものに限ります)
なお .NET 製の EXE/DLL を調べる場合は、コンパイルしたファイルを OLEVIEW で直接開くことはできません。この場合は、TlbExp.exe または RegAsm.exe にてタイプライブラリファイルを作成してから、 そのタイプライブラリを OLEVIEW.EXE に読みこませるようにします。
HTML から OCX から呼び出す場合、object タグの classid 属性に クラスの GUID 値を指定することになりますよね。
VB6 の場合、GUID をソースコードに埋め込めなかったので、コンパイル後に こうしたツールを利用して調査する必要があったんですよね…。
GetObject("script:C:\temp\test.wsc") 等で呼び出される、*.wsc 製の COM コンポーネントだと、レジストリ登録用に <registration> 要素が 用意されていて、そこで明示できたのですけれども。 https://msdn.microsoft.com/ja-jp/library/cc428189.aspx
> AGUIDをレジストリに直接追加でいいでしょうか? > (今回分ですと、HKEY_CLASSES_ROOT\LVE01000.clsLVE01001\ClsidにGUID値追加)
このあたりもセットで指定してください。
HKEY_CLASSES_ROOT\TypeLib HKEY_CLASSES_ROOT\CLSID HKEY_CLASSES_ROOT\Interface
もちろん何を登録してもよいというわけではなく、タイプライブラリ内の 型情報とレジストリの型情報が一致していないといけません。
RegAsm の /regfile オプションを使う事で、記述すべき情報を ファイルに書き出すことができますので、その .reg ファイルを 配布して登録してもらうというのも一つのやり方です。
> B"LVE01000.clsLVE01001"の箇所は任意に変更していいのでしょうか?
ファイルは書き換えずに、レジストリだけを変更するということでしょうか。
やろうと思えば変更もできなくはないですし、同じ CLSID のオブジェクトに対して、 複数の ProgID をエイリアス的に設ける事もできますが、そもそも何のために 既存の ProgID を変更したいのか、意図が読み取れませんでした。
レジストリ情報を後から変更しても、「VB6製.EXE /Register」や 「RegAsm VB.NET製.EXE」などで元の情報が再登録されることになるので、 あまり意味は無い気がします。
それにオブジェクトの定義や ProgID がいきなり変更されると、 既存アプリも直すことになるので、互換性上の問題が生じてしまいますので、 あとで変更せずに済むよう、最初の開発時にきちんと決めておきましょう。
|