Table of Contents
複数のPCに開発環境を作る場合は、使用するコネクタとバージョンを等しく揃えたい
Delphi/C++Builder/RAD Studio 向けの Enterprise Connectors を使うと、さまざまなクラウドのAPIやデータを SQL で操作できることは、様々な機会でご紹介してきたとおりです。
この Enterprise Connectors は、新しい接続先のサポートや機能の修正等を含めた新しいビルドが CData 社より年に数回リリースされています。
このため、複数の作業用PCを併用するケースでは、環境の構築時期にズレがあるとインストールされているコネクタのビルドが異なる可能性が懸念されます。このような不整合はコネクタの挙動の違いを引き起こすかもしれません。あるいは、環境ごとに、インストールの過不足があるかもしれません。そこでここでは Enterprise Connectors のインストール済みコネクタおよびバージョンの一覧を取得する方法を紹介いたします。
この記事では Windows 10 1709 Fall Creators Update の環境で動作を確認しましたが、Windows10 は年2回のアップデートが提供されますので、バージョンによってはスクリーンショット等が異なる可能性があることにご注意ください。
基本中の基本はコントロールパネルでの確認
Windows の標準機能では「コントロールパネル」の[プログラムのアンインストール」の項目で一覧表示できます。初期状態ではインストールしした全てのソフトウェアが表示されますが、右上の検索窓にキーワードを入れることで Enterprise Connectors だけを絞り込み表示可能です。
この方法は Windows10 以外でも可能と思います。
Windows10 の設定アプリでも確認可能
Windows 10 の設定アプリはで、こんなふうに見ることもできます。
でも、これらの方法では情報を閲覧できるだけであり、リストが手に入るわけではありません。複数機材のインストール状況を比較するならリストが手に入るほうが使いやすいですね。そこでリストが入手可能な方法も考えてみましょう。
PowerShell のスクリプトでリストを生成してみる
Windows の管理は基本的に PowerShell で行えるようになっているわけですが、以下のようなスクリプトを用いればリストを取得できます。
1 2 3 4 5 6 7 8 9 10 11 |
if ( [System.Environment]::Is64BitProcess ) { $regpath = "HKLM:SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall" } else { $regpath = "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall" } Get-ChildItem -Path $regpath | %{Get-ItemProperty $_.PsPath} | ?{$_.DisplayName -cmatch 'FireDAC'} | sort displayVersion | select DisplayVersion,DisplayName |
これを私の環境で実行してみると、結果はこのようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 |
DisplayVersion DisplayName -------------- ----------- 17.0.6445 CData FireDAC Components for GoogleSearch 17.0.6445 CData FireDAC Components for Twitter 17.0.6445 CData FireDAC Components for Salesforce 17.0.6445 CData FireDAC Components for xBase 17.0.6445 CData FireDAC Components for Azure 17.0.6445 CData FireDAC Components for eBay 17.0.6495 CData FireDAC Components for JIRA 17.0.6521 CData FireDAC Components for Active Directory 17.0.6521 CData FireDAC Components for MongoDB |
コネクタによって DisplayVersion の数値が微妙に違っていますね。このような差異があると同じ操作を行っても結果が違うおそれがありますので、複数の開発マシンをご利用の場合は DisplayVersion を揃えていただいたほうがよいでしょう。
Delphi で出力するコードも書いてみよう
この PowerShell の処理と同等の内容を Delphi でも書いてみます。今回作るものは Form に貼り付けた TMemo に出力する程度のシンプルなものとして作ってみます。実際に動かしてみたものがこちら。
そして書いたコードはこちら。Form の onFormCreate で処理を行う想定で書いています。この手の処理のように OS 側の管理に関連する処理は PowerShell で書くほうがシンプルに書ける場合が多いので Delphi のコードのほうが分量が多いのは仕方がないかもしれません。ただし PowerShell でのスクリプト実行は Windows のデフォルト設定では制約がありますから、分量が短いスクリプトで済むとはいえ、取り回しが容易とは言い難いです。かといって制約を緩めるのはセキュリティ上のリスクを伴いますので、そういう意味ではバイナリのほうが取り扱いやすいのかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
<span class="hljs-keyword" style="color:#000080;font-weight:bold;">unit</span> Unit1; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">interface</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">uses</span> Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Win.Registry; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">type</span> <span class="hljs-title" style="color:#0000ff;font-weight:bold;">TForm1</span> = <span class="hljs-keyword" style="color:#000080;font-weight:bold;">class</span>(TForm) Memo1: TMemo; <span class="hljs-function"><span class="hljs-keyword" style="color:#000080;font-weight:bold;">procedure</span> <span class="hljs-title" style="color:#0000ff;font-weight:bold;">FormCreate</span><span class="hljs-params">(Sender: TObject)</span>;</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">private</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">{ Private 宣言 }</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">public</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">{ Public 宣言 }</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">var</span> Form1: TForm1; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">implementation</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">{$R *.dfm}</span> <span class="hljs-function"><span class="hljs-keyword" style="color:#000080;font-weight:bold;">procedure</span> <span class="hljs-title" style="color:#0000ff;font-weight:bold;">TForm1</span>.<span class="hljs-title" style="color:#0000ff;font-weight:bold;">FormCreate</span><span class="hljs-params">(Sender: TObject)</span>;</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">var</span> AppKey: <span class="hljs-keyword" style="color:#000080;font-weight:bold;">String</span>; Reg: TRegistry; KeyList: TStringList; SubKey: <span class="hljs-keyword" style="color:#000080;font-weight:bold;">String</span>; RegSubKey: TRegistry; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">begin</span> Reg := TRegistry.Create; KeyList := TStringList.Create; <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 64-bit, 32-bit で参照するレジストリを変える</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">{$IFDEF Win32}</span> AppKey := <span class="hljs-string" style="color:#0000ff;font-weight:bold;">'SoftwareMicrosoftWindowsCurrentVersionUninstall'</span>; <span class="hljs-comment" style="color:#008000;font-weight:bold;">{$ELSE}</span> AppKey := <span class="hljs-string" style="color:#0000ff;font-weight:bold;">'SoftwareWOW6432NodeMicrosoftWindowsCurrentVersionUninstall'</span>; <span class="hljs-comment" style="color:#008000;font-weight:bold;">{$ENDIF}</span> Reg.RootKey := HKEY_LOCAL_MACHINE; Memo1.Lines.Clear; Memo1.Lines.Add(AppKey); <span class="hljs-keyword" style="color:#000080;font-weight:bold;">if</span> Reg.OpenKeyReadOnly(AppKey) <span class="hljs-keyword" style="color:#000080;font-weight:bold;">then</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">begin</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">// サブキーのうち、 DisplayName に 'FireDAC' を含むものを</span> <span class="hljs-comment" style="color:#008000;font-weight:bold;">// 探してバージョンと名前を表示する</span> Reg.GetKeyNames(KeyList); <span class="hljs-keyword" style="color:#000080;font-weight:bold;">for</span> SubKey <span class="hljs-keyword" style="color:#000080;font-weight:bold;">in</span> KeyList <span class="hljs-keyword" style="color:#000080;font-weight:bold;">do</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">begin</span> RegSubKey := TRegistry.Create; RegSubKey.RootKey := HKEY_LOCAL_MACHINE; RegSubKey.OpenKeyReadOnly( AppKey + <span class="hljs-string" style="color:#0000ff;font-weight:bold;">''</span> + SubKey ); <span class="hljs-keyword" style="color:#000080;font-weight:bold;">if</span> ( Pos(<span class="hljs-string" style="color:#0000ff;font-weight:bold;">'FireDAC'</span>, RegSubKey.ReadString(<span class="hljs-string" style="color:#0000ff;font-weight:bold;">'DisplayName'</span>) ) > <span class="hljs-number">0</span> ) <span class="hljs-keyword" style="color:#000080;font-weight:bold;">then</span> <span class="hljs-keyword" style="color:#000080;font-weight:bold;">begin</span> Memo1.Lines.Add( RegSubKey.ReadString(<span class="hljs-string" style="color:#0000ff;font-weight:bold;">'DisplayVersion'</span>) + <span class="hljs-string" style="color:#0000ff;font-weight:bold;">#9</span> + RegSubKey.ReadString(<span class="hljs-string" style="color:#0000ff;font-weight:bold;">'DisplayName'</span>)); <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; RegSubKey.Destroy; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; Reg.Destroy; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>; <span class="hljs-keyword" style="color:#000080;font-weight:bold;">end</span>. |
Enterprise Connectors を複数の開発機材でお使いの場合に、なんか変だなーと思うような挙動がありましたら、コネクタのビルドが揃っていることを確認してみてください。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition