- ベストアンサー
ACTIVEXの拡張子
ACTIVEXについて調査しています。 ACTIVEXの拡張子にはACTIVEXコントロールであるOCX、 モジュールとして存在するDLLとEXEの3つがあると分かりました。 これ以外にも何かあるものなのでしょうか。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#3の方の回答ですが、この方法は http://okweb.jp/kotaeru.php3?qid=864498 ですのでご注意を(^^;; >単純に外部コマンドとしてregsvr32を発行するように設計していました。 タイプライブラリをリソースとして持つDLLに対しては、これでかまいません。 逆に言うと、タイプライブラリ(拡張子がtlbのファイル)が外出しに添付されているActiveXのモジュールも存在します。 ここにソースつきの登録ツールなんてのも http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/#else01 自己登録機能を持つexeのものは/regserverをパラメータで指定して実行します。regsvr32では登録できません。
その他の回答 (6)
- kakusuke
- ベストアンサー率36% (95/259)
#3です。 下記のプログラムは Dllは使用できますが、 exeファイルは不可です。 ってかこうなることが分かっていたので、 使わなかったのに…。
- kakusuke
- ベストアンサー率36% (95/259)
#3です。 taka_tetsuさんの お望みの形にしてみました。 ※全角スペースを 半角スペース×2に置換してから お使いください。 Option Explicit 'Dllファイルのハンドルを取得 Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _ (ByVal lpLibFileName As String) _ As Long 'Dllファイル内のモジュールハンドルを取得 Private Declare Function GetProcAddress Lib "kernel32" _ (ByVal hModule As Long, _ ByVal lpProcName As String) _ As Long 'Dllファイルのハンドルを開放 Private Declare Function FreeLibrary Lib "kernel32" _ (ByVal hLibModule As Long) _ As Long 'レジストリ登録可能かどうかのチェック Function bolRegisterable(ByVal strFileName As String) As Boolean 'Dllファイルに存在する、レジストリ登録用モジュール名 Const cnsDllRegisterServer = "DllRegisterServer" & vbNullString 'Dllファイルのハンドル Dim lngRetLoadLiblary As Long 'Dllファイル内のモジュールハンドル Dim lngRetProcAddress As Long 'Dllファイルのハンドル開放時の戻り値 Dim lngRetFreeLiblary As Long '初期値=False bolRegisterable = False 'Dllファイルのハンドルを取得 lngRetLoadLiblary = _ LoadLibrary(strFileName & vbNullString) 'Dllファイルのハンドルを取得出来なかった場合はExit If lngRetLoadLiblary = 0 Then Exit Function 'Dllファイル内のモジュールハンドルを取得 lngRetProcAddress = _ GetProcAddress(lngRetLoadLiblary, cnsDllRegisterServer) 'Dllファイル内のモジュールハンドル<>0のときは 'レジストリ登録可能 If lngRetProcAddress <> 0 Then bolRegisterable = True End If 'Dllファイルのハンドル開放 lngRetFreeLiblary = FreeLibrary(lngRetLoadLiblary) End Function
お礼
たびたびコードの提供ありがとうございます。 当面の仕様に関してはtake_tetsuさんのところの返信のように決定しました。 今後は調査を経まして、仕様の拡張を考慮していますので そのときはこちらのコードを参照させていただきたいと思います。 どうもありがとうございました。
- kakusuke
- ベストアンサー率36% (95/259)
#3です。 前に教えて貰ったので、 それを使わせて関数を作っただけです。 その際にはtaka_tetsuさんには お世話になりました…。 人の質問のところで恐縮ですが、 ありがとうございました。 閑話休題。 oleselfregisterが ファイルプロパティに 存在しない場合、 REGSVR32、RegServer共に 使用できません。 だから出来る荒業です。
- kakusuke
- ベストアンサー率36% (95/259)
VBでActiveXを 登録する際に作った関数です。 これをつかって regserverやregsvr32を シェル関数で呼び出せば、 自動登録できます。 ※全角スペースを 半角スペース×2に置換してから お使いください。 ' ファイルからバージョン情報を取得できるかどうかを判定する ' 関数の宣言 Declare Function GetFileVersionInfoSize Lib "Version.dll" _ Alias "GetFileVersionInfoSizeA" _ (ByVal lptstrFilename As String, _ lpdwHandle As Long) As Long ' ファイルに関するバージョン情報を取得する関数の宣言 Declare Function GetFileVersionInfo Lib "Version.dll" _ Alias "GetFileVersionInfoA" _ (ByVal lptstrFilename As String, _ ByVal dwHandle As Long, _ ByVal dwLen As Long, _ lpData As Any) As Long ' バージョン情報リソースから選択されたバージョン情報を ' 取得する関数の宣言 Declare Function VerQueryValue Lib "Version.dll" _ Alias "VerQueryValueA" _ (pBlock As Any, _ ByVal lpSubBlock As String, _ lplpBuffer As Any, _ puLen As Long) As Long ' ある位置から別の位置にメモリブロックを移動する関数の宣言 Declare Sub MoveMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (Destination As Any, _ Source As Long, _ ByVal Length As Long) Function bolRegistable(strPathName As String) As Boolean Dim strTargetFileName As String Dim lngSizeOfVersionInfo As Long Dim lngDummyHandle As Long Dim bytDummyVersionInfo() As Byte Dim lngPointerVersionInfo As Long Dim lngLengthVersionInfo As Long Dim lngVarFileInfoTrans() As Long Dim lngLanguageValue As Long Dim lngCharsetValue As Long Dim strLanguageCharset As String Dim strSpecifiesValue As String * 128 Dim lngWin32apiResultCode As Long bolRegistable = False ' 対象ファイルを設定 strTargetFileName = strPathName ' バージョン情報のサイズを取得 lngSizeOfVersionInfo = _ GetFileVersionInfoSize(strTargetFileName, _ lngDummyHandle) ' バージョン情報のサイズを取得できたときは If lngSizeOfVersionInfo > 0 Then ' ダミー変数の領域を確保 ReDim _ bytDummyVersionInfo(lngSizeOfVersionInfo - 1) ' バージョン情報を取得 lngWin32apiResultCode = _ GetFileVersionInfo(strTargetFileName, _ 0, _ lngSizeOfVersionInfo, _ bytDummyVersionInfo(0)) ' バージョン情報リソースの言語識別子と ' 文字セット識別子を取得 lngWin32apiResultCode = _ VerQueryValue(bytDummyVersionInfo(0), _ "\VarFileInfo\Translation", _ lngPointerVersionInfo, _ lngLengthVersionInfo) ' バッファ領域を確保 ReDim _ lngVarFileInfoTrans(lngLengthVersionInfo \ 4) ' 取得した言語識別子と文字セット識別子を変数へ移動 MoveMemory _ lngVarFileInfoTrans(0), _ ByVal lngPointerVersionInfo, _ lngLengthVersionInfo ' 言語識別子と文字セット識別子の値を取得 lngLanguageValue = _ lngVarFileInfoTrans(0) And &HFFFF& lngCharsetValue = _ (lngVarFileInfoTrans(0) \ 2 ^ 16) And &HFFFF& ' 言語識別子と文字セット識別子を編集 strLanguageCharset = _ Right("0000" & Hex(lngLanguageValue), 4) & _ Right("0000" & Hex(lngCharsetValue), 4) ' バージョン情報リソースを取得 lngWin32apiResultCode = _ VerQueryValue(bytDummyVersionInfo(0), _ "\StringFileInfo\" & _ strLanguageCharset & _ "\OLESelfRegister", _ lngPointerVersionInfo, _ lngLengthVersionInfo) If lngWin32apiResultCode = 0 Then Exit Function End If ' バージョン情報のサイズを取得できなかったときは Else Exit Function End If bolRegistable = True End Function
お礼
具体的なコードの添付ありがとうございます。 単純に外部コマンドとしてregsvr32を発行するように設計していました。 具体的な調査は明後日以降といたしまして、 こちらのコードは使わせて頂きたいと思います。 掲示板で相談して副次的なことをしりえたのは幸運です。 重ねてお礼申し上げます
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>自動登録のプログラムを開発していたところです。 ちなみになんのですか? どこに何を登録するのでしょう? >>DLL形式のものでしたら何をつけてもいいんですけど > >これはどういう意味でしょう? ActiveXの情報はレジストリに登録され、他のアプリから使われます。この際、ファイル名はフルパスがレジストリに書き込まれるため、関連付けなどはまったく関係ありません。 >プログラムにロードできれば、たとえばtxtでも構わないとかいう意味ですか。 はい、そういうことになります。 別にダブルクリックして開くものではないので。 拡張子なんてのは、あくまでも便宜的なものだということです。 OSによって、exe、bat、lnk等いくつかのものは、特別な動作が関連付けていますが。 >それとも何か慣例みたいなものがあるのでしょうか。 慣例としては、hawkwindさんの調査のとおり、OCXとDLLがつけられます。 OCXはActiveXコントロールと呼ばれるものがつけているのが普通です。 EXEがつく場合は、ActiveX EXEやActive Documentといったダブルクリックしたときに普通のアプリとしても動作するようなものにつきます。Excel.exeもこれの一種です。
お礼
たびたびの回答ありがとうございます。 登録とはレジストリへの登録です。 前にも述べました通り、現行ではOCX、DLL、EXEについて登録するような仕様です。 taka_tetsuさんの投稿を拝見しましても常識的なところでは OCX、DLL、EXEということのようですね。 txtやbmpなど偽装といいましょうか、奇をてらった拡張子は対象外と考えています。 (拡張子をチェックしてはじきます) 上記の3つ以外に意見があればお願いします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
拡張子なんて、exe形式のものは特殊ですが、DLLの形式のものでしたら何をつけてもいいんですけど。 何の判断にするつもりですか?
お礼
御返事ありがとうございます。 自動登録のプログラムを開発していたところです。 ActiveXについては追加機能ということで決定しました。 色々調べている間に、ActiveXドキュメントとか出てきまして ActiveXはもっと奥が深いのではないかと感じた次第です。 >DLL形式のものでしたら何をつけてもいいんですけど これはどういう意味でしょう? プログラムにロードできれば、たとえばtxtでも構わないとかいう意味ですか。 それとも何か慣例みたいなものがあるのでしょうか。
お礼
色々とご指導ありがとうございます。 今日のミーティングでとりあえず外部コマンドでコードして、 利用に際してはユーザ側に一任するという形にまとまりました。 万能型のものとなると色々調査することがありそうなので、 人員に空きができたときに調査をさせる予定です。 簡単に対応できるかと思っておりましたが、なかなか大変なようですね。