コモンダイアログでファイル選択する 2017-01-20 (Fri) 00:07

sfc-mini経由でcomdlg32.dllのGetOpenFileNameを呼び出してファイルを選択する関数を作成。

初期フォルダ指定、フィルタ、複数選択に対応する。

Jscriptで文字列にnullが入っていると上手くないので、lpstrFile、lpstrFilterのデリミタはそれぞれ '\n'、'\t'に変更。

function fileSelect(initdir, filter, multi){
var MAX_PATH = 512;
var OFN_HIDEREADONLY = 0x00000004;
var OFN_ALLOWMULTISELECT = 0x00000200;
var OFN_EXPLORER = 0x00080000;
var defaultFilter = '全てのファイル\t*.*\t\t';

var api = new ActiveXObject('SfcMini.DynaCall');
var GetOpenFileName = new ActiveXObject('SfcMini.DynaCall');
var OpenFile = new ActiveXObject('SfcMini.Structure');
var lpstrFileBuf = new ActiveXObject('SfcMini.Structure');
var lpstrFilterBuf = new ActiveXObject('SfcMini.Structure');

lpstrFileBuf('str', 'String*' + MAX_PATH);
lpstrFilterBuf('str', 'String*' + MAX_PATH);
api.LoadLibraries('comdlg32', 'msvcrt');

function replaceChar(ptr, from, to){
for(var a = api.memchr(ptr, from.charCodeAt(0), MAX_PATH); a;){
api.memcpy(a, to, 1);
a = api.memchr(ptr, from.charCodeAt(0), MAX_PATH);
}
}
OpenFile(
'lStructSize', 'Long',
'hwndOwner', 'Long',
'hInstance', 'Long',
'lpstrFilter', 'Long',
'lpstrCustomFilter','String',
'nMaxCustFilter', 'Long',
'nFilterIndex', 'Long',
'lpstrFile', 'Long',
'nMaxFile', 'Long',
'lpstrFileTitle', 'String',
'nMaxFileTitle', 'Long',
'lpstrInitialDir', 'String',
'lpstrTitle', 'String',
'flags', 'Long',
'nFileOffset', 'Integer',
'nFileExtension', 'Integer',
'lpstrDefExt', 'String',
'lCustData', 'Long',
'lpfnHook', 'Long',
'lpTemplateName', 'String'
);

lpstrFilterBuf.str = filter ? filter : defaultFilter;
replaceChar(lpstrFilterBuf, '\t', '\0');

OpenFile.lStructSize = 76;
OpenFile.lpstrFilter = lpstrFilterBuf;
OpenFile.nFilterIndex = 1;
OpenFile.nMaxFile = MAX_PATH;
OpenFile.lpstrTitle = 'ファイルを開く' + (multi ? ' (複数選択可)' : '');
OpenFile.flags = OFN_HIDEREADONLY | (multi ? OFN_ALLOWMULTISELECT | OFN_EXPLORER : 0);
OpenFile.lpstrInitialDir = initdir.replace(/\//g, '\\');
OpenFile.lpstrFile = lpstrFileBuf;

if(api.GetOpenFileName(OpenFile)){
replaceChar(lpstrFileBuf, '\0', '\n');
return lpstrFileBuf.str.replace(/\n{2,}/,'');
}
else{
return null;
}
}

var filter = 'テキストファイル\t*.txt;*.dat\t実行ファイル\t*.exe\t\t';
WScript.Echo(fileSelect('c:/work/data', filter, true));
関連記事

コメントの投稿

管理者にだけ表示を許可する

注意事項
基本的にこのブログはブログ主の備忘録です。

ブログの内容にはブログ主の主観や時には正確でない情報が含まれていることもあります。書いてある内容がすべての環境にあてはまることを保証するものでもありません。

また、過去の記事は現時点で既に陳腐化していることもあります。

その辺をご理解の上で当ブログ内に書いてあることを試す場合は自己責任でお願いします。

記事内容の誤りの指摘、疑問点の回答などコメント頂けると助かります。
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
ブログ内検索
カラーコードチェッカ
カラーコードの確認
入力例) #ffffff | blue
カテゴリ
最新記事
最新コメント
最新トラックバック
リンク
ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文: