ホームへ

gsgetfile.dll version 0.05β

Copyright(C) 2002-2003 Y.Nagamidori
実行ファイル
ソース

はじめに

本ソフトは,Y.Nagamidoriさんが作成されたものを,作者の許可を得て,公開するものです。
※現在開発が中止されているため,非サポートです。
問い合わせ等はなさらないようにしてください。
WindowsCE汎用ファイル選択ダイアログです。
などの理由から汎用的に使えるものを作成しました。
気に入った方は自由に使用し開発を行ってください。

概要

PocketPC標準の"ファイルを開く"ダイアログや"名前を付けて保存"のファイル選択ダイアログはMy Documents等の一部の限られたフォルダにのみアクセスできず不便です。
また、HPC標準のものもPC用Windowsのものより機能が限られており不満が残ります。
gsgetfile.dllはPocketPCでHPC同等以上のファイル選択ダイアログの提供と、HPCで標準のファイル選択ダイアログ以上の機能のダイアログを提供するDLL(ダイナミックリンクライブラリ)です。
PocketPC / HPC / ポポペ (HPCの横幅320pixel版) / Palm-sizePC(HPCの横幅240pixel版)によってダイアログが切り替わります。

動作環境、および必要なDLL

WindowsCE2.11日本語版以上のもの
プラットホームに依存しません。
ソースからビルドした場合はWindowsCE 2.0でも使用できると思います。

必要開発環境

embedded Visual C++ 3.0

動作確認

jornada720 / GENIOe550X / E-65で動作確認を行っています。

使用方法

includeフォルダのgsgetfile.hをインクルードし、libフォルダのgsgetfile.libをリンクして使用してください。
またLoadLibrary関数でdllをロードする場合は不要です。
対応するCPUのlibやdllが場合はソースから自分でビルドしてください。
libフォルダのgsgetlib.libはgsgetfile.dllが存在したらgsgetfile.dllを使用し、存在しない場合は、OS標準のものを呼び出す関数を実装したスタティックライブラリです。
includeフォルダのgsgetlib.hをインクルードしてお好みにより使用してください。

リファレンス

gsgetfile.dllにはOS標準のコモンダイアログと同等の関数が実装されています。
基本的にコモンダイアログのGetOpenFileNameとGetSaveFileNameと使用方法は同じです。

BOOL gsGetOpenFileName(OPENFILENAME* pofn)

機能:ファイル選択ダイアログ(開くダイアログ)を表示しファイル名を取得する。
引数:OPENFILENAME* pofn:情報構造体へのポインタ
戻り値:TRUE: 成功 / FALSE: 失敗
詳細:コモンダイアログのGetOpenFileName()と同等の動作をします。

BOOL gsGetSaveFileName(OPENFILENAME* pofn)

機能:ファイル選択ダイアログ(保存ダイアログ)を表示しファイル名を取得する。
引数:OPENFILENAME* pofn:情報構造体へのポインタ
戻り値:TRUE: 成功 / FALSE: 失敗
詳細:コモンダイアログのGetSaveFileName()と同等の動作をします。

情報構造体 OPENFILENAME

情報構造体 OPENFILENAMEは次のように定義されています。
右側は各値の注意事項です。
特に注意点のないものはサポートされているフィールドです。
typedef struct tagOFN {
  DWORDlStructSize;//構造体のサイズ:必ずsizeof(OPENFILENAME)をセットしてください。
HWNDhwndOwner;
HINSTANCEhInstance;//未サポート
LPCTSTRlpstrFilter;//複数の拡張子のサポート(※注1)
LPTSTRlpstrCustomFilter;//未サポート
DWORDnMaxCustFilter;//未サポート
DWORDnFilterIndex;
LPTSTRlpstrFile;
DWORDnMaxFile;
LPTSTRlpstrFileTitle;//(※注2)
DWORDnMaxFileTitle;
LPCTSTRlpstrInitialDir;
LPCTSTRlpstrTitle;
DWORDFlags;//下記のOPENFILENAMEの値Flagsのサポート状況を参照
WORDnFileOffset;//未サポート
WORDnFileExtension;//未サポート
LPCTSTRlpstrDefExt;
LPARAMlCustData;//未サポート
LPOFNHOOKPROClpfnHook;//未サポート
LPCTSTRlpTemplateName;//未サポート
} OPENFILENAME, *LPOPENFILENAME;
※注1: HPCでは"*.mp3;*mp2;*.mpa"のように拡張子をカンマ区切りで複数指定することができませんがgsgetfile.dllではこのカンマ区切りでの指定をサポートしています。(この機能が一番欲しかった。)
※注2: OFN_ALLOWMULTISELECTフラグでファイル名複数選択時は値が格納されません。PC用Windowsのダイアログと同等です。
各フィールドの詳しい情報はMSDNライブラリなどを参照してください。

OPENFILENAMEのFlagsのサポート状況

○以下のフラグはサポートされています。
OFN_ALLOWMULTISELECT
OFN_CREATEPROMPT
OFN_OVERWRITEPROMPT
OFN_PATHMUSTEXIST
OFN_FILEMUSTEXIST
○以下のフラグは未サポートです。
OFN_ENABLEHOOK
OFN_ENABLESIZING
OFN_ENABLETEMPLATE
OFN_ENABLETEMPLATEHANDLE
OFN_EXPLORER
OFN_HIDEREADONLY
OFN_LONGNAMES
OFN_NOCHANGEDIR
OFN_NODEREFERENCELINKS
OFN_NOLONGNAMES
OFN_NONETWORKBUTTON
OFN_NOREADONLYRETURN
OFN_NOTESTFILECREATE
OFN_NOVALIDATE
OFN_PROJECT
OFN_PROPERTY
OFN_READONLY
OFN_SHAREAWARE
OFN_SHOWHELP
○以下のフラグは現状では未サポートですが必要ならば将来的にサポートするかもしれません。
OFN_EXTENSIONDIFFERENT
各フラグの詳しい情報はMSDNライブラリなどを参照してください。

制限事項

○OFN_ALLOWMULTISELECTについて
複数ファイルの選択です。サポートされています。GetOpenFileNameでのみ有効です。
単一のファイル選択時はOPENFILENAME構造体のlpstrFileにフルパス名が格納されますが、
複数選択時には
<パス>NULL<ファイル名1>NULL<ファイル名2>NULL<ファイル名3>...
のように格納されます。
PC用WindowsのGetOpenFileNameと同等の動作です。
○HPCでの動作制限
HPCにはデスクトップが存在しOS標準のものではデスクトップにアクセス可能ですが
gsgetfile.dllではアクセスできません。
○動作確認を行っていないデバイスでの動作
フォルダのアイコンなどがただしく表示されない場合があります。
表示されないデバイスがありましたら作者に報告してください。サポートを行うかもしれません。
○エラー情報の取得
GetOpenFileName()/GetSaveFileName()が失敗した場合、CommDlgExtendedError()でエラー情報が
取得できますが、gsgetfile.dllでは取得できません。

dll本体の使用条件

gsgetfile.dllはフリーソフトです。dll本体の再配布/転載など自由に行ってください。制限はありません。

ソースコードの使用条件

ソースに関しては使用条件があります。
それは
です。
あとはどのように利用されてもかまいません。
商用利用、改変版の配布、ソフトへの組み込みなどなどお好きなように使用してください。
この程度のもので儲けようとも思いませんし。
とはいえ、名前を変えてソースにちょっとだけ改良加えた奴を別の名前つけてシェアウェアにする
といった情けない行為はあまりしない方がいいと思いますけど(xx mascot騒動もあったし)

サンプルコード

○gsgetfile.dllが存在する場合はgsgetfile.dllを使用し
存在しない場合はOS標準のよびを呼び出す関数のこーど (gsgetlib.libから抜粋)
BOOL GetOpenFileNameEx(OPENFILENAME* pofn)
{
HINSTANCE hInst = LoadLibrary(_T("gsgetfile.dll"));
if (hInst) {
BOOL (*gsGetOpenFileName)(OPENFILENAME* pofn);
(FARPROC&)gsGetOpenFileName = GetProcAddress(hInst, _T("gsGetOpenFileName"));
if (gsGetOpenFileName) {
BOOL ret = gsGetOpenFileName(pofn);
FreeLibrary(hInst);
return ret;
}
FreeLibrary(hInst);
}
return GetOpenFileName(pofn);
}
○通常の"ファイルを開く"ダイアログを表示するコード
void OnFileOpen()
{
WCHAR szFile[MAX_PATH] = L"\0";
OPENFILENAME ofn;
memset(&(ofn), 0, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = m_hWnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = L"MP3ファイルを開く...";
ofn.lpstrFilter = L"使用可能なファイル\0*.mp3;*.rmp;*.mp2;*.mpa\0MP3ファイル (*.MP3)\0*.mp3\0RMPファイル (*.RMP)\0*.rmp\0Layer-2 (*.mp2)\0*.mp2\0Layer-1 (*.mpa)\0*.mpa\0すべてのファイル (*.*)\0*.*\0\0";
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
ofn.lpstrInitialDir = m_szInitDir;
if (GetOpenFileName(&ofn) == IDOK)
{
// 成功した場合の処理
}
}

参考資料

○HPC標準のファイル選択ダイアログとの違い
○PocketPC標準のファイル選択ダイアログとの違い

更新履歴

0.00β初版作成
0.01βファイルの単一選択時に拡張子がある場合、正しく動作しなかったため修正
PocketPCで複数選択時の動作変更
0.02β横幅320pixel対応
テキストボックスにフィルタを打ち込んだときの動作修正
フォルダのショートカットが2重に表示されるバグFix
0.03βファイルをリストから選択しない場合、拡張子がつかないバグをFix
フォルダが2つ表示される場合があったため修正
拡張子をつけない場合メモリ破壊していたため修正
0.04β複数選択可能時すべて選択ボタン追加(PocketPC)
キーボードショートカット(Ctrl+A)対応(HPC)
0.05β複数選択時のテキストボックスへの文字列追加削除処理の変更
CEF版の削除

ホームへ
更新日:2004-12-26 QVE00513@nifty.com