プロが教えるわが家の防犯対策術!

ACTIVEXについて調査しています。

ACTIVEXの拡張子にはACTIVEXコントロールであるOCX、
モジュールとして存在するDLLとEXEの3つがあると分かりました。

これ以外にも何かあるものなのでしょうか。
よろしくお願いします。

A 回答 (7件)

#3の方の回答ですが、この方法は


http://okweb.jp/kotaeru.php3?qid=864498
ですのでご注意を(^^;;


>単純に外部コマンドとしてregsvr32を発行するように設計していました。

タイプライブラリをリソースとして持つDLLに対しては、これでかまいません。
逆に言うと、タイプライブラリ(拡張子がtlbのファイル)が外出しに添付されているActiveXのモジュールも存在します。
ここにソースつきの登録ツールなんてのも
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/#el …

自己登録機能を持つexeのものは/regserverをパラメータで指定して実行します。regsvr32では登録できません。
    • good
    • 0
この回答へのお礼

色々とご指導ありがとうございます。

今日のミーティングでとりあえず外部コマンドでコードして、
利用に際してはユーザ側に一任するという形にまとまりました。

万能型のものとなると色々調査することがありそうなので、
人員に空きができたときに調査をさせる予定です。

簡単に対応できるかと思っておりましたが、なかなか大変なようですね。

お礼日時:2005/01/17 20:23

#3です。


下記のプログラムは
Dllは使用できますが、
exeファイルは不可です。

ってかこうなることが分かっていたので、
使わなかったのに…。
    • good
    • 0

#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
    • good
    • 0
この回答へのお礼

たびたびコードの提供ありがとうございます。
当面の仕様に関してはtake_tetsuさんのところの返信のように決定しました。

今後は調査を経まして、仕様の拡張を考慮していますので
そのときはこちらのコードを参照させていただきたいと思います。

どうもありがとうございました。

お礼日時:2005/01/17 20:35

#3です。


前に教えて貰ったので、
それを使わせて関数を作っただけです。

その際にはtaka_tetsuさんには
お世話になりました…。

人の質問のところで恐縮ですが、
ありがとうございました。

閑話休題。
oleselfregisterが
ファイルプロパティに
存在しない場合、
REGSVR32、RegServer共に
使用できません。
だから出来る荒業です。
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

具体的なコードの添付ありがとうございます。
単純に外部コマンドとしてregsvr32を発行するように設計していました。

具体的な調査は明後日以降といたしまして、
こちらのコードは使わせて頂きたいと思います。

掲示板で相談して副次的なことをしりえたのは幸運です。
重ねてお礼申し上げます

お礼日時:2005/01/16 15:33

>自動登録のプログラムを開発していたところです。



ちなみになんのですか?
どこに何を登録するのでしょう?


>>DLL形式のものでしたら何をつけてもいいんですけど
>
>これはどういう意味でしょう?

ActiveXの情報はレジストリに登録され、他のアプリから使われます。この際、ファイル名はフルパスがレジストリに書き込まれるため、関連付けなどはまったく関係ありません。

>プログラムにロードできれば、たとえばtxtでも構わないとかいう意味ですか。

はい、そういうことになります。

別にダブルクリックして開くものではないので。
拡張子なんてのは、あくまでも便宜的なものだということです。
OSによって、exe、bat、lnk等いくつかのものは、特別な動作が関連付けていますが。


>それとも何か慣例みたいなものがあるのでしょうか。

慣例としては、hawkwindさんの調査のとおり、OCXとDLLがつけられます。
OCXはActiveXコントロールと呼ばれるものがつけているのが普通です。

EXEがつく場合は、ActiveX EXEやActive Documentといったダブルクリックしたときに普通のアプリとしても動作するようなものにつきます。Excel.exeもこれの一種です。
    • good
    • 0
この回答へのお礼

たびたびの回答ありがとうございます。

登録とはレジストリへの登録です。
前にも述べました通り、現行ではOCX、DLL、EXEについて登録するような仕様です。

taka_tetsuさんの投稿を拝見しましても常識的なところでは
OCX、DLL、EXEということのようですね。

txtやbmpなど偽装といいましょうか、奇をてらった拡張子は対象外と考えています。
(拡張子をチェックしてはじきます)

上記の3つ以外に意見があればお願いします。

お礼日時:2005/01/16 15:48

拡張子なんて、exe形式のものは特殊ですが、DLLの形式のものでしたら何をつけてもいいんですけど。



何の判断にするつもりですか?
    • good
    • 0
この回答へのお礼

御返事ありがとうございます。

自動登録のプログラムを開発していたところです。
ActiveXについては追加機能ということで決定しました。

色々調べている間に、ActiveXドキュメントとか出てきまして
ActiveXはもっと奥が深いのではないかと感じた次第です。

>DLL形式のものでしたら何をつけてもいいんですけど

これはどういう意味でしょう?
プログラムにロードできれば、たとえばtxtでも構わないとかいう意味ですか。
それとも何か慣例みたいなものがあるのでしょうか。

お礼日時:2005/01/16 14:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!