ダブルクリック可能なJavaアプリケーションを普通に作成すると左側のようなアイコンになる. これをWinの開発環境を使用して右側のようなアプリケーションから実行することができる. ここでは私が行った方法を解説する.
jarファイルのアイコンを個々に設定することはできない. ショートカットを作成してやればアイコンを変更することはできるが, オリジナルファイルは絶対パスで参照しているためショートカットを配布することはできない. インストーラーを作成すればよいのだが,インストーラーはあまり作りたくない. そこでjarファイルを起動するexeファイルを作ってみた.
以下のプログラムを作成し,アイコンを付けてビルドする.
// JavaLaunch.cpp : xxx.jar ファイルを exe から起動する
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <process.h>
#include <errno.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
int iRet;
char path[MAX_PATH];
char fileName[_MAX_FNAME];
char command[MAX_PATH];
char *args[4];
// xxx.exe から xxx.jar を作る
iRet = GetModuleFileName(NULL, path, sizeof(path));
_splitpath(path, NULL, NULL, fileName, NULL);
strcpy(command, fileName);
strcat(command, ".jar");
// 新しい子プロセスを生成してJAVA を実行する
args[0] = "javaw.exe";
args[1] = "-jar";
args[2] = command;
args[3] = NULL;
// 子プロセスと並行して親プロセスを実行する
iRet = _spawnvp(_P_NOWAIT, "javaw.exe", args);
// メッセージボックスに文字列を表示します。
if(iRet == -1) {
char *message;
if(errno == ENOENT) {
message = "JAVA の実行環境がインストールされていないようです";
} else if(errno == ENOMEM) {
message = "メモリ不足です";
} else if(errno == E2BIG) {
message = "引数リストが 1024 バイトを超えてます";
} else {
message = "予期しないエラーが発生しました";
}
iRet = MessageBox(NULL, message, "エラー", MB_OK);
return 1;
}
//iRet = MessageBox(NULL, "起動に成功しました", "やったね", MB_OK);
// 正常終了を意味する戻り値を返します。
return 0;
}
このプログラムでやっていることは「 hogehoge.exe を実行すると javaw.exe -jar hogehoge.jar を実行する.」 ということである.注意点としては java でなく javaw を実行することである. java を実行するとDOS窓が開いてしまう.
ビルドで出来上がった JavaLaunch.exe を jar ファイルが存在する階層に複写する.
exe ファイルの名前を jar ファイルと同じ名前にする.
KitEType.exe をダブルクリックして KitEType.jar が実行できれば動作確認完了.
jar ファイル名が変わっても exe ファイルの名前を変更するだけでソースコードの変更は不要である. しかしアイコンを変更するためにはリソースファイルの変更が必要となる. ここを何とかしたかったが, 結局ここが何とかできればこのプログラムの存在価値がなくなるような気がする.
現在はこのソースにもう少し手を入れてあります.改善点は次の通りです.