概要
Acrobat動作時の設定に関する情報は基本的にレジストリに保存されています。プログラミングからそのレジストリを変更し、Acrobatの動作を変更します。作業が完了したらレジストリを復元も出来ます。
OLE等の動作時に一部の設定を変更するのに利用できます。
当関数はAcrobat関連のレジストリ操作を目的に作成しました。が、通常のレジストリ操作にも使えます。
Acrobatのレジストリ
Acrobatは起動時にレジストリから各設定の内容を読み取ります。そしてAcrobatの終了時に各設定の内容をレジストリに保存します。Acrobat起動中にレジストリからの読み込みや書き込みは基本的に有りません。(経験上)
よって、当関数で変更処理を行うときはAcrobatを終了しておく必要が有ります。
Acrobatのサブキー
Acrobatが使うレジストリキーにはAcrobatのバージョン番号によって変化するサブキーが使われます。以下はAcrobat XIが使うレジストリキーの一部です。
"HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"
「11.0」がAcrobatのバージョンによって変化するサブキーです。
以下の様にAcrobatのバージョンによって変化します。
- Acrobat 4, 5, 6, 7, 8, 9, X (10), XI (11) の時
- サブキー:Acrobatバージョン番号 + ".0"
- Acrobat DC (15)の時
- Acrobat.exeのインストールフォルダが
"Acrobat DC"ならば、サブキー:"DC" - Acrobat.exeのインストールフォルダが
"Acrobat 2015"ならば、サブキー:"2015"
- Acrobat.exeのインストールフォルダが
- Acrobat 2017 (17)の時
- サブキー:"2017"
Acrobat XIのバージョン番号はAcrobat.exeのプロパティの製品バージョン (11.0.23.22) から頭の部分 (11) を取っています。
機能
レジストリを操作します。
- レジストリのファイルへのバックアップ
- 値の更新と新規追加
- バックアップファイルからレジストリの復元
- レジストリの削除
- 値の取得
Acrobat用のレジストリのサブキー作成の関数も用意しました。
- Acroabatのサブキーの作成
注意
- 当関数はレジストリの変更を行います。操作を誤ると最悪でOS起動ができなくなり、OSの再インストールが必要となります。
- 当関数は動作を保証するものでは有りません。ご利用によって生じたいかなる障害も いかなる責任も持つものでは有りません。使用者の責任でご使用下さい。
- 当関数はRegコマンドを使用します。これに関する基本的な知識が無い人の使用を禁止します。
- レジストリ更新には制限が有ります。制限を解除したい場合は個別に当関数を手修正してご使用下さい。
- ” reg:[32|64] ”、" /s" 等の追加オプションの使用はできません。
- レジストリの値の種類は引数に指定できる3種類のみとします。
- Registry_Update関数では値の名前が存在しないと新規追加になります。Registry_Restore関数での復元処理では削除されません。削除したい場合は Registry_Delete関数をご利用ください。
- レジストリの基本的な知識を必要とします。
レジストリのルートキー
レジストリのルートキーは長いので、以下の様に省略した形式が使用できます。
- HKEY_LOCAL_MACHINE -> HKLM
- HKEY_CURRENT_USER -> HKCU
- HKEY_CLASSES_ROOT -> HKCR
- HKEY_USERS -> HKU
- HKEY_CURRENT_CONFIG -> HKCC
1. Registry_Backup 関数
1.1 説明
指定したレジストリキー以下をファイルにバックアップします。Excelファイルと同じフォルダ上にTextファイルとして保存します。ファイル名は自動で処理します。
バックアップはReg Export コマンドを使用します。
1.2 形式
[boolean] = Registry_Backup(
sRegKey As String)
1.3 引数
- 第一引数 ( string sRegKey ) :
バックアップするレジストリキーを指定します。
例:"HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"
1.4 戻り値 (Boolean)
- True : 正常
- False : エラー
1.5 備考
- バックアップしたファイル名が欲しい時は、当関数内で使用している変数「mstrRegistry_Backup_FileName」の宣言を Private から Public に手修正して下さい。
2. Registry_Update 関数
2.1 説明
該当するレジストリ上の値を更新します。該当するレジストリの「値の名前」が存在しない時は新規追加します。「レジストリキー」、「値の名前」、「値の種類」、「値」に従って更新をします。値の文字列にダブルクオーテーション「"」が含まれる時は、3文字のダブルクオーテーション「"""」として変換して処理します。
Reg Add コマンドを使用します。
2.2 形式
[boolean] = Registry_Update(
strRegKey As String ,
strRegName As String ,
strRegType As String ,
strRegData As String )
2.3 引数
- 第一引数 ( string strRegKey ) :
レジストリキーを指定します。 - 第二引数 ( string strRegName ) :
レジストリの値の名前を指定します。 - 第三引数 ( string strRegType ) :
レジストリの値の種類(データ型 )を指定します。- "REG_SZ" :文字列データ
- "REG_BINARY":可変長のバイナリデータ
- "REG_DWORD":32bitの整数値データ
- "REG_QWORD":64bitの整数値データ
- 第四引数 ( string strRegData ) :
レジストリの値を指定します。- 文字の場合:"%"は"^%"に手修正が必要です。
- 数値の場合:10進数で指定します。
- バイナリーの場合: そのままの値。
2.4 戻り値 (Boolean)
- True : 正常
- False : エラー
3. Registry_Delete 関数
3.1 説明
レジストリキーと値の名前を指定して、レジストリを削除します。
Reg Delete コマンドを使用します。
3.2 形式
[boolean] = Registry_Delete(
strRegKey As String ,
strRegName As String ) :
3.3 引数
- 第一引数 ( string RegKey ) :
レジストリキーを指定します。 - 第二引数 ( string RegName ) :
レジストリの値の名前を指定します。
3.4 戻り値 (Boolean)
- True : 正常
- False : エラー
4. Registry_Restore 関数
4.1 説明
Registry_Backup 関数で保存したバックアップファイルを使ってレジストリを復元します。事前に Registry_Backup 関数を実行しておく必要が有ります。復元時に追加されたレジストリは削除されません。削除したい場合は個別にRegistry_Delete 関数を実行する必要があります。
Reg Import コマンドを使用します。
4.2 形式
[boolean] = Registry_Restore( )
4.3 引数
無し。
4.4 戻り値 (Boolean)
- True : 正常
- False : エラー
4.5 備考
- 事前にRegistry_Backup 関数が実行されてないとエラーになります。
- 復元は必須では無いです。使用者の判断に任せます。
5. Registry_Get 関数
5.1 説明
レジストリキーと値の名前を使って、レジストリの値を取得します。
Reg Query コマンドを使用します。
5.2 形式
[boolean] = Registry_Get(
strRegKey As String ,
strRegName As String ,
strRegData As String )
5.3 引数
- 第一引数 ( string strRegKey ) :レジストリキー
- 第二引数 ( string strRegName ) : 値の名前
- 第三引数 ( string strRegType ) : 値の種類
以下の4種類で返します。- "REG_SZ" :文字列データ
- "REG_BINARY" :可変長のバイナリデータ
- "REG_DWORD" :32bitの整数値データ
- "REG_QWORD" :64bitの整数値データ
- 第四引数 ( string strRegData ) : 取得した値
数値の値は10進数で返します。
5.4 戻り値 (Boolean)
- True : 正常
- False : エラー
5.5 備考
- 数値の値が16進数の場合は10進数に変換して返します。
- 該当レジストリが見つからない場合は、戻り値にFalseが返され、strRegData にその時のエラーメッセージがセットされます。
例:"エラー: 指定されたレジストリ キーまたは値が見つかりませんでした"
6. Get_Acrobat_Subkey 関数
6.1 説明
パソコンにインストールされているAcrobatのバージョン情報またはインストールフォルダから、Acrobat用のレジストリのサブキーを作成します。詳細は「Acrobatとレジストリ」を参照。
6.2 形式
[string] = Get_Acrobat_Subkey( )
6.3 引数
なし。
6.4 戻り値 (string)
サブキーの文字列、又はエラーメッセージ。
6.5 備考
- パソコンにAcrobatがインストールされてないと、処理は中断にし、Msgbox関数でエラーのダイアログが表示されます。
VBAサンプル
- Main_Test1
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"のレジストリキー以下をバックアップします。
- 上記のレジストリキーで以下の更新を行います。
- 値の名前:iprintWhat、値の種類:REG_DWORD、値:3
- 値の名前:iprintTest1、値の種類:REG_SZ、値:"ABC"
- 値の名前:iprintTest2,値の種類:REG_QWORD、値:234
- バックアップファイルでレジストリを復元します。
- Main_Test2
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*1)のレジストリキー以下をバックアップします。
- 以下の更新を行います。
- レジストリキー: *1 、値の名前:iprintWhat、値の種類:REG_DWORD、値:1
- レジストリキー:*1 + "¥cTaskPanes" 、値の名前:Test1、値の種類:REG_SZ、値:"Abc"xyz"3"
- レジストリキー:*1 + "¥cToolbars" 、 値の名前:Test2、値の種類:REG_QWORD、値:789
- バックアップファイルでレジストリを復元します。
- Main_Test3
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*2)のレジストリキー以下をバックアップします。
- 以下の更新を行います。
- レジストリキー:*2 、値の名前:iprintWhat、値の種類:REG_DWORD、値:3
- レジストリキー:*2 、値の名前:iprintTest-3、値の種類:REG_SZ、値:"21"
- レジストリキー:*2 、値の名前:iprintTest-4,値の種類:REG_QWORD、値:32
- 以下のレンジストリを削除します。
- レジストリキー:*2 、値の名前:iprintTest-3
- レジストリキー:*2 、値の名前:iprintTest-4
- バックアップファイルでレジストリを復元します。
- Main_Test4
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*3)の以下の値を取得します。
- レジストリキー:*3 、値の名前:iprintWhat
- レジストリキー:*3 + "cTaskPanes"、値の名前:Test1
これは存在しないのでエラーになります。
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*3)の以下の値を取得します。
- Main_Test5
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*4)の以下の値を更新します。
- レジストリキー:*4 、 値の名前:iprintWhat-x、値の種類:REG_BINARY、値:01
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥FullScreen"(*5)の以下の値を更新します。
- レジストリキー:*5 、値の名前:aTranstypeWithDirection
- "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*4)の以下の値を更新します。
Download:sample-RegCommand.xls
Module1.bas
001 Option Explicit
002
003 Private Const CON_DEBUG = False 'True:デバック / False:通常使用
004
005 Private Const CON_REG_SZ = "REG_SZ" '文字列データ
006 Private Const CON_REG_BINARY = "REG_BINARY" '可変長のバイナリデータ
007 Private Const CON_REG_DWORD = "REG_DWORD" '32bitの整数値データ
008 Private Const CON_REG_QWORD = "REG_QWORD" '64bitの整数値データ
009
010 Dim bRet As Boolean '戻り値
011 Dim sReg As String
012 Dim sRegKey As String 'レジストリキー
013 Dim sRegName As String '値の名前
014 Dim sRegType As String '値の種類
015 Dim sRegData As String '値
016
017 '**************************************************
018 ' 関数を呼び出すテスト用のメイン(1)
019 ' Update 2019/06/06
020 '**************************************************
021
022 Sub Main_Test1()
023 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
024 Get_Acrobat_Subkey() & "\AVGeneral"
025
026 '▼関数:Acrobatレジストリのキーをバックアップ
027 bRet = Registry_Backup(sReg)
028 Debug.Print "Registry_Backup bRet=" & bRet
029 If CON_DEBUG Then Stop
030 If bRet = False Then Exit Sub
031
032 '▼関数:レジストリ上のAcrobat設定を変更
033 sRegKey = sReg
034 sRegName = "iprintWhat"
035 sRegType = CON_REG_DWORD
036 sRegData = "3"
037 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
038 If CON_DEBUG Then Stop
039 Debug.Print "Registry_Update bRet=" & bRet
040
041 sRegKey = sReg
042 sRegName = "iprintTest1"
043 sRegType = CON_REG_SZ
044 sRegData = "ABC"
045 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
046 If CON_DEBUG Then Stop
047 Debug.Print "Registry_Update bRet=" & bRet
048
049 sRegKey = sReg
050 sRegName = "iprintTest2"
051 sRegType = CON_REG_QWORD
052 sRegData = "234"
053 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
054 If CON_DEBUG Then Stop
055 Debug.Print "Registry_Update bRet=" & bRet
056
057 '■ここでAcrobatに何らかの処理をさせる。
058 ' ・・・・・
059
060 '▼関数:Acrobatレジストリのキーをバックアップより復元
061 bRet = Registry_Restore()
062 If CON_DEBUG Then Stop
063 Debug.Print "Registry_Restore bRet=" & bRet
064
065 MsgBox "Main_Test1 終了 " & bRet
066 End Sub
067
068 '**************************************************
069 ' 関数を呼び出すテスト用のメイン(2)
070 ' Update 2019/06/06
071 '**************************************************
072
073 Sub Main_Test2()
074 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
075 Get_Acrobat_Subkey() & "\AVGeneral"
076
077 '▼関数:Acrobatレジストリのキーをバックアップ
078 bRet = Registry_Backup(sReg)
079 Debug.Print "Registry_Backup bRet=" & bRet
080 If CON_DEBUG Then Stop
081 If bRet = False Then Exit Sub
082
083 '▼関数:レジストリ上のAcrobat設定を変更
084 sRegKey = sReg
085 sRegName = "iprintWhat"
086 sRegType = CON_REG_DWORD
087 sRegData = "1"
088 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
089 If CON_DEBUG Then Stop
090 Debug.Print "Registry_Update bRet=" & bRet
091
092 sRegKey = sReg & "\cTaskPanes"
093 sRegName = "Test1"
094 sRegType = CON_REG_SZ
095 sRegData = "Abc""xyz""3" '文字に"を含む
096 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
097 If CON_DEBUG Then Stop
098 Debug.Print "Registry_Update bRet=" & bRet
099
100 sRegKey = sReg & "\cToolbars"
101 sRegName = "Test2"
102 sRegType = CON_REG_QWORD
103 sRegData = "789"
104 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
105 If CON_DEBUG Then Stop
106 Debug.Print "Registry_Update bRet=" & bRet
107
108 '■ここでAcrobatに何らかの処理をさせる。
109 ' ・・・・・
110
111 '▼関数:Acrobatレジストリのキーをバックアップより復元
112 bRet = Registry_Restore()
113 If CON_DEBUG Then Stop
114 Debug.Print "Registry_Restore bRet=" & bRet
115
116 MsgBox "Main_Test2 終了 " & bRet
117 End Sub
118
119 '**************************************************
120 ' 関数を呼び出すテスト用のメイン(3) Delete有り
121 ' Update 2019/06/06
122 '**************************************************
123
124 Sub Main_Test3()
125 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
126 Get_Acrobat_Subkey() & "\AVGeneral"
127
128 '▼関数:Acrobatレジストリのキーをバックアップ
129 bRet = Registry_Backup(sReg)
130 Debug.Print "Registry_Backup bRet=" & bRet
131 If CON_DEBUG Then Stop
132 If bRet = False Then Exit Sub
133
134 '▼関数:レジストリ上のAcrobat設定を変更
135 sRegKey = sReg
136 sRegName = "iprintWhat"
137 sRegType = CON_REG_DWORD
138 sRegData = "3"
139 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
140 If CON_DEBUG Then Stop
141 Debug.Print "Registry_Update bRet=" & bRet
142
143 sRegKey = sReg
144 sRegName = "iprintTest-3"
145 sRegType = CON_REG_SZ
146 sRegData = "21"
147 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
148 If CON_DEBUG Then Stop
149 Debug.Print "Registry_Update bRet=" & bRet
150
151 sRegKey = sReg
152 sRegName = "iprintTest-4"
153 sRegType = CON_REG_QWORD
154 sRegData = "32"
155 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
156 If CON_DEBUG Then Stop
157 Debug.Print "Registry_Update bRet=" & bRet
158
159 '▼関数:追加したレジストリの削除
160 sRegKey = sReg
161 sRegName = "iprintTest-3"
162 bRet = Registry_Delete(sRegKey, sRegName)
163 If CON_DEBUG Then Stop
164 Debug.Print "Registry_Update bRet=" & bRet
165
166 sRegKey = sReg
167 sRegName = "iprintTest-4"
168 bRet = Registry_Delete(sRegKey, sRegName)
169 If CON_DEBUG Then Stop
170 Debug.Print "Registry_Update bRet=" & bRet
171
172 '■ここでAcrobatに何らかの処理をさせる。
173 ' ・・・・・
174
175 '▼関数:Acrobatレジストリのキーをバックアップより復元
176 bRet = Registry_Restore()
177 If CON_DEBUG Then Stop
178 Debug.Print "Registry_Restore bRet=" & bRet
179
180 MsgBox "Main_Test3 終了 " & bRet
181 End Sub
182
183 '**************************************************
184 ' 関数を呼び出すテスト用のメイン(4) 値の取り出し
185 ' Update 2019/06/06
186 '**************************************************
187
188 Sub Main_Test4()
189 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
190 Get_Acrobat_Subkey() & "\AVGeneral"
191
192 sRegKey = sReg
193 sRegName = "iprintWhat"
194 sRegData = ""
195 bRet = Registry_Get(sRegKey, sRegName, sRegType, sRegData)
196 If CON_DEBUG Then _
197 Debug.Print "sRegData=(" & sRegType & ":" & sRegData & ")"
198
199 sRegKey = sReg & "\cTaskPanes"
200 sRegName = "Test1"
201 sRegData = ""
202 bRet = Registry_Get(sRegKey, sRegName, sRegType, sRegData)
203 If CON_DEBUG Then _
204 Debug.Print "sRegData=(" & sRegType & ":" & sRegData & ")"
205
206 MsgBox "Main_Test4 終了 " & bRet
207 End Sub
208
209 '**************************************************
210 ' 関数を呼び出すテスト用のメイン(5) バイナリー
211 ' Update 2019/06/06
212 '**************************************************
213
214 Sub Main_Test5()
215 'バイナリーのデータを登録
216 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
217 Get_Acrobat_Subkey() & "\AVGeneral"
218
219 sRegKey = sReg
220 sRegName = "iprintWhat-x"
221 sRegType = CON_REG_BINARY
222 sRegData = "01"
223 bRet = Registry_Update(sRegKey, sRegName, sRegType, sRegData)
224 If CON_DEBUG Then _
225 Debug.Print "Registry_Update bRet=" & bRet
226
227 sReg = "HKCU\Software\Adobe\Adobe Acrobat\" & _
228 Get_Acrobat_Subkey() & "\FullScreen"
229
230 'バイナリーのデータを取得
231 sRegKey = sReg
232 sRegName = "aTranstypeWithDirection"
233 sRegData = ""
234 bRet = Registry_Get(sRegKey, sRegName, sRegType, sRegData)
235 If CON_DEBUG Then _
236 Debug.Print "sRegData=(" & sRegType & ":" & sRegData & ")"
237
238 MsgBox "Main_Test5 終了 " & bRet
239 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
Module2.bas
001 Option Explicit
002
003 Private Const CON_DEBUG = False 'デバック用
004
005 Private mstrRegistry_Backup_FileName As String
006 Private bRet As Boolean
007
008 Private Const CON_REG_SZ = "REG_SZ" '文字列データ
009 Private Const CON_REG_BINARY = "REG_BINARY" '可変長のバイナリデータ
010 Private Const CON_REG_DWORD = "REG_DWORD" '32bitの整数値データ
011 Private Const CON_REG_QWORD = "REG_QWORD" '64bitの整数値データ
012
013 Private Const CON_ERR1 = vbCrLf & vbCrLf & "処理は中断しました。"
014 Private Const CON_NORMAL_MSG = "この操作を正しく終了しました。"
015 Private Const CON_REG_TEMP_FILE = "Reg-Buckup-Data-"
016
017 'コマンドラインの実行で使う変数
018 Private strCmd As String
019 Private strOutFile(1) As String
020 Private strErr As String
021 Private strWorkFolder As String
022 Private lRetCode As Long
023 Private lErrCount As Long
024 Private lErrCode(0) As Long
025
026 '**************************************************
027 '
028 ' Windowsレジストリのバックアップ
029 '
030 ' 指定されたレジストリキー以下をバックアップします。
031 ' バックアップはReg Exportコマンドを実行して行います。
032 ' 例:reg export "HKCU\Software\xxxx" "D:\yyyy.txt" /y
033 '
034 ' Create : 2019/05/26
035 ' Update : 2019/05/30
036 ' Vertion : 1.0.3
037 '
038 ' 引数1 : strRegKey As String (IN)
039 ' バックアップするレジストリキー
040 '
041 ' 戻り値 : True 正常
042 ' False エラー
043 '
044 ' 備考 : 特になし
045 '
046 ' URL : https://pdf-file.nnn2.com/?p=1074
047 '
048 ' その他 : 著作権等は主張しません。
049 ' 上記URLにコメントを頂けると嬉しいです。
050 '
051 '**************************************************
052
053 Public Function Registry_Backup( _
054 ByVal strRegKey As String) As Boolean
055
056 If CON_DEBUG Then _
057 Debug.Print "Registry_Backup関数 Start " & Time
058
059 'データチェック
060 ' If mstrRegistry_Backup_FileName <> vbNullString Then
061 ' MsgBox "Registry_Backup関数を連続で使用は出来ません。" & _
062 ' CON_ERR1, vbCritical, "実行エラー"
063 ' Registry_Backup = False
064 ' Exit Function
065 ' End If
066
067 '初期化
068 Registry_Backup = False
069 mstrRegistry_Backup_FileName = vbNullString
070
071 'Acrobatレジストリのバックアップのファイル名を決定
072 mstrRegistry_Backup_FileName = Application.ActiveWorkbook.path & _
073 "\" & CON_REG_TEMP_FILE & _
074 Format(Date, "YYYYMMDD") & "-" & _
075 Format(Time, "HHMMSS") & ".txt"
076
077 '終了コードのセット
078 lErrCode(0) = 0
079 lErrCount = UBound(lErrCode)
080 'コマンドラインの編集
081 strCmd = "reg export """ & strRegKey & _
082 """ """ & mstrRegistry_Backup_FileName & """ /y"
083 If CON_DEBUG Then Debug.Print "strCmd=(" & strCmd & ")"
084
085 '■レジストリをバックアップ(エキスポート)
086 'コマンドラインの実行
087 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
088 lErrCount, lErrCode, _
089 strOutFile, strErr, lRetCode)
090
091 '終了の判定
092 If bRet = True And strErr = "" And _
093 InStr(strOutFile(0), CON_NORMAL_MSG) > 0 Then
094 Registry_Backup = True '正常
095 Else
096 Registry_Backup = False '失敗
097 End If
098
099 End Function
100
101 '**************************************************
102 '
103 ' Windowsレジストリの更新(修正、追加)
104 '
105 ' [レジストリキー],[値の名前],[値の種類],[値]に従って
106 ' レジストリを更新します。
107 ' 該当する[値の名前]が無ければ追加します。
108 ' 更新はReg Addコマンドを実行します。
109 ' 例:reg add "HKCU\xxx\yyy" /v abcd /t REG_DWORD /d 3 /f
110 '
111 ' Create : 2019/05/26
112 ' Update : 2019/06/06
113 ' Vertion : 1.0.3
114 '
115 ' 引数1 : strRegKey As String (IN)
116 ' フルのレジストリキー
117 ' 引数2 : strRegName As String (IN)
118 ' レジストリの値の名前
119 ' 引数3 : strRegType As String (IN)
120 ' レジストリの値の種類
121 ' 引数4 : strRegData As String (IN)
122 ' レジストリの値
123 '
124 ' 戻り値 : True 正常
125 ' False エラー
126 '
127 ' 備考 : CON_REG_BINARY の値のチェックはしない。
128 '
129 ' URL : https://pdf-file.nnn2.com/?p=1074
130 '
131 ' その他 : 著作権等は主張しません。
132 ' 上記URLにコメントを頂けると嬉しいです。
133 '
134 ' 例:REG ADD HKLM\xxxx /v YYYY /t REG_BINARY /d fe340ead
135 ' (名前: YYYY、種類: REG_BINARY、データ: fe340ead)
136 '
137 '**************************************************
138
139 Public Function Registry_Update( _
140 ByVal strRegKey As String, _
141 ByVal strRegName As String, _
142 ByVal strRegType As String, _
143 ByVal strRegData As String) As Boolean
144
145 If CON_DEBUG Then _
146 Debug.Print "Registry_Update関数 Start " & Time
147
148 '初期化
149 Registry_Update = False
150
151 'データチェック
152 If IsNull(strRegKey) Then Exit Function
153 If strRegName = vbNullString Or _
154 strRegName = "" Then Exit Function
155 If Not (strRegType = CON_REG_SZ Or _
156 strRegType = CON_REG_BINARY Or _
157 strRegType = CON_REG_DWORD Or _
158 strRegType = CON_REG_QWORD) Then Exit Function
159 If (strRegType = CON_REG_DWORD Or _
160 strRegType = CON_REG_QWORD) And _
161 Not IsNumeric(strRegData) Then Exit Function
162 If strRegData = vbNullString Then Exit Function
163
164 '事前に値(文字データ)の編集
165 If strRegType = CON_REG_SZ Then
166 ' "は"""に変換する。
167 strRegData = Replace(strRegData, """", String(3, """"))
168 End If
169
170 '■レジストリの更新
171 '終了コードのセット
172 lErrCode(0) = 0
173 lErrCount = UBound(lErrCode)
174
175 'コマンドラインの編集
176 '"reg add キー名 /v 値の名前 /t 値の種類 /d 値 /f"
177 strCmd = "reg add """ & strRegKey & """" & _
178 " /v " & strRegName & _
179 " /t " & strRegType & " /d "
180 If strRegType = CON_REG_SZ Then
181 strCmd = strCmd & """" & strRegData & """"
182 Else
183 strCmd = strCmd & strRegData
184 End If
185 strCmd = strCmd & " /f"
186
187 If CON_DEBUG Then Debug.Print "strCmd=(" & strCmd & ")"
188
189 'レジストリを更新(変更、追加)するコマンドラインの実行
190 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
191 lErrCount, lErrCode, _
192 strOutFile, strErr, lRetCode)
193
194 '終了の判定
195 If bRet = True And strErr = "" And _
196 InStr(strOutFile(0), CON_NORMAL_MSG) > 0 Then
197 '正常
198 Else
199 '失敗
200 Registry_Update = False
201 Exit Function
202 End If
203
204 '後処理
205 Registry_Update = True
206
207 End Function
208
209 '**************************************************
210 '
211 ' Windowsレジストリの削除
212 '
213 ' [レジストリキー],[値の名前]に従って、
214 ' 該当するレジストリを削除します。
215 ' 削除はReg Deleteコマンドを実行します。
216 ' 例:reg delete "HKCU\Software\xxx" /v yyy /f
217 '
218 ' Create : 2019/05/26
219 ' Update : 2019/05/30
220 ' Vertion : 1.0.2
221 '
222 ' 引数1 : strRegKey As String (IN)
223 ' フルのレジストリキー
224 ' 引数2 : strRegName As String (IN)
225 ' レジストリの値の名前
226 '
227 ' 戻り値 : True 正常
228 ' False エラー
229 '
230 ' 備考 : 特になし
231 '
232 ' URL : https://pdf-file.nnn2.com/?p=1074
233 '
234 ' その他 : 著作権等は主張しません。
235 ' 上記URLにコメントを頂けると嬉しいです。
236 '
237 '**************************************************
238
239 Public Function Registry_Delete( _
240 ByVal strRegKey As String, _
241 ByVal strRegName As String) As Boolean
242
243 If CON_DEBUG Then _
244 Debug.Print "Registry_Delete関数 Start " & Time
245
246 '初期化
247 Registry_Delete = False
248
249 'データチェック
250 If IsNull(strRegKey) Then Exit Function
251 If strRegKey <> "" Then
252 '値の名前
253 If IsNull(strRegName) Then Exit Function
254 End If
255
256 '■レジストリの削除
257 If Not (strRegKey = "") Then
258
259 '終了コードのセット
260 lErrCode(0) = 0
261 lErrCount = UBound(lErrCode)
262 'コマンドラインの編集
263 '"reg delete キー名 /v 値の名前 /f"
264 strCmd = "reg delete """ & _
265 strRegKey & """ /v " & _
266 strRegName & " /f"
267 If CON_DEBUG Then Debug.Print "strCmd=(" & strCmd & ")"
268
269 'レジストリを削除するコマンドラインの実行
270 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
271 lErrCount, lErrCode, _
272 strOutFile, strErr, lRetCode)
273 '終了の判定
274 If bRet = True And strErr = "" And _
275 InStr(strOutFile(0), CON_NORMAL_MSG) > 0 Then
276 '正常
277 Else
278 '失敗
279 Registry_Delete = False
280 Exit Function
281 End If
282
283 End If
284
285 '後処理
286 Registry_Delete = True
287
288 End Function
289
290 '**************************************************
291 '
292 ' Windowsレジストリの復元
293 '
294 ' 事前にRegistry_Backup関数でバックアップしたファイルに従って
295 ' レジストリを復元します。
296 ' 復元はReg Importコマンドを実行します。
297 ' 例:reg import "D:\reg-save.txt"
298 '
299 ' 復元時に追加されたレジストリは削除されません。
300 ' 削除したい場合は個別にRegistry_Delete関数を実行する必要が
301 ' 有ります。
302 '
303 ' Create : 2019/05/26
304 ' Update : 2019/05/29
305 ' Vertion : 1.0.1
306 '
307 ' 引数 : なし
308 '
309 ' 戻り値 : True 正常
310 ' False エラー
311 '
312 ' 備考 : なし
313 '
314 ' URL : https://pdf-file.nnn2.com/?p=1074
315 '
316 ' その他 : 著作権等は主張しません。
317 ' 上記URLにコメントを頂けると嬉しいです。
318 '
319 '**************************************************
320
321 Public Function Registry_Restore() As Boolean
322
323 If CON_DEBUG Then _
324 Debug.Print "Registry_Restore関数 Start " & Time
325
326 '初期化
327 Registry_Restore = False
328
329 'データチェック
330 If Dir(mstrRegistry_Backup_FileName) = "" Then
331 MsgBox mstrRegistry_Backup_FileName & " が存在しません。" & _
332 CON_ERR1, vbCritical, "実行エラー"
333 Exit Function
334 End If
335 If FileLen(mstrRegistry_Backup_FileName) = 0 Then
336 MsgBox mstrRegistry_Backup_FileName & " のサイズがゼロです。" & _
337 CON_ERR1, vbCritical, "実行エラー"
338 Exit Function
339 End If
340
341 '終了コードのセット
342 lErrCode(0) = 0
343 lErrCount = UBound(lErrCode)
344 'コマンドラインの編集
345 strCmd = "reg import """ & mstrRegistry_Backup_FileName & """"
346
347 If CON_DEBUG Then Debug.Print "strCmd=(" & strCmd & ")"
348
349 '■レジストリを復元(インポート)するコマンドラインの実行
350 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
351 lErrCount, lErrCode, _
352 strOutFile, strErr, lRetCode)
353
354 '終了の判定
355 If bRet = True And strErr = "" And _
356 InStr(strOutFile(1), CON_NORMAL_MSG) > 0 Then
357 '正常
358 Registry_Restore = True
359 'レジストリのバックアップファイルを削除
360 Kill mstrRegistry_Backup_FileName
361 Else
362 '失敗
363 Registry_Restore = False
364 End If
365
366 If CON_DEBUG Then Debug.Print _
367 "Registry_Restore : " & bRet & vbCrLf & _
368 "strOutFile(0) = (" & strOutFile(0) & ")" & vbCrLf & _
369 "strOutFile(1) = (" & strOutFile(1) & ")" & vbCrLf & _
370 "strErr = (" & strErr & ")"
371
372 End Function
373
374 '**************************************************
375 '
376 ' Windowsレジストリの値を取得
377 '
378 ' Reg Queryコマンドを実行します。
379 ' 例:reg query "HKCU\Software\XXX" /v iprintWhat
380 '
381 ' Create : 2019/05/26
382 ' Update : 2019/06/06
383 ' Vertion : 1.0.3
384 '
385 ' 引数1 : strRegKey As String (IN)
386 ' レジストリキー
387 ' 引数2 : strRegName As String (IN)
388 ' 値の名前
389 ' 引数3 : strRegType As String (OUT)
390 ' 取得したレジストリの値の種類
391 ' 引数4 : strRegData As String (OUT)
392 ' 取得したレジストリの値
393 '
394 ' 戻り値 : True 正常
395 ' False エラー
396 '
397 ' 備考 : ・16進数のデータは10進数に変換して返す
398 ' ・オプションは指定できない
399 '
400 ' URL : https://pdf-file.nnn2.com/?p=1074
401 '
402 ' その他 : 著作権等は主張しません。
403 ' 上記URLにコメントを頂けると嬉しいです。
404 '
405 '**************************************************
406
407 Public Function Registry_Get( _
408 ByVal strRegKey As String, _
409 ByVal strRegName As String, _
410 ByRef strRegType As String, _
411 ByRef strRegData As String) As Boolean
412
413 If CON_DEBUG Then _
414 Debug.Print "Registry_Get関数 Start " & Time
415
416 Dim iCnt1 As Long
417 Dim i As Long
418 Dim strWk1() As String
419
420 '初期化
421 Registry_Get = False
422 strRegData = vbNullString
423
424 'データをチェック
425 If IsNull(strRegKey) Then Exit Function
426 If IsNull(strRegName) Then Exit Function
427
428 '終了コードのセット
429 lErrCode(0) = 0
430 lErrCount = UBound(lErrCode)
431
432 'コマンドラインの編集
433 '"reg query キー名 /v 値の名前"
434 strCmd = "reg query """ & strRegKey & """ /v """ & strRegName & """"
435
436 If CON_DEBUG Then Debug.Print "strCmd=(" & strCmd & ")"
437
438 '■レジストリの値を取得します
439 'コマンドラインの実行
440 bRet = RunCommandLineEX(strCmd, strWorkFolder, _
441 lErrCount, lErrCode, _
442 strOutFile, strErr, lRetCode)
443
444 '終了の判定
445 If bRet = True And _
446 Trim$(strErr) = "" And _
447 Trim$(strOutFile(0)) <> "" And _
448 Trim$(strOutFile(1)) = "" Then
449 '正常
450 Else
451 '失敗
452 strRegType = ""
453 strRegData = strOutFile(1)
454 Registry_Get = False
455 Exit Function
456 End If
457
458 If CON_DEBUG Then _
459 Debug.Print "strOutFile(0)=(" & strOutFile(0) & ")"
460 '値の取り出し
461 strWk1() = Split(Mid$(strOutFile(0), (InStr(2, strOutFile(0), vbCrLf) + 2)), " ")
462 strRegType = strWk1(1)
463 strRegData = Replace(Trim$(strWk1(2)), vbCrLf, "")
464 If strWk1(1) = CON_REG_DWORD Or strWk1(1) = CON_REG_QWORD Then
465 If Left$(strRegData, 2) = "0x" Then
466 '16進数を10進数に変換
467 strRegData = CInt("&H" & Right$(strRegData, Len(strRegData) - 2))
468 End If
469 End If
470
471 '後処理
472 Registry_Get = True
473
474 End Function
475
476 '**************************************************
477 '
478 ' Acrobatのバージョン番号からレジストリのサブキーを作成
479 '
480 ' Create : 2019/05/28
481 ' Update : 2019/06/06
482 ' Vertion : 1.0.2
483 '
484 ' 引数 : なし
485 '
486 ' 戻り値 : "" :エラー
487 ' Acrobatがインストールされてない。
488 ' 上記以外:サブキー
489 '
490 ' 備考 : ローカルパソコンにインストールされているAcrobatの
491 ' 実行ファイルからバージョン番号を取得します。
492 ' その番号からレジストリ上で使うサブキーを作成します。
493 ' 詳細は以下のロジックのコメントを御覧ください。
494 '
495 ' URL : https://pdf-file.nnn2.com/?p=1074
496 '
497 ' その他 : 著作権等は主張しません。
498 ' 上記URLにコメントを頂けると嬉しいです。
499 '
500 '**************************************************
501
502 Public Function Get_Acrobat_Subkey() As String
503
504 Const CON_MSG1 = "Get_Acrobat_Subkey関数の実行エラー"
505 Dim sNo As String
506 Dim sAcrobatPath As String
507 Dim sWk() As String
508
509 'Acrobatバージョン番号を取得
510 sNo = Get_Adobe_Acrobat_No(sAcrobatPath)
511
512 'サブキーを決定
513 Select Case sNo
514 Case 4, 5, 6, 7, 8, 9, 10, 11
515 Get_Acrobat_Subkey = sNo & ".0"
516 Case 15 '
517 sWk = Split(sAcrobatPath, "\")
518 Select Case sWk(3)
519 Case "Acrobat DC"
520 'Acrobat DC :Continuous版
521 Get_Acrobat_Subkey = "DC"
522 Case "Acrobat 2015"
523 'Acrobat DC (2015):Classic版 (永続ライセンス版)
524 Get_Acrobat_Subkey = "2015"
525 Case Else
526 MsgBox "Acrobatのインストール環境が通常と異なるか、" _
527 & vbCrLf & "アプリケーションに問題が有ります。" _
528 & CON_ERR1, vbCritical, CON_MSG1
529 End '処理の強制終了
530 End Select
531 Case 17 'Acrobat 2017
532 Get_Acrobat_Subkey = "2017"
533 Case Else
534 Get_Acrobat_Subkey = ""
535 MsgBox "Acrobatのバージョンが確認できませんでした。" & vbCrLf _
536 & "このパソコンにAcrobatはインストールされてない可能性が有ります。" _
537 & CON_ERR1, vbCritical, CON_MSG1
538 End '処理の強制終了
539 End Select
540
541 End Function
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
Module3.bas
001 ' 関数:コマンドラインの起動
002 ' https://pdf-file.nnn2.com/?p=908
003
004 Option Explicit
005
006 Declare Function WaitForSingleObject Lib "kernel32" _
007 (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
008 Declare Function CloseHandle Lib "kernel32" _
009 (ByVal hObject As Long) As Long
010 Declare Function GetExitCodeProcess Lib "kernel32" _
011 (ByVal hProcess As Long, lpExitCode As Long) As Long
012 Declare Function OpenProcess Lib "kernel32" _
013 (ByVal dwDesiredAccess As Long, _
014 ByVal bInheritHandle As Long, _
015 ByVal dwProcessID As Long) As Long
016 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
017
018 Const SYNCHRONIZE = 1048576
019 Const PROCESS_QUERY_INFORMATION = &H400
020
021 ' Teme File No
022 Private gFileCnt As Long
023 ' Debug Mode [ True=On | False=Off ]
024 Private gDebugMode As Boolean
025 Private Const CON_FOLDER_KUGIRI = "\"
026 Private Const CON_READ = False
027
028
029 '**************************************************
030 '
031 ' Run command line & Get messeges
032 '
033 ' 機能 : コマンドラインを実行する。
034 ' 実行プロセスを監視して終了を待つ。
035 ' 終了メッセージ(標準出力,標準エラー出力)を取得する。
036 ' Create : 2016/07/29
037 ' Update : 2016/08/01
038 ' Vertion : 1.0.1
039 '
040 ' 第1引数:strInCommand As String (In)
041 ' コマンドライン
042 ' 第2引数:strInWorkFolder As String (In)
043 ' 一時的な作業フォルダ
044 ' 第3引数:lInErrCount As Long (In)
045 ' 終了コードの数。 -1:無し
046 ' 第4引数:lInErrCode() As Long (In)
047 ' 終了コードの配列
048 ' 第5引数:strOutFile() As String (Out)
049 ' strOutFile(0):標準出力の内容
050 ' strOutFile(1):標準エラー出力の内容
051 ' 第6引数:strOutErrMsg As String (Out)
052 ' プログラム内のエラーメッセージ。エラー無しは ""。
053 ' 第7引数:lOutRetCode As Long (Out)
054 ' コマンドラインの終了コード
055 '
056 ' 戻り値 : True:正常終了 False:エラー発生
057 '
058 ' 備考 : 引数5,6,7の内容でエラー判定を行う。
059 ' URL : https://pdf-file.nnn2.com/?p=908
060 ' その他 : 著作権等は主張しません。
061 ' 上記URLにコメントを頂けると嬉しいです。
062 '
063 '**************************************************
064
065 Public Function RunCommandLineEX( _
066 ByVal strInCommand As String, _
067 ByVal strInWorkFolder As String, _
068 ByVal lInErrCount As Long, _
069 ByRef lInErrCode() As Long, _
070 ByRef strOutFile() As String, _
071 ByRef strOutErrMsg As String, _
072 ByRef lOutRetCode As Long) As Boolean
073 On Error GoTo Err_RunCommandLineEX:
074
075 Dim strCmd As String
076 Dim strFilePath As String
077 Dim strTempFilePath(1) As String
078 Dim i As Long
079
080 '初期化
081 RunCommandLineEX = True
082 strOutErrMsg = ""
083 For i = 0 To UBound(strOutFile)
084 strOutFile(i) = ""
085 Next i
086 If Trim$(strInWorkFolder) = "" Then
087 strInWorkFolder = _
088 Application.ActiveWorkbook.path & CON_FOLDER_KUGIRI
089 End If
090
091 '▼コマンドラインの編集
092 '一時ファイル
093 gFileCnt = gFileCnt + 1
094 strFilePath = strInWorkFolder & _
095 Format(Now(), "yyyymmdd-hhmmss-") & gFileCnt
096 '標準出力用
097 strTempFilePath(0) = strFilePath & ".txt"
098 '標準エラー出力用
099 strTempFilePath(1) = strFilePath & "-err.txt"
100
101 '注意:ファイルパスの前後にダブルクォーテーション
102 strCmd = "cmd /c " & strInCommand & _
103 " > """ & strTempFilePath(0) & _
104 """ 2> """ & strTempFilePath(1) & """"
105
106 '▼コマンドラインの実行
107 Dim hProcess As Long
108 Dim lpdwExitCode As Long
109 Dim dwProcessID As Long
110 Dim lRet As Long
111 Dim lCnt As Long
112 Const CON_SLEEP = 20
113 Const CON_LOOP_CNT = 250
114 lCnt = 0
115 dwProcessID = Shell(strCmd, vbHide)
116 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, _
117 True, dwProcessID)
118 Do
119 Sleep CON_SLEEP
120 DoEvents
121 lRet = GetExitCodeProcess(hProcess, lpdwExitCode)
122 If lInErrCount >= 0 Then
123 For i = 0 To UBound(lInErrCode)
124 If lInErrCode(i) = lpdwExitCode Then Exit Do
125 Next i
126 End If
127 lCnt = lCnt + 1
128 If lCnt > CON_LOOP_CNT Then
129 strOutErrMsg = "[RunCommandLine]Shell Error : " & _
130 "Time Orver " & CON_SLEEP * CON_LOOP_CNT & "ms"
131 RunCommandLineEX = False
132 Exit Do
133 End If
134 If gDebugMode Then _
135 Debug.Print "lCnt=" & lCnt & " " & lpdwExitCode
136 Loop While lpdwExitCode <> 0
137 lOutRetCode = lpdwExitCode
138 If gDebugMode Then _
139 Debug.Print "lCnt=" & lCnt & " " & lpdwExitCode
140
141 If CON_READ Then
142
143 '▼コマンドラインの標準出力と標準エラー出力を取得
144 '▽① 出力テキストを読み込む。
145 ' UTF-8なのでADODB.Streamを使って変換して読み込む。
146 Dim strBuff As String
147 Dim objStream As Object
148 Set objStream = CreateObject("ADODB.Stream")
149 For i = 0 To UBound(strTempFilePath)
150 'UTF-8のファイルを読み込む
151 With objStream
152 .Charset = "UTF-8"
153 .Type = 2 '(1:バイナリ 2:テキスト)
154 .Open
155 .LoadFromFile strTempFilePath(i)
156 strOutFile(i) = .ReadText
157 .Close
158 End With
159 Next i
160 Set objStream = Nothing
161 '△
162
163 Else
164
165 '▽② 標準出力のテキストを読み込む。
166 Dim strInput As String
167 Dim lFileNo As Long
168 For i = 0 To UBound(strTempFilePath)
169 lCnt = 0
170 lFileNo = FreeFile
171 Open strTempFilePath(i) For Input As #lFileNo
172 Do Until EOF(lFileNo)
173 Line Input #lFileNo, strInput
174 If lCnt = 0 Then
175 strOutFile(i) = Trim(strInput)
176 Else
177 strOutFile(i) = strOutFile(i) & _
178 vbCrLf & Trim(strInput)
179 End If
180 lCnt = lCnt + 1
181 Loop
182 Close #lFileNo
183 Next i
184 '△
185
186 End If
187
188 '▼一時ファイルの削除
189 For i = 0 To UBound(strTempFilePath)
190 Kill strTempFilePath(i)
191 Next i
192
193 Exit Function
194 Err_RunCommandLineEX:
195 strOutErrMsg = "(RunCommandLine) Runtime Error :" & _
196 Err.Number & vbCrLf & Err.Description & vbCrLf & _
197 vbCrLf & "Command=" & strCmd
198 RunCommandLineEX = False
199 End Function
200
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
Module4.bas
001 ' 関数:Acrobat , Adobe Reader のインストールパスとバージョンを取得
002 ' https://pdf-file.nnn2.com/?p=767
003 '
004 ' ★上記関数の改造版★
005 ' バージョン番号以外にEXEのパスを返します。
006 '
007
008 Option Explicit
009
010 'Win32 APIを使用するための宣言
011
012 'Public Const HKEY_CLASSES_ROOT = &H80000000
013 'Public Const HKEY_CURRENT_USER = &H80000001
014 'Public Const HKEY_CURRENT_CONFIG = &H80000005
015 'Public Const HKEY_DYN_DATA = &H80000006
016 Public Const HKEY_LOCAL_MACHINE = &H80000002
017 'Public Const HKEY_USERS = &H80000003
018 'Public Const ERROR_SUCCESS = 0&
019
020 Type VS_FIXEDFILEINFO
021 dwSignature As Long
022 dwStrucVersion As Long
023 dwFileVersionMS As Long
024 dwFileVersionLS As Long
025 dwProductVersionMS As Long
026 dwProductVersionLS As Long
027 dwFileFlagsMask As Long
028 dwFileFlags As Long
029 dwFileOS As Long
030 dwFileType As Long
031 dwFileSubtype As Long
032 dwFileDateMS As Long
033 dwFileDateLS As Long
034 End Type
035
036 'レジストリのハンドルを解放する
037 Public Declare Function RegCloseKey Lib "ADVAPI32" _
038 (ByVal hKey&) As Long
039
040 'レジストリのキーを開ける(ハンドルの確保)
041 Public Declare Function RegOpenKeyEx Lib "ADVAPI32" _
042 Alias "RegOpenKeyExA" (ByVal hKey&, ByVal lpSubKey$, _
043 ByVal ulOptions&, ByVal samDesired&, phkResult&) As Long
044
045 'レジストリの値を取得する
046 Public Declare Function RegQueryValueExstr Lib "ADVAPI32" _
047 Alias "RegQueryValueExA" (ByVal hKey&, _
048 ByVal lpValueName$, ByVal lpReserved&, ByVal lpType&, _
049 ByVal lpData$, lpcbData&) As Long
050
051 'ファイルのバージョン情報のサイズを取得する
052 Public Declare Function GetFileVersionInfoSize Lib _
053 "Version.dll" Alias "GetFileVersionInfoSizeA" _
054 (ByVal lptstrFilename As String, lpdwHandle As Long) _
055 As Long
056
057 'ファイルのバージョン情報を取得する
058 Public Declare Function GetFileVersionInfo Lib "Version.dll" _
059 Alias "GetFileVersionInfoA" _
060 (ByVal lptstrFilename As String, ByVal dwHandle As Long, _
061 ByVal dwLen As Long, lpData As Any) As Long
062
063 Public Declare Function VerQueryValue Lib "Version.dll" _
064 Alias "VerQueryValueA" (pBlock As Any, _
065 ByVal lpSubBlock As String, lplpBuffer As Any, _
066 puLen As Long) As Long
067
068 Public Declare Sub MoveMemory Lib "kernel32.dll" _
069 Alias "RtlMoveMemory" (Destination As Any, _
070 Source As Any, ByVal Length As Long)
071
072 '時間指定してCPUをシステムに戻す
073 Public Declare Sub Sleep Lib "kernel32.dll" _
074 (ByVal dwMilliseconds As Long)
075
076 '********************************************************
077 ' Windowsのレジストリから、Acrobatのバージョン番号を取得
078 '********************************************************
079
080 Public Function Get_Adobe_Acrobat_No( _
081 ByRef strAcrobatPath As String) As String
082
083 Const CON_APP = "Acrobat" 'Acrobat
084 'Const CON_APP = "Reader" 'Adobe Reader
085 Dim strVersion As String
086 Dim strMsg As String
087
088 'Acrobat バージョンの取得
089 Call Get_Adobe_App_Info_nnn2(CON_APP, _
090 strAcrobatPath, strVersion, strMsg)
091
092 Get_Adobe_Acrobat_No = strVersion
093 ' Debug.Print "▼Get_Adobe_Acrobat_No()"
094 ' Debug.Print "AcrobatPath ='" & strAcrobatPath & "'" & vbCrLf & _
095 ' "Acrobat Version='" & strVersion & "'" & vbCrLf & _
096 ' "Message ='" & strMsg & "'"
097 End Function
098
099 '**************************************************
100 '
101 ' Acrobat , Adobe Reader アプリのインストールパスと
102 ' アプリケーションのバージョンを取得する
103 '
104 ' Get the version and application path
105 ' for acrobat and adobe reader.
106 '
107 ' Create : 2013/10/08
108 ' Update :
109 ' Vertion : 1.0.0
110 '
111 ' 引数1 : strApp As String (IN)
112 ' 'Acrobat' Acrobatの処理
113 ' 'Reader' Adobe Readerの処理
114 ' 引数2 : strPath As String (OUT)
115 ' Adobe アプリケーションパス
116 ' 引数3 : strVersion As String (OUT)
117 ' アプリケーションのバージョン番号 4~11
118 ' 引数4 : strMsg As String (OUT)
119 ' エラーメッセージ
120 ' ""はエラー無し
121 '
122 ' 戻り値 : True 正常処理
123 ' False 実行エラー等
124 '
125 ' 備考 :
126 ' 1. 以下のサイトの情報を元に作成しました
127 ' http://helpx.adobe.com/jp/acrobat/kb/511265.html
128 ' URL : https://pdf-file.nnn2.com/?p=767
129 ' その他 : 著作権等は主張しません。
130 ' 上記URLにコメントを頂けると嬉しいです。
131 '
132 '**************************************************
133
134 Public Function Get_Adobe_App_Info_nnn2( _
135 ByVal strApp As String, _
136 ByRef strPath As String, _
137 ByRef strVersion As String, _
138 ByRef strMsg As String) As Boolean
139
140 On Error GoTo Err_Get_Adobe_App_Info_nnn2:
141
142 Dim strFileVersion As String
143 Dim strProductVersion As String
144 Dim strSubKey As String
145 Dim strRootKey As String
146 Dim InstallPathReg As Long
147 Dim lLength As Long
148 Dim lRet As Long
149 Dim strName As String
150
151 strMsg = ""
152 strRootKey = HKEY_LOCAL_MACHINE
153 If strApp = "Acrobat" Then
154 'Acrobat Reg
155 strSubKey = "SOFTWARE\Microsoft\Windows\" & _
156 "CurrentVersion\App Paths\Acrobat.exe"
157 Else
158 'Adobe Reader Reg
159 strSubKey = "SOFTWARE\Microsoft\Windows\" & _
160 "CurrentVersion\App Paths\AcroRd32.exe"
161 End If
162
163 'キーをオープンしてハンドルを得る
164 lRet = RegOpenKeyEx(strRootKey, strSubKey, 0, 1, _
165 InstallPathReg)
166
167 'バッファを確保する
168 strPath = String(250, Chr(0))
169 lLength = Len(strPath) '長さ
170
171 '"*.exe"エントリから既定のレジストリを得る
172 strName = ""
173 lRet = RegQueryValueExstr(InstallPathReg, strName, _
174 0, 0, strPath, lLength)
175
176 'レジストリ値の存在チェック
177 strPath = Trim$(Replace(strPath, Chr(0), " "))
178 If strPath = "" Then
179 'エラー:アプリケーションは未インストール
180 strMsg = "Not Found Adobe apllication"
181 strVersion = vbNullString
182 Exit Function
183 End If
184
185 'アプリのフルパスを出力
186 strPath = Left$(strPath, InStr(strPath, ".exe") + 3)
187
188 'ハンドルを閉じる
189 Call RegCloseKey(InstallPathReg)
190
191 '***************************************************
192 '取得したパスの exeファイル情報を取得する
193 '***************************************************
194
195 Dim lngSizeOfVersionInfo As Long
196 Dim lngDummyHandle As Long
197 Dim bytDummyVersionInfo() As Byte
198 Dim lngPointerVersionInfo As Long
199 Dim lnglLengthVersionInfo As Long
200 Dim udtVSFixedFileInfo As VS_FIXEDFILEINFO
201
202 'バージョン情報のサイズを取得
203 lngSizeOfVersionInfo = GetFileVersionInfoSize(strPath, _
204 lngDummyHandle)
205
206 'ダミー変数の領域を確保
207 ReDim bytDummyVersionInfo(lngSizeOfVersionInfo - 1)
208
209 'バージョン情報を取得
210 lRet = GetFileVersionInfo(strPath, 0, _
211 lngSizeOfVersionInfo, bytDummyVersionInfo(0))
212
213 'バージョン情報リソースのルートブロックを取得
214 lRet = VerQueryValue(bytDummyVersionInfo(0), "\", _
215 lngPointerVersionInfo, lnglLengthVersionInfo)
216
217 '取得したルートブロックをバージョン情報の構造体へ移動
218 MoveMemory udtVSFixedFileInfo, _
219 ByVal lngPointerVersionInfo, Len(udtVSFixedFileInfo)
220
221 With udtVSFixedFileInfo
222 'ファイルバージョンを取り出し
223 strFileVersion = _
224 CStr((.dwFileVersionMS \ 2 ^ 16) And &HFFFF&) & "." & _
225 CStr(.dwFileVersionMS And &HFFFF&) & "." & _
226 CStr((.dwFileVersionLS \ 2 ^ 16) And &HFFFF&) & "." & _
227 CStr(.dwFileVersionLS And &HFFFF&)
228
229 '製品バージョンを取り出し (内容はファイルバージョン)
230 strProductVersion = _
231 CStr((.dwProductVersionMS \ 2 ^ 16) And &HFFFF&) & "." & _
232 CStr(.dwProductVersionMS And &HFFFF&) & "." & _
233 CStr((.dwProductVersionLS \ 2 ^ 16) And &HFFFF&) & "." & _
234 CStr(.dwProductVersionLS And &HFFFF&)
235
236 strVersion = CStr((.dwProductVersionMS \ 2 ^ 16) And &HFFFF&)
237
238 End With
239
240 '確認
241 ' Debug.Print "strFileVersion =" & strFileVersion
242 ' Debug.Print "strProductVersion=" & strProductVersion
243
244 Get_Adobe_App_Info_nnn2 = True
245 Exit Function
246
247 Err_Get_Adobe_App_Info_nnn2:
248 strMsg = "Run Time Error" & vbCrLf & Err.Number & _
249 vbCrLf & Err.Description
250 Get_Adobe_App_Info_nnn2 = False
251 End Function
252
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
実行結果のログ
1 Registry_Backup関数 Start 6:49:40
2 strCmd=(reg export "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" "D:\Tools\IMG\Reg-Buckup-Data-20190606-064940.txt" /y)
3 Registry_Backup bRet=True
4 Registry_Update関数 Start 6:49:41
5 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintWhat /t REG_DWORD /d 3 /f)
6 Registry_Update bRet=True
7 Registry_Update関数 Start 6:49:42
8 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest1 /t REG_SZ /d "ABC" /f)
9 Registry_Update bRet=True
10 Registry_Update関数 Start 6:49:43
11 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest2 /t REG_QWORD /d 234 /f)
12 Registry_Update bRet=True
13 Registry_Restore関数 Start 6:49:43
14 strCmd=(reg import "D:\Tools\IMG\Reg-Buckup-Data-20190606-064940.txt")
15 Registry_Restore : True
16 strOutFile(0) = ()
17 strOutFile(1) = (この操作を正しく終了しました。
18 )
19 strErr = ()
20 Registry_Restore bRet=True
21
22 Registry_Backup関数 Start 6:49:47
23 strCmd=(reg export "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" "D:\Tools\IMG\Reg-Buckup-Data-20190606-064947.txt" /y)
24 Registry_Backup bRet=True
25 Registry_Update関数 Start 6:49:48
26 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintWhat /t REG_DWORD /d 1 /f)
27 Registry_Update bRet=True
28 Registry_Update関数 Start 6:49:49
29 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral\cTaskPanes" /v Test1 /t REG_SZ /d "Abc"""xyz"""3" /f)
30 Registry_Update bRet=True
31 Registry_Update関数 Start 6:49:49
32 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral\cToolbars" /v Test2 /t REG_QWORD /d 789 /f)
33 Registry_Update bRet=True
34 Registry_Restore関数 Start 6:49:50
35 strCmd=(reg import "D:\Tools\IMG\Reg-Buckup-Data-20190606-064947.txt")
36 Registry_Restore : True
37 strOutFile(0) = ()
38 strOutFile(1) = (この操作を正しく終了しました。
39 )
40 strErr = ()
41 Registry_Restore bRet=True
42 Registry_Backup関数 Start 6:49:54
43
44 strCmd=(reg export "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" "D:\Tools\IMG\Reg-Buckup-Data-20190606-064954.txt" /y)
45 Registry_Backup bRet=True
46 Registry_Update関数 Start 6:49:54
47 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintWhat /t REG_DWORD /d 3 /f)
48 Registry_Update bRet=True
49 Registry_Update関数 Start 6:49:55
50 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest-3 /t REG_SZ /d "21" /f)
51 Registry_Update bRet=True
52 Registry_Update関数 Start 6:49:56
53 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest-4 /t REG_QWORD /d 32 /f)
54 Registry_Update bRet=True
55 Registry_Delete関数 Start 6:49:56
56 strCmd=(reg delete "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest-3 /f)
57 Registry_Update bRet=True
58 Registry_Delete関数 Start 6:49:57
59 strCmd=(reg delete "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintTest-4 /f)
60 Registry_Update bRet=True
61 Registry_Restore関数 Start 6:50:04
62 strCmd=(reg import "D:\Tools\IMG\Reg-Buckup-Data-20190606-064954.txt")
63 Registry_Restore : True
64 strOutFile(0) = ()
65 strOutFile(1) = (この操作を正しく終了しました。
66 )
67 strErr = ()
68 Registry_Restore bRet=True
69
70 Registry_Get関数 Start 6:50:09
71 strCmd=(reg query "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v "iprintWhat")
72 strOutFile(0)=(
73 HKEY_CURRENT_USER\Software\Adobe\Adobe Acrobat\2015\AVGeneral
74 iprintWhat REG_DWORD 0x0
75 )
76 sRegData=(REG_DWORD:0)
77 Registry_Get関数 Start 6:50:09
78 strCmd=(reg query "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral\cTaskPanes" /v "Test1")
79 strOutFile(0)=(
80 HKEY_CURRENT_USER\Software\Adobe\Adobe Acrobat\2015\AVGeneral\cTaskPanes
81 Test1 REG_SZ Abc"xyz"3
82 )
83 sRegData=(REG_SZ:Abc"xyz"3)
84
85 Registry_Update関数 Start 6:50:12
86 strCmd=(reg add "HKCU\Software\Adobe\Adobe Acrobat\2015\AVGeneral" /v iprintWhat-x /t REG_BINARY /d 01 /f)
87 Registry_Update bRet=True
88 Registry_Get関数 Start 6:50:12
89 strCmd=(reg query "HKCU\Software\Adobe\Adobe Acrobat\2015\FullScreen" /v "aTranstypeWithDirection")
90 strOutFile(0)=(
91 HKEY_CURRENT_USER\Software\Adobe\Adobe Acrobat\2015\FullScreen
92 aTranstypeWithDirection REG_BINARY 00
93 )
94 sRegData=(REG_BINARY:00)
95
備考
- 「 CON_DEBUG = False 」にするとデバッグ情報は出力されません。当サンプルのテスト使用が完了したら同様に 「 CON_DEBUG = False 」 にしてください。
- 当関数はPDFファイルが持っているプロパティ情報の更新はできません。
- Acrobat 8、9、10、XI ではPDF変換に関す情報を外部ファイルExportTask.xml に持っています。読み込むだけです。
- レジストリの値の種類
* が当関数で使う種類です。- REG_NONE :値無し型
- REG_SZ :文字列データ *
- REG_MULTI_SZ :複数行に渡る文字列データ
- REG_EXPAND_SZ :展開可能な文字列データ
- REG_BINARY :可変長のバイナリデータ *
- REG_DWORD :32bitの整数値データ *
- REG_QWORD :64bitの整数値データ *
- Acrobatのサブキーはテスト結果から出した内容です。メーカ提供の技術情報では有りません。
参照
Regコマンド
- 【Windows 10対応】regコマンドを使ってコマンドプロンプトからレジストリを操作する
- Reg - DOS コマンド一覧
- reg - レジストリ管理
- 特定のレジストリ・キー以下を素早くバックアップする
Windows レジストリ全般
コメントについて
レジストリの更新は非常に危険が大きいです。ご不明点が有れば、ご遠慮無くコメントをください。Regコマンドを使いこなしている訳ではないですが、判る範囲で返答させていただきます。