Tempフォルダに~DF????.tmpファイルを作らないexeを作る


あなたは、自分のパソコンのTempフォルダの中に~DF????.tmpと言う名前のファイルを見かけたことはありませんか?
1個や2個ならまだ良いほうです、私のパソコンなんか二百数十個見つけたことがあります。^^;
このファイルが大量にTempフォルダの中に見つかった場合、あなたのパソコンはVBExeファイル依存症にかかっています。
(うそです(^^ゞ)

冗談はさておき、なぜこのようなファイルが残っているのでしょう。
下の図をご覧下さい。

図1

これは、VB5でプロジェクトを作成しフォームを1つ追加してコンパイルして出来たexeを実行してみた所です。
この様態では、Tempフォルダには何も作成されません。

では、次の図をご覧下さい。


図1のフォームにアイコンをセットして、コンパイルして出来たexeを実行してみた所です。
この様に、tmpファイルが現れました。
よく確かめたわけではありませんが、フォームにアイコンをセットしたVBのexeファイルは、このようなTmpファイルを作ります。

このexeファイルも終了すれば、作成したTmpファイルを削除してくれます。
ただし、これは正常終了した場合です。

exeファイルやWindowsが異常終了した場合は、必ず残ります。
まあこれは仕方がない(ホントは仕方なくはないんですけ)として、正常終了した場合でも残る事があるのです。
これはどんな場合なのでしょう。
それは、図2のファイルを実行したまま、Windowsを終了した場合に起きます。
「え、正常終了してるのに!」とお考えでしょうが事実です。

これはVBのバグなのかなと思っていたのですが、Microsoft社の方では直す気配すら無い様なので、これはVBの仕様でしょう。
現在、Windows98にはこのTmpファイルを削除してくれるソフトが標準でついています。(ディスククリーンアップと言う名前です)
Tmpファイルも非常にサイズが小さく(1KByte程度)、100個出来ようが200個出来ようがさしたる問題があるわけではありませんが、
でも、自分の作った作品がこのようなゴミをばらまくのは自分としては許せなかったのです。

そこで、色々な解決法を考えて見ました

解決法

  1. フォームにアイコンをセットしない。
    根本的な解決法になっていないような気がするのですが、これが1番良い方法だと思っています。
    この方法だとTmpファイルは作られないので、もう問題解決です。
    でも、別な問題が出てきます。
    VBの場合、exeファイルを作成する時にフォームからアイコンを選択して、exeのアイコンにしているので
    自分で作ったアイコンなどが使えないと言う事になります。

    そこで、ダミーのフォームを1つ追加してそこにアイコンをセットしておきます。
    プログラムの方からは、このフォームは使用しない様にしておきます。
    (ロードすると、Tmpファイルが作成されてしまいます)
    exeファイルを作る時このフォームをアイコンフォームとして選択してコンパイルすればOKと言うわけです。
  2. アイコンをリソースファイルに持っておく。
    1.の方法を使えばほとんど解決なのですが、やっぱりフォームにアイコンをセットしたい場合があります。
    その場合は、実行時にアイコンをセットする方法です。
    この場合も、Tmpファイルは作られません。
    でも実行時にicoファイルなどを読んでいたのでは、あまりいい方法ではないのでリソースファイルを使用します。
    まず、リソースファイルにセットするアイコンを用意しておきます。
    この時アイコンは、16×16のスモールアイコンを用意しておいてください。
    (VBの場合、32×32のアイコンを表示しようとするからです)
    そして、フォームをロードする時に、LoadResPicture関数を使用してフォームにアイコンをセットします。
    これで、フォームにアイコンがセットされ表示出来ます。

    さて、この方法にもちょっと問題点があります。
    それは、セットされたアイコンがちょっとゆがんで見えるのです。
    それほどではないのですが、アイコンによってはかなりゆがんでしまう場合があります。
    この原因は、VBがアイコンを表示するときに1度32×32の大きさにしてからもう一度16×16の大きさに直しているようなのです。
    これは、対策が考え付きませんでした。<m(__)m>
  3. 終了する時にエンディングを付ける。
    これは1.の方法も2.の方法もイヤだ、と言う方にお勧めです。
    通常どうり、フォームにアイコンをセットして使う方法ですが、フォームがアンロードされる時にエンディングを表示させる方法です。

    方法は、Form_QueryUnloadイベント内にエンディング画面をモーダルで呼び出します。
    エンディング画面の方では、大体1秒ぐらい何かを表示させて、直ぐにエンディング画面をアンロードします。
    エンディング画面から返ってきたら、そのままEndで終了してしまいます。
    これでTmpファイルは削除されています。

    これも、ちょっと問題があります。
    Windowsが異常終了した場合は、この方法は効きません。
以上が、私の考えた解決法です。

さて、私の御託に付き合っていただきましてありがとうございます。
この手法は、私がShutDown君を作成している時に考えた方法です。
ShutDown君は、Windowsを終了するソフトなので自分でWindowsを終了する時にゴミを残すのが気に入らなかったので考えてみました。
ShutDown君に限らず、Windowsを終了まで動いている常駐型のソフトはこの点に気を使った方がいいと思います。
別にそんなことは気にすることではないと思ったのですが、やっぱり気になってしまったのです。(^^ゞ

私のお勧めは、1.の解決法ですね。
これだとTmpファイルは作られないので安心できます。
3つ解決法を全部使ってますけど、フォームにアイコンセットしなくてもいいように、フォームのBorderStyleプロパティを変えてアイコンをセットしなくてもいいようにしてます。

この手法に使ったサンプルをダウンロードしたい方はこちら