Small Basicで作ったプログラムを配布


*この話はある程度パソコンの知識がないとわかりにくいかもしれません。

Small Basicで作ったプログラムは、Small Basicをインストールしていないパソコンでも動かすことができます。
その方法についてここで少し紹介しておきます。

プログラムを作成して保存し、Small Basicを終了して、保存したディレクトリを開きます。
保存したときのファイル名を、例えば「test01」とすると、

test01.sb
test01.exe
test01.pdb

こんな感じのファイルができていると思います。
この中の、「test01.exe」と、同じディレクトリにある、「SmallBasicLibrary.dll」というファイルのふたつを、コピーして他のディレクトリに貼り付けしてみてください。
その後に、「test01.exe」をダブルクリックして起動すると……なんとSmall Basicを起動していないのに、「test01.exe」のプログラムが動くのです。
つまり、Small Basicでプログラムを作った場合、保存で作られた「○○○.exe」というファイルと、「SmallBasicLibrary.dll」を同じディレクトリに置いて「○○○.exe」を起動すれば良いのです。

※ただし、exeファイルを起動する時は、セキュリティソフトが警告を出したり、スキャンをしたりするかもしれません。今時のセキュリティソフトは、見知らぬexeファイルに対して非常に警戒心が強いからです。もし自分が作成したプログラムを他の方に配りたいというのなら、配布前に自分でセキュリティソフトでチェックして危険性がないことを確認し、更に配る前にこの点について説明をするようにしましょう。

それと、「Microsoft .NET Framework」というものが必要になります。
Microsoft .NET Framework(マイクロソフト ドットネット フレームワーク)とは、マイクロソフトが開発したアプリケーション開発・実行環境のことです。
バージョンが色々とありますが、Small Basicの公式サイトには、「.NET Framework 4.5」が必要だと書いてありますね。

Download Microsoft .NET Framework 4.5 from Official Microsoft Download Center

ここからダウンロードできます。
ちなみに、Small Basicをインストールしてある環境には「.NET Framework 4.5」もインストールされています。

さて、上の方法で他の方にもプログラムを動かしてもらうことはできるのですが、プログラム中に、画像ファイルを表示する記述を入れている場合には注意が必要です。
画像ファイルを表示する、

GraphicsWindow.DrawImage(imageName, x, y)

このオブジェクトを使う場合、「imageName」にはパソコン上の完全パスかインターネット上のURLが必要ですね。
パソコン上のファイルの場合……例えば、画像ファイルが、

D:\picture\Flower1.jpg

というファイルであったら、

GraphicsWindow.DrawImage("D:\picture\Flower1.jpg", x, y)

こう記述する必要があります。
自分のパソコンのみでこのプログラムを実行するのならこれで構いません。
ですが、他の人のパソコンで動かす場合は困りますね。
他の人のパソコンでは、ファイルの構成が異なります。
D:\picture\Flower1.jpgを別途用意するのは大変です。そもそも他の人のパソコンにDドライブがなかったらそこで終了ですし。

なので、これを解決するには、インターネット上にファイルを置いて、

GraphicsWindow.DrawImage("http://??????/Flower1.jpg", x, y)

と書けばOKなのですが……。
インターネット環境が必要であること、ファイルのダウンロードに時間がかかるとプログラムの実行に遅延が起こる、という問題があります。
それに、プログラムを作る側はファイルを置くためのサービスを用意しなければなりません。

では、

test01.exe
SmallBasicLibrary.dll
Flower1.jpg

を、丸ごと他の人に渡した上で、Flower1.jpgを表示させるプログラムを作る方法はないか?
しかも他の人は、このプログラムをどのディレクトリに置くかわからないので、「D:\picture\Flower1.jpg」と完全パスを指定することはできません。

ここからは、「誰がどのディレクトリに画像ファイルを置いても、プログラムで画像ファイルを表示する方法」を説明します。

ここでは、

File.GetSettingsFilePath()

を使います。説明を見ると
「このプログラムの設定ファイルの完全パスを取得します。」
と書いてあります。

GraphicsWindow.FontName = "MS Pゴシック"
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "black"
path = File.GetSettingsFilePath()
GraphicsWindow.DrawText(1, 1, path)

とプログラムを書いて、「test01」という名前で保存してみてください。
そして実行すると、

D:\hozon\test01.settings

こんな文字列が表示されます。
「D:\hozon\」の部分は、保存したディレクトリになります。
それ以下は「test01.settings」になっているはずです。
そして、
test01.exe
SmallBasicLibrary.dll
を他のディレクトリに移動して実行すると、

D:\pic\test01.settings

など、移動先のディレクトリがtest01.settingsの前に表示されるはずです。
つまり、File.GetSettingsFilePath()を上手く使えば、「プログラムを実行しているディレクトリ」が取得できるのです。
とはいえ、「test01.settings」という余計な文字列を取り除かないとディレクトリ名は取得できないので……

File.GetSettingsFilePath()で設定ファイルの完全パスを取得
Text.GetLength()で、完全パスの文字数を取得
・「test01.settings」は15文字なので、Text.GetLength()から15を引けば、ディレクトリの文字数になる
Text.GetSubText(Text, start, length)で、「文字列Textから、startで指示された位置から開始して、length分の文字数の文字列を取得」できるので、
ディレクトリの文字列を取得できる。

……文章で書くと意味不明な感じですので、プログラムで書きます。

GraphicsWindow.FontName = "MS Pゴシック"
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "black"
path = File.GetSettingsFilePath() '設定ファイルの完全パス「path」を取得
mojikazu = Text.GetLength(path) - 15 '完全パスの文字数から、「test01.settings」分の15文字を引いた数をmojikazuとする
nowdirectory = Text.GetSubText(path, 1, mojikazu) '文字列「path」の、1文字目からmojikazu文字目までを取得
GraphicsWindow.DrawText(1, 1, nowdirectory)

これを実行すると

D:\hozon\

と、表示されます。
同じディレクトリ(D:\hozon\)に「Flower1.jpg」を置いて、

gazou = Text.Append(nowdirectory, "Flower1.jpg")

Text.Appendを使うと、ふたつの文字列を繋げることができます。
これで、
D:\hozon\Flower1.jpg
という文字列が完成しました。

GraphicsWindow.DrawImage(gazou, 1, 50)

これで、Flower1.jpgの画像が表示できます。

GraphicsWindow.FontName = "MS Pゴシック"
GraphicsWindow.FontSize = 16
GraphicsWindow.BrushColor = "black"
path = File.GetSettingsFilePath() '設定ファイルの完全パス「path」を取得
mojikazu = Text.GetLength(path) - 15 '完全パスの文字数から、「test01.settings」分の15文字を引いた数をmojikazuとする
nowdirectory = Text.GetSubText(path, 1, mojikazu) '文字列「path」の、1文字目からmojikazu文字目までを取得
GraphicsWindow.DrawText(1, 1, nowdirectory)
gazou = Text.Append(nowdirectory, "Flower1.jpg")
GraphicsWindow.DrawImage(gazou, 1, 50)

このプログラムを保存し、

test01.exe
SmallBasicLibrary.dll
Flower1.jpg

この3つをまとめて他のディレクトリに移動してtest01.exeを実行すると、どのディレクトリでもFlower1.jpgを表示できるはずです。

以上の方法を使えば、どのディレクトリ、どのパソコンでも画像ファイルを表示できるようになりますが、注意事項として、
・実行ファイル「test01.exe」や画像ファイル「Flower1.jpg」の名前を変更しない
・実行ファイル「test01.exe」や画像ファイル「Flower1.jpg」の存在するディレクトリ構造を変更しない
ということを伝えておく必要があります。
(そんなことをする物好きな人はそんなにいないとは思いますが……w)

なお、画像ファイル以外に、Small Basicでは
Sound.PlayAndWait(FilePath)
で音楽ファイルを再生することができますが、この時にもFilePathは完全パスが必要なので、上と同じ方法を使って「どのディレクトリでも音楽ファイルを再生する」ことができるはずです。

「自分のパソコン以外で、Small Basicで作ったプログラムを動かす」場合に必要なものをまとめます。
OSはWindowsでないと動かないと思います……。

・作成し、保存したファイルのうち、「exe」が付いているファイル
・「SmallBasicLibrary.dll」
・「.NET Framework 4.5」をインストールしている環境
・プログラム内にて、画像ファイルや音楽ファイルなどを使っている場合は、このページに記載した方法で別途用意する



▲TOPへ戻る