ShlEx11.LZH 各種機能詰め合わせアプレット ( One of Go's Applet ) Copyright (c) 2000-2001 by Ogo mailto:ogou@icity.or.jp ●はじめに 仕事の関係でちょっとほしかった機能を独立したアプレットとして 作成しました。 最初は ShellExecute という Windows API で Windows の関連付けに 従ってファイルをオープンする機能を持つだけだったのが肥大化して このようなものになっています。 (^^; MS-DOS コマンドでも実現できるものがいくつかありますが、それでは 機械毎のショートカット作成の内容が異なったりするので、それを防ぐ ためだったりします。 役に立ちそうだったら使ってやって下さい。 Ver.1.1 にバージョンアップするに当たり、結局、過去に公開した 「シェル・ファイル・オペレーション アプレット」 「パスワード入力ダイアローグ」 「ディスクフォーマットダイアローグ」 「各種機能詰め合わせアプレット(ShellEx.exe)」 と更に追加の機能をまとめて全てを1つに統合してしまいました。 具体的なコマンド・使い方は後述の通り。 ところで、このドキュメント内では「データベースシステム」という 用語が随所に出て来ます。 これは例えば「MS-Access」や「桐」などのデータベースソフトでは なく、それらデータベースソフトを使って構築したアプリケーション を意味します。 端的に言えば、「MS-Access」ならば(通常)「*.Mdb ファイル1つ」 ですし、「桐」ならば「 *.Tbl をベースにした *.Wfm や *.Rpt など のファイル群」になります。 ●動作環境と開発環境 【動作環境】 MS-Windows 95 以降 (と思います (^^; 動作確認報告募集中) 【製作環境】 Epson Pro-800L & MS-Windows Win 98 SE & Borland Delphi 4.0 ( Update Pack 3 ) ●インストールとアンインストール 圧縮ファイルを解凍すると、 このテキストを含めて2つのファイルが 入っています( *.exe と *.txt )。 必要なのは *.exe のみです。 データベースシステム内で外部コマンドとして使うことのみを想定して 作成していますので、当該データベースシステムの存在するフォルダ にコピー(叉は移動)して利用するのが基本です。 配布する時は、データベースシステムのファイル群と一緒に(同一の フォルダに)ファイルをコピー(叉は移動)します。 もちろん、アンインストールはフォルダごと削除すればOKです。 レジストリを読むことはあっても、書き込みは行いませんので、安心 して試用することができます。 ●試してみましょう とりあえず試しましょう。 どのフォルダに置いてあっても構いませんので、「ShellEx.exe」を ダブルクリックします。 使い方が表示されましたね? (^^;; そうです。起動時パラメーターが必要なんです。 'ShellEx %1 %2 %3' %1 = コマンド名 %2 = 処理対象 %3 = 処理内容 ●自作データベースシステムへの取り込みについて マクロ(イベント)中で外部コマンドとして「ShellEx.exe」を実行 するということに尽きます。 (^^) 起動時パラメーターについては、下記を見ながら適切なものをプロ グラミングして下さい。 ●動作に関する説明 1.概要 このアプレットは、動作完了時(成功しても失敗しても)に 必ず「$Finish.Txt」という名の「動作完了確認用」テキスト ファイルを同一フォルダに生成します(このファイルの中身 は、動作結果によって異なった内容になります。また、呼び 出されたときのコマンドラインパラメーターも記録しますの で、外部コマンド呼び出し時のデバッグの情報として有益だ と思います)。 また、P コマンド (Password) と S コマンド (Selectfile) を使うと、これとは別に、「$Resault.Txt」というテキスト ファイルに必要な情報を書き出します。 従って、桐やアクセス等からこのアプレットを呼び出す時は、 事前に「$Finish.Txt」と「$Resault.Txt」を探して、存在 する場合は削除することが前準備となります。 その上でパラメーター付きの外部コマンドとして、このアプ レットを呼び出し、その後、「$Finish.Txt」が生成される まで無限ループを回して待つというのが基本です。 特に、X コマンド (eXecute) の場合、本来非同期実行になる 別ソフトの呼び出しが、無限ループで「$Finish.Txt」生成を 監視することにより、疑似的に同期実行にできます(「同期 実行」とは、呼び出されたプロセスが終了しない限り、元の プロセス側で次の処理に制御が移らないことを言い、MS-DOS 的・シングルタスク的制御になります。 Windows での標準は マルチスレッドの同時実行ですので、「非同期実行」でしか 外部ソフトを呼び出せず、データベースシステム側から制御 不能に陥ってしまいます)。 2.Windows に関する TIPS このアプレットに限らず、以下に述べる Windows の仕様に ついて必ず理解しておいて下さい。 「ファイル名・フォルダ名をパラメーターとして渡す時は、 ファイル名・フォルダ名を " (半角ダブルクォーティション) で囲むべきである」 MS-DOS (Win 3.1) から Win 95 に移行する際に MS はロング ファイル名・ロングフォルダ名をサポートしたのですが、何と その中に「半角スペースを含めてもよい」という無理を通して しまいました。 何故これが問題になるかと言うと、起動時パラメーターを渡す プログラムでは(特に2つ以上のパラメーターを必要とする・ 許容するプログラムでは)、1つ目と2つ目のパラメーターの 間は半角スペースで区切るのが常識であるのに、ファイル名・ フォルダ名の中に半角スペースが含まれる可能性があるわけで すから、常識的には1つのファイル名・フォルダ名が2つ以上 のパラメーターに分割されて認識されても仕方ありません(要 するに「C:\Program Files\test\test.txt」をパラメータとし て与えると、「C:\Program」と「Files\test\test.txt」の2つ のパラメーターが渡されたと OS が判断するわけです)。 さぁ、そこで MS が泥縄で行なった仕様変更は、「文字列を " (半角ダブルクォーティション)で囲んだ場合は、その中に半 角スペースが含まれていても、 " で囲まれた中身全体を1つの パラメーターと看做す」ということでした。 つまり、 ファイル名・フォルダ名をパラメーターとして渡す際 には、ファイル名・フォルダ名を " (半角ダブルクォーティシ ョン)で囲むことで、ファイル名・フォルダ名を途中で分割され ないようにすることが必須になったのです。 この ShellEx.exe に渡されるパラメーターはこの基本的条件を 満たしている必要があります。 呼び出す際にファイル名・フォルダ名を渡す時は、それを " (半角ダブルクォーティション)で囲む必要があると認識して おいて下さい( 桐 Win では面倒なんですけどね)。 3.個別コマンド ●3-01. %1 = X の場合 (eXecute) %2 のファイルを拡張子の標準の関連づけで処理 %3 = 'Max' の場合 アプリケーションは最大化される %3 = 'Min' の場合 アプリケーションは最小化される このアプレットを作り始めた発端のコマンド。 Ver.1.0 の時は「Open」を使っていたが、Ver.1.1 からは標準の 関連づけを使うように改善しました。 叉、NT 系でアドミニストレーター権限を持っていないユーザー が利用しようとしても Windows がレジストリの読み出しを拒絶 していたので、これも修正しました。 X コマンド (eXecute) で呼び出されたソフト(パラメーターと して渡したファイルではなく、そのファイルを開いたソフト)が 終了しない限り、「$Finish.Txt」は生成されません。 これを無限ループで監視して疑似的に「同期実行」できるように してあるのは上述の通り(「$Finish.Txt」を無視すれば非同期 実行になるのはご想像の通り)。 ●3-02. %1 = A の場合 (Attribute) %2 のファイルの属性変更 %3 = '+' の場合 ReadOnly 属性を設定 %3 = '-' の場合 ReadOnly, Hidden, System 属性を解除 %3 がない場合 %3 = '-' に同じ %2 はフォルダ名も可。ワイルドカード( * のみ (^^;; )も可。 ●3-03. %1 = C の場合 (Copy) %2 のファイルを %3 にコピーする(アニメーション付き) 単なるファイルコピーでなくアニメーション(経過表示)付きの コピーです。 オーバーヘッドがかなり大きいので、 HD から HD へのコピーの 場合はファイルサイズが 5 〜 6 M bytes はなければ、アニメー ションが始まる前にファイルコピーは終わってしまう。 (^^;; FD や MO , CD-ROM 等のリムーバブルメディアが絡むときは効果 を感じられるか。 キャッシュに入ってしまえば 10 M bytes も一瞬だけど。 (^^;; なお、 %2 はフォルダ名も可( %2 は最後が \ で終わる文字列 だとエラーになります)。 ●3-04. %1 = M の場合 (Move) %2 のファイルを %3 に移動する(アニメーション付き) 単なるファイル移動でなくアニメーション(経過表示)付きの 移動です(以下、C コマンド (Copy) に同じ)。 ●3-05. %1 = D の場合 (Delete) %2 のファイルを削除する(ごみ箱へ移動する) 単なる削除でなく、ごみ箱を利用したファイル削除なので、後々 に復活ができる余地があるということです。 もちろん、リムーバブルメディアはごみ箱による保護の対象外で あることをお忘れなく。 このコマンドも %2 はフォルダ名可。 ●3-06. %1 = E の場合 (Empty) ごみ箱を空にする データベースシステムからこんな機能を使う必然性は感じないが、 上3つのついでに勢いで実装しています。 (^^) ●3-07. %1 = F の場合 (Format) %2 のドライブのフォーマットダイアローグを出す %2 は : (コロン)で終わっても終わらなくてもよい。 このアプレットを呼び出してから対象ドライブを選択させるわけ にはいかないので、事前にデータベースシステムのマクロ側で、 フォーマットするドライブを選択させて下さい。 なお、 NT 4.0 での MO ハンドリングは大変辛いものがあります。 これは OS の制限ですので、このアプレットで回避できる性質の ものではありません。 詳しくは http://www.gavo.t.u-tokyo.ac.jp/~nishi/nt/mosys/ ●3-08. %1 = V の場合 (Volumelabel) %2 のドライブのボリュームラベルを %3 の文字列にする %2 は : (コロン)で終わっても終わらなくてもよい。 当該ドライブのルートに「Vol.Txt」というテキストファイルも 同時出力します。 %3 が空白(未定義,ヌル)なら、ボリュームラベルは消えます。 なお、ボリュームラベルとして使えるのは半角11文字以下です。 半角11文字を超える場合、強制的に半角11文字文にブッちぎって いますが、ちょうど11文字目が12文字目と合わせて1文字の全角 文字だった場合、ボリュームラベルの設定に失敗します。 ●3-09. %1 = L の場合 (List) %2 のフォルダにあるファイルリストを %3 のフォルダに書き出す %3 がない場合 %3 は %2 に同じ ファイルリストは「FileList.Txt」という名前で、ファイル名と 各ファイルのサイズを書き出します。 %2 は最後が \ で終わっても終わらなくてもよい。 ●3-10. %1 = R の場合 (Rest) %2 のドライブの全容量・残容量をルートに書き出す %2 は : (コロン)で終わっても終わらなくてもよい。 ドライブの全容量は xxxxxxxx.Size という名前で書き出され、 その xxxxxxxx は K byte 単位の数字である。 ドライブの全容量は xxxxxxxx.Free という名前で書き出され、 その xxxxxxxx は K byte 単位の数字である。 アクセスでは、こんな基礎的なデータを Get しようとしても 迷宮へ迷い込んでしまう。 (T_T) 拡張子 .Size と 拡張子 .Free のファイルをルートで探す―― あゝ自己嫌悪。 ●3-11. %1 = P の場合 (Password) パスワード入力用のダイアローグを出す どうして桐もアクセスもパスワード入力用の文字列マスクが できないんでしょうねぇ? 「$Result.Txt」に入力した「アカウント」と「パスワード」 が書き出されます。 両データは、夫々 "(半角ダブルクォーティション)で囲まれ、 両者の区切りは半角コンマです。 このデータを読み込んだら、直後にファイル削除して下さいね。 ●3-12. %1 = S の場合 (Selectfile) ファイル名入力用のダイアローグを出す %2 は選択肢となるファイルの種類 %3 は初期フォルダ アクセス97ではファイル名入力用の参照ダイアローグさえもが 標準では使えないときたもんだ。 更に、どの参考書でも VB5 の Control Creation Edition ( OCX 開発用に MS が無償配布している VisualBasic の機能 限定版)の OCX を組み込むべしと書いてあるが、この OCX が 誠にくせ者で、同名異バージョンの OCX が出現したおかげで、 互換性を期待できなくなってしまった。 「互換性がスポイルされた」場合、通常ならその OCX 機能のみ が使えなくなると考えるところだが、アクセス97では、データ ベースシステム全体が使用不能になってしまうという体たらく。 過去の例を考えてみても、MSの OCX の互換性なぞ期待できん。 業務に使うなら(MS製の)OCX に頼る必要を極力減らすべき。 で、こんな馬鹿げた機能まで追加したわけです。 ここで %2 はちょっと詳しく述べます。 例."テキスト(*.txt)|*.txt|データ(*.dat)|*.dat" %2 は全体を "(半角ダブルクォーティション)で囲みます。 次に、各データは |(半角パイプ)で区切ります。 そして2つで1組の意味を持ちます。 前側がファイルの説明で後ろ側が該当するファイル名です。 更に "テキスト(*.txt *.csv)|*.txt;*.csv" のように該当する ファイル名を ;(半角セミコロン)でつなげば、両方が選択肢と して画面表示されます。 %2を省略すると "全てのファイル(*.*)|*.*" が選択対象となり ます。 ただし %3 でデフォルトフォルダを指定したい場合には %2 を 省略することはできません。 なお、「$Result.Txt」には選択したファイル名が "(半角ダブル クォーティション)で囲まれることなく、そのまま入っています。 蛇足ですが、ファイルを選択するダイアローグって、ハイレゾの 画面で中央に小さく出ると腹が立ちますよね。 Win 98 以降、アプリ側で対応している場合、このダイアローグ はサイズ可変なのですが、Win 95 でもアプリ側不対応でもこの ダイアローグサイズ巨大化を可能とする常駐ソフトがあります。 http://www.vector.co.jp/soft/win95/util/se089008.html http://user1.allnet.ne.jp/shimizu/Dialogpp.html ●最後に この「各種機能詰め合わせアプレット」は Ogo の著作物です。 Ogo は これのバグ訂正やバージョンアップの義務を一切負いません。 ユーザーサポートの義務も負いません。 このアプレットを使った結果、生じた損害に関しては Ogo は一切関知 しません。ご自分の責任とリスクにおいてお使い下さい。 このアプレットを使った結果、生じた喜びや感謝や感想は、動作環境と 共に Ogo に伝えてもらえれば、Ogo は大喜びするでしょう。(^_^) このアプレットを、自分のシステムに組み込んだりするなどの応用は どうぞ好き勝手にして下さい(商業用途のデータベースシステムでも OKです)。 私には連絡の必要は一切ありません。 もちろん、データベースシステムの一部としての配布も自由です。 貴作のデータベースシステムに組み込んで一緒に配布する場合でも、 私の著作によるアプレットである旨を表示する必要はありません。 もちろん、私の名前を明記して下さっても結構です。 貴作のデータベースシステムに組み込むわけではなく、このアプレット 単体を配布するなら、この説明書も添付して下さい。 不特定多数の方への配布でなければ、再譲渡は自由です。 物好きにも転載等をしたい人がいれば、事前に Ogo まで E-Mail でご 連絡下さい。 Ogo mailto:ogou@icity.or.jp URL=http://www.icity.or.jp/usr/ogou/ ------------------------------------------------------------------- 蛇足 これは「フリーソフトウェア」です。代金支払いの義務は全くありません。 ただしよっぽど気にいった方がいらしたら、寄付金をいただくのにやぶさか ではありません。 その際には下記まで送金下さい。領収証が必要なら送付も可です。 もちろん金額に要望なぞはありません。 郵便振り替え 口座番号: 01320-2-15048 加入者名: Office Ogo 蛇足2. 某社や某社のように、普及した頃合を見計らって、後になってライセンス を強制するような姿勢は人間の信義を踏みにじる最低の行為だと考えてい ます。 また、オンラインその他で「相互扶助」精神でフリーソフト(オープン・ ソースに限定せず)公開やボランティア行為を行なっている人々の精神を 貶めようようとしたり、その行為を妨害しようとしたりするMS社の行動 も顰蹙を買ってしかるべきだと考えています。 心当たりのある会社の関係者は、このアプレットを利用することを自発的 にご辞退下さい。