No.4ベストアンサー
- 回答日時:
#3の方の回答ですが、この方法は
http://okweb.jp/kotaeru.php3?qid=864498
ですのでご注意を(^^;;
>単純に外部コマンドとしてregsvr32を発行するように設計していました。
タイプライブラリをリソースとして持つDLLに対しては、これでかまいません。
逆に言うと、タイプライブラリ(拡張子がtlbのファイル)が外出しに添付されているActiveXのモジュールも存在します。
ここにソースつきの登録ツールなんてのも
http://www.koalanet.ne.jp/~akiya/vbtaste/vbp/#el …
自己登録機能を持つexeのものは/regserverをパラメータで指定して実行します。regsvr32では登録できません。
色々とご指導ありがとうございます。
今日のミーティングでとりあえず外部コマンドでコードして、
利用に際してはユーザ側に一任するという形にまとまりました。
万能型のものとなると色々調査することがありそうなので、
人員に空きができたときに調査をさせる予定です。
簡単に対応できるかと思っておりましたが、なかなか大変なようですね。
No.6
- 回答日時:
#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さんのところの返信のように決定しました。
今後は調査を経まして、仕様の拡張を考慮していますので
そのときはこちらのコードを参照させていただきたいと思います。
どうもありがとうございました。
No.5
- 回答日時:
#3です。
前に教えて貰ったので、
それを使わせて関数を作っただけです。
その際にはtaka_tetsuさんには
お世話になりました…。
人の質問のところで恐縮ですが、
ありがとうございました。
閑話休題。
oleselfregisterが
ファイルプロパティに
存在しない場合、
REGSVR32、RegServer共に
使用できません。
だから出来る荒業です。
No.3
- 回答日時:
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を発行するように設計していました。
具体的な調査は明後日以降といたしまして、
こちらのコードは使わせて頂きたいと思います。
掲示板で相談して副次的なことをしりえたのは幸運です。
重ねてお礼申し上げます
No.2
- 回答日時:
>自動登録のプログラムを開発していたところです。
ちなみになんのですか?
どこに何を登録するのでしょう?
>>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つ以外に意見があればお願いします。
No.1
- 回答日時:
拡張子なんて、exe形式のものは特殊ですが、DLLの形式のものでしたら何をつけてもいいんですけど。
何の判断にするつもりですか?
御返事ありがとうございます。
自動登録のプログラムを開発していたところです。
ActiveXについては追加機能ということで決定しました。
色々調べている間に、ActiveXドキュメントとか出てきまして
ActiveXはもっと奥が深いのではないかと感じた次第です。
>DLL形式のものでしたら何をつけてもいいんですけど
これはどういう意味でしょう?
プログラムにロードできれば、たとえばtxtでも構わないとかいう意味ですか。
それとも何か慣例みたいなものがあるのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# ActiveXコントロールを.NETにインポートできない??? 2 2023/05/02 02:50
- Excel(エクセル) ActiveXコントロールのコマンドボタン移動させようとすると消える 1 2022/04/26 22:29
- Excel(エクセル) EXCEL ActiveX コマンドボタンで実行する前にいったんmsgBoxで確認を求めたい 1 2022/07/06 19:41
- Excel(エクセル) マクロを作成し、拡張子 .xlsm で保存しているのですが、データのみをBack Upするのは? 4 2023/06/18 09:54
- Excel(エクセル) エクセル バーコード作成で他のシートを参照するには? 2 2023/05/03 16:57
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- フリーソフト exe拡張子フォルダの解凍について 4 2022/08/11 17:30
- その他(プログラミング・Web制作) Excel vbaでフォルダー内のpptをpptxにdocをdocxに変換 6 2022/09/01 21:03
- その他(ソフトウェア) コマンドプロンプトについて教えてください。 状況: 画像編集ソフト上でネットから保存した画像を使うの 3 2022/05/26 11:14
- Excel(エクセル) ドキュメントに保存していたエクセルのファイルが開きません。 2 2022/12/02 09:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBAマクロ初心者】Excel VBA...
-
「エクセルファイルが開いてい...
-
VBからExcelファイルを開くとき...
-
vbaサブフォルダーをワイルドカ...
-
動かなくなってしまった古いVBA...
-
【ACCESS VBA】アクセスからデ...
-
vbsでのアスタリスクとファイル...
-
ExcelVBA 文字コード変換
-
Wordのプロパティ・総ページ数...
-
vbaに詳しい方教えてください!...
-
Long型で表現できないファイル...
-
c# で作成したアプリをある拡張...
-
Accessのウインドウサイズの固定
-
サブフォルダ含むフォルダ内の...
-
遅延バインディングの回避方法
-
FileDialog オブジェクトでファ...
-
VB.net XMLの作成方法 Iniの代替
-
excel マクロ PDF化の際のエラ...
-
適当な英文の書かれたファイル(...
-
更新日が指定日以降のファイル取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaサブフォルダーをワイルドカ...
-
FileDialog オブジェクトでファ...
-
サブフォルダ含むフォルダ内の...
-
ffftpでファイル取得が0バイト...
-
動かなくなってしまった古いVBA...
-
excel マクロ PDF化の際のエラ...
-
VBからExcelファイルを開くとき...
-
「エクセルファイルが開いてい...
-
VBAでフォルダ内のhtmlファイル...
-
複数のワークブックのVBAを変更...
-
ExcelVBA 文字コード変換
-
Wordのプロパティ・総ページ数...
-
「AccessViolationException」...
-
エクセルのVBAで開いている...
-
AccessからOLEオブジェクト型の...
-
VBAで色々な種類のファイルを開く
-
VBAでCSVファイルを読み込もう...
-
VB.net XMLの作成方法 Iniの代替
-
【ACCESS VBA】アクセスからデ...
-
VBA、ファイル名検索から開く、...
おすすめ情報