////////////////////////////////////////////////////////////////////////////////
開発環境 : Visual C++ 6.0
動作環境 : Windows 98 Second Edition
MFC使用 MDIベース
////////////////////////////////////////////////////////////////////////////////
以前、ここの掲示板で、ファイルをドロッグアンドドロップで複数
起動させる方法を教えていただき、最近、やっとできるように
なったのですが、実行してみるとファイル名が
実際のファイル名と異なり、どうもファイルの
MS-DOSプロンプト名というのが表示されている
ようなというところまでわかりました。
実際のファイル名を表示させるにはどのようにすれば
いいのでしょうか。
どなたか、何か、ご存知であれば教えてください。
よろしくお願いします。
> 以前、ここの掲示板で、ファイルをドロッグアンドドロップで複数
> 起動させる方法を教えていただき、最近、やっとできるように
> なったのですが、実行してみるとファイル名が
> 実際のファイル名と異なり、どうもファイルの
> MS-DOSプロンプト名というのが表示されている
> ようなというところまでわかりました。
> 実際のファイル名を表示させるにはどのようにすれば
> いいのでしょうか。
ショートファイル名のコト…ですよね?
C:\Program FilesがC:\PROGRA~1のように。
ショートファイル名をロングファイル名にするには自分で処理する必要があります。
具体的には下記のような処理が必要です。
http://www.fides.dti.ne.jp/~tokai/vc/vcchips1.html#6
Win2000/98以降であれば、こんなのもあります。
http://msdn.microsoft.com/library/en-us/fileio/base/getlongpathname.asp
瀬戸ッぷさん、dairygoodsさん、いつもお世話になっています。
ロングファイルネームというのですね。以前、ここの掲示板でも
見かけたのですが、知りませんでした。
dairygoodsさんのGetLongPathName()を試してみようと
自分で作ったCMultiFileCommandLineInfoで
ParseParam()を次のようにオーバーライドしました。
void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
{
CCommandLineInfo::ParseParam(lpszParam, bFlag, bLast);
if (!bFlag)
{
LPTSTR longName;
DWORD ccb;
GetLongPathName(lpszParam,longName,ccb);
m_files.Add(longName);
}
}
まだ、完全に理解できてないので自信がないのですが、lpszParamに
ショートファイル名が入ってると思ったので、上のようにしてみましたが、
値が割り当てられていないローカルな変数 'ccb' に対して参照が行われました
値が割り当てられていないローカルな変数 longNameに対して参照が行われました
のエラーが出てしまいます。実際にやってみてもうまく行きません。
バッフャや文字列が苦手で、根本的な間違いをしてそうな気もしますが、
どなたか、何か、もう一つだけアドバイスをお願いします。
> LPTSTR longName;
> DWORD ccb;
>
> GetLongPathName(lpszParam,longName,ccb);
> 値が割り当てられていないローカルな変数 'ccb' に対して参照が行われました
> 値が割り当てられていないローカルな変数 longNameに対して参照が行われました
longNameはポインタ変数です。
ポインタを保持するための領域は確保しましたが「指し示す先」の実体がありません。
確保した領域に残っていた値をアアドレスとして使用することになりますが、
その場合の値は無効なアドレスを指しています。
ソレが2番目の「値が割り当てられていないローカルな変数 longName~」です。
ポインタを用意しただけでは操作対象となるメモリまでは用意されません。
1番目の「値が割り当てられていないローカルな変数 'ccb'~」も同様で、
領域を確保していますが、その中身は不定である。 ということです。
GetLongPathName()の第3引数には、第2引数で指定した領域の大きさを文字数で指定し
ます。
文字コードがUNICODEの場合があるために文字数で指定なのでしょう。
とりあえず…下記のようにすると動作すると思います。(MFC風ではないかも知れませんが)
char szLongPath[MAX_PATH];
GetLongPathName(lpszParam, szLongPath, MAX_PATH);
最初のchar~で、受け取るための領域を作ります。
ここではMAX_PATHのサイズの領域を用意しています。
(MAX_PATHには260くらいの値が設定されています。)
GetLongPathName()の第2引数に配列の先頭アドレスを渡して、
第3引数でその領域の文字数をMAX_PATH文字数分あるとして渡しています。
#ちなみにUNICODE版の場合、コレは正しくないです。
瀬戸っぷさん、助かりました。
> char szLongPath[MAX_PATH];
> GetLongPathName(lpszParam, szLongPath, MAX_PATH);
こうすればよかったのですね。確かに、MSDNには、2番目の引数は
受け取る値のポインタ、3番目の引数はその大きさ、という
ようなことが書いてあり、何かの値をlongNameに割り当てるのではとは
思っていたのですが、配列のように宣言すればよかったのですね。
私は、あまり文字列を使う仕事はせず、ほとんど使っても
CStringばかりに逃げていたので、このようにたまに文字列の
ことが出てくるとかなり苦しくなります。
ですが、今回は、瀬戸っぷさん、丁寧な説明、
ありがとうございました。無事、複数のファイルを
同時に起動するところまでできるようになりました。
ありがとうございました!
すみません、チェック忘れです!