WWWCのShellOpenをFireFoxで使う

以下はFireBirdでローカルでの実験です。
moeweさん
http://moewe.xrea.jp/
掲示板を見てみたら、FireFoxでShellOpenがうまくいかないみたいなことが書かれていました。そんなに難しいのかな?ということで「FireFox ShellOpen」で検索してみたら、こんなものが見つかった。

91 名前:名無しさん@お腹いっぱい。 :04/02/15 03:12 id:NyXdGKDB
リンク切れしてるのに何もしないから諦めてFirebird用に自作したよ。
作者のshopenを拾ってきてURLを|で繋げてFirebirdに渡すようにした。
暫く使ってたけど今はM2Hを使ってるから使ってない。

M2Hはなんだか分からないけど、とりあえず「|」で繋げれば複数URLを渡せるかもしれなさそうなので、コマンドラインから実行してみた。

"http://..."|"http://..."

成功。ということでこういう風にShellOpenを改造すればよさそうということでやってみた。

__declspec(dllexport) int CALLBACK ShellOpen(HWND hWnd, struct TPITEM **ToolItemList,
int ToolItemListCnt, int type, int CheckType)
{
	struct TPITEM *tpItemInfo;
	OPENFILENAME of;
	char *buf;
	char *p, *r;
	int len = 0;
	int i;

	//プロパティ
	if(type == TOOL_EXEC_PORP){
		ZeroMemory(&of, sizeof(OPENFILENAME));
		of.lStructSize = sizeof(OPENFILENAME);
		of.hwndOwner = hWnd;
		of.lpstrTitle = "アプリケーションの選択";
		of.lpstrFilter = "*.*\0*.*\0\0";
		of.lpstrFile = ExeFilePath;
		of.nMaxFile = BUF_SIZE - 1;
		of.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

		if(GetOpenFileName((LPOPENFILENAME)&of) == TRUE){
			WritePrivateProfileString("APP", "path", ExeFilePath, ini_path);
		}
		return 1;
	}
	
	if(ToolItemListCnt <= 0 || ToolItemList == NULL){
		return 0;
	}

	if(*ExeFilePath == '\0'){
		if(MessageBox(hWnd, "起動するアプリケーションが設定されていません。\r\n"
			"OK を押すとアプリケーションを選択します。",
			"ShellOpen", MB_ICONEXCLAMATION | MB_OKCANCEL) == IDCANCEL){
			return 0;
		}
		ShellOpen(hWnd, NULL, -1, TOOL_EXEC_PORP, 0);
	}

	//サイズ取得
	for(i = 0; i < ToolItemListCnt; i++){
		tpItemInfo = *(ToolItemList + i);
		if(tpItemInfo == NULL){
			continue;
		}
		p = (tpItemInfo->ViewURL != NULL && *tpItemInfo->ViewURL != '\0') ? tpItemInfo->ViewURL : tpItemInfo->CheckURL;
		if(p == NULL || *p == '\0') continue;
		len++;
		len += lstrlen(p);
	}

	r = buf = (char *)LocalAlloc(LMEM_FIXED, len + 1);
	if(buf == NULL) return 0;

	//コマンドライン作成
	for(i = 0; i < ToolItemListCnt; i++){
		tpItemInfo = *(ToolItemList + i);
		if(tpItemInfo == NULL){
			continue;
		}
		p = (tpItemInfo->ViewURL != NULL && *tpItemInfo->ViewURL != '\0') ? tpItemInfo->ViewURL : tpItemInfo->CheckURL;
		if(p == NULL || *p == '\0') continue;
		*(r++) = '"';
		lstrcpy(r, p);
		r += lstrlen(p);
		*(r++) = '"';
		*(r++) = '|';
	}
	*(--r) = '\0';
	
	//Directoryは指定したほうが良い。
	ShellExecute(NULL, "open", ExeFilePath, buf, NULL, SW_SHOWNORMAL);
	LocalFree(buf);
	return 1;
}

FireBirdで成功。一応バイナリ
http://cres.s28.xrea.com/soft/bin/main.dll
FireFoxでの動作確認求む