関数:レジストリの操作(Regコマンド版)

TOP > サンプル/関数 > *      [...]

概要

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のバージョンによって変化します。

  1. Acrobat 4, 5, 6, 7, 8, 9, X (10), XI (11) の時
    • サブキー:Acrobatバージョン番号 + ".0"
  2. Acrobat DC (15)の時
    • Acrobat.exeのインストールフォルダが
      "Acrobat DC"ならば、サブキー:"DC"
    • Acrobat.exeのインストールフォルダが
      "Acrobat 2015"ならば、サブキー:"2015"
  3. Acrobat 2017 (17)の時
    • サブキー:"2017"

Acrobat XIのバージョン番号はAcrobat.exeのプロパティの製品バージョン (11.0.23.22) から頭の部分 (11) を取っています。

Acrobat.exe の製品バージョン

 

機能

レジストリを操作します。

  1. レジストリのファイルへのバックアップ
  2. 値の更新と新規追加
  3. バックアップファイルからレジストリの復元
  4. レジストリの削除
  5. 値の取得

Acrobat用のレジストリのサブキー作成の関数も用意しました。

  1. Acroabatのサブキーの作成

 

注意

  1. 当関数はレジストリの変更を行います。操作を誤ると最悪でOS起動ができなくなり、OSの再インストールが必要となります。
  2. 当関数は動作を保証するものでは有りません。ご利用によって生じたいかなる障害も いかなる責任も持つものでは有りません。使用者の責任でご使用下さい。
  3. 当関数はRegコマンドを使用します。これに関する基本的な知識が無い人の使用を禁止します。
  4. レジストリ更新には制限が有ります。制限を解除したい場合は個別に当関数を手修正してご使用下さい。
    • ” reg:[32|64] ”、" /s" 等の追加オプションの使用はできません。
    • レジストリの値の種類は引数に指定できる3種類のみとします。
  5. Registry_Update関数では値の名前が存在しないと新規追加になります。Registry_Restore関数での復元処理では削除されません。削除したい場合は Registry_Delete関数をご利用ください。
  6. レジストリの基本的な知識を必要とします。

 

レジストリのルートキー

レジストリのルートキーは長いので、以下の様に省略した形式が使用できます。

  • 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 備考

  1. バックアップしたファイル名が欲しい時は、当関数内で使用している変数「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 備考

  1. 事前にRegistry_Backup 関数が実行されてないとエラーになります。
  2. 復元は必須では無いです。使用者の判断に任せます。

 


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 備考

  1. 数値の値が16進数の場合は10進数に変換して返します。
  2. 該当レジストリが見つからない場合は、戻り値にFalseが返され、strRegData にその時のエラーメッセージがセットされます。
    例:"エラー: 指定されたレジストリ キーまたは値が見つかりませんでした"

 


6. Get_Acrobat_Subkey 関数

6.1 説明

パソコンにインストールされているAcrobatのバージョン情報またはインストールフォルダから、Acrobat用のレジストリのサブキーを作成します。詳細は「Acrobatとレジストリ」を参照。

6.2 形式

[string] = Get_Acrobat_Subkey( )

6.3 引数

なし。

6.4 戻り値 (string)

サブキーの文字列、又はエラーメッセージ。

6.5 備考

  1. パソコンにAcrobatがインストールされてないと、処理は中断にし、Msgbox関数でエラーのダイアログが表示されます。

 


 

VBAサンプル

  • Main_Test1
    1. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"のレジストリキー以下をバックアップします。
    2. 上記のレジストリキーで以下の更新を行います。
      • 値の名前:iprintWhat、値の種類:REG_DWORD、値:3
      • 値の名前:iprintTest1、値の種類:REG_SZ、値:"ABC"
      • 値の名前:iprintTest2,値の種類:REG_QWORD、値:234
    3. バックアップファイルでレジストリを復元します。
  • Main_Test2
    1. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*1)のレジストリキー以下をバックアップします。
    2. 以下の更新を行います。
      • レジストリキー: *1 、値の名前:iprintWhat、値の種類:REG_DWORD、値:1
      • レジストリキー:*1 + "¥cTaskPanes" 、値の名前:Test1、値の種類:REG_SZ、値:"Abc"xyz"3"
      • レジストリキー:*1 + "¥cToolbars" 、 値の名前:Test2、値の種類:REG_QWORD、値:789
    3. バックアップファイルでレジストリを復元します。
  • Main_Test3
    1. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*2)のレジストリキー以下をバックアップします。
    2. 以下の更新を行います。
      • レジストリキー:*2 、値の名前:iprintWhat、値の種類:REG_DWORD、値:3
      • レジストリキー:*2 、値の名前:iprintTest-3、値の種類:REG_SZ、値:"21"
      • レジストリキー:*2 、値の名前:iprintTest-4,値の種類:REG_QWORD、値:32
    3. 以下のレンジストリを削除します。
      • レジストリキー:*2 、値の名前:iprintTest-3
      • レジストリキー:*2 、値の名前:iprintTest-4
    4. バックアップファイルでレジストリを復元します。
  • Main_Test4
    1. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*3)の以下の値を取得します。
      • レジストリキー:*3 、値の名前:iprintWhat
      • レジストリキー:*3 + "cTaskPanes"、値の名前:Test1
        これは存在しないのでエラーになります。
  • Main_Test5
    1. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥AVGeneral"(*4)の以下の値を更新します。
      • レジストリキー:*4 、 値の名前:iprintWhat-x、値の種類:REG_BINARY、値:01
    2. "HKCU¥Software¥Adobe¥Adobe Acrobat¥11.0¥FullScreen"(*5)の以下の値を更新します。
    3. レジストリキー:*5 、値の名前:aTranstypeWithDirection

Downloadsample-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 ' http://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 : http://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 ' http://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 : http://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

 

備考

  1. 「 CON_DEBUG = False 」にするとデバッグ情報は出力されません。当サンプルのテスト使用が完了したら同様に 「 CON_DEBUG = False 」 にしてください。
  2. 当関数はPDFファイルが持っているプロパティ情報の更新はできません。
  3. Acrobat 8、9、10、XI ではPDF変換に関す情報を外部ファイルExportTask.xml に持っています。読み込むだけです。
  4. レジストリの値の種類
    * が当関数で使う種類です。
    • REG_NONE :値無し型
    • REG_SZ :文字列データ *
    • REG_MULTI_SZ :複数行に渡る文字列データ
    • REG_EXPAND_SZ :展開可能な文字列データ
    • REG_BINARY :可変長のバイナリデータ *
    • REG_DWORD :32bitの整数値データ *
    • REG_QWORD :64bitの整数値データ *
  5. Acrobatのサブキーはテスト結果から出した内容です。メーカ提供の技術情報では有りません。

 

参照

Regコマンド

Windows レジストリ全般

 

コメントについて

レジストリの更新は非常に危険が大きいです。ご不明点が有れば、ご遠慮無くコメントをください。Regコマンドを使いこなしている訳ではないですが、判る範囲で返答させていただきます。

 

VBA(Excel)からAcrobat経由でPDFをプログラミング操作(OLE:IAC)する