コマンドラインについて

解決


Q&  2004-09-28 19:48:10  No: 11183

エクスプローラからアイコンにドラッグした時パラメータを取得すると全て大文字になるのはどうしてですか?
どうやって防げますか?
ご教授おねがいします


jam  2004-09-29 05:53:50  No: 11184

たしか NT や 9x系ですよね? Windows の仕様です。
2K/XP ではロングファイル名+大小区別されて入りますよね。

98 以降は GetLongPathName API が使えたと思います。
それ以前はルートパスから FindFirst で検索して自分で組み立てる
必要があったような...

たぶん "ショートファイル名" で検索すれば変換処理はいっぱい
見つかると思います。


Q&  2004-09-29 06:19:26  No: 11185

jamさんありがとうございました。
「GetLongPathName」で解決できました。


Q&  2004-09-30 06:03:42  No: 11186

調べたのですが、「GetLongPathName」のユニットが分かりません。


通りがかり  2004-09-30 06:49:22  No: 11187

>「GetLongPathName」で解決できました。
>調べたのですが、「GetLongPathName」のユニットが分かりません。
矛盾していませんか?


自前一丁  2004-09-30 09:04:04  No: 11188

>調べたのですが、「GetLongPathName」のユニットが分かりません。
D7以降はよく知らないけど、多分どのユニットにも定義されていないので、
自前で定義しましょう。


Q&  2004-10-01 02:44:36  No: 11189

>「GetLongPathName」で解決できました。
「GetLongPathName」を調べるということが分かりました
と言う意味でした(汗)
>自前で定義しましょう。
定義されていないAPIはどのようにして定義するのでしょうか?


Q&  2004-10-01 03:36:28  No: 11190

>定義する
というのは、FindFirst等を使っている例がありますが、それのことですか?
もしそうなら
>98 以降は GetLongPathName API が使えたと思います。
というのはどういうことですか?


Q&  2004-10-01 03:50:24  No: 11191

http://forum.nifty.com/fdelphi/faq/00073.htm
こちらの方法にしました
皆様ありがとうございました。


Mr.XRAY  URL  2004-10-01 04:40:28  No: 11192

ご自分の環境は書いてないし,解決の文章を読んでも,何をやりたかった
のか,いまいち理解ができないのですが.

そんなこととは関係なしに,GetLongPathNameというのを知りませんでした.
で,やってみました.GetLongPathNameというのがないようなので,
かわりにGetLongPahtNameAでやってみました.

確かにWin98SEでパス名が大文字と小文字が区別されて取得できました.
知りませんでした.
実行ファイルの作成は,WindowsXP(SP1) + Delphi5 Pro(UP1)です.
新規作成プロジェクトにTButtonとTMemoを配置しています.

implementation

{$R *.DFM}

function GetLongPathNameA(ShortPathName: PChar; LongPathName: PChar;
         cchBuffer: Integer): Integer; stdcall; external 'kernel32.dll';

//====================================================================
//  GetLongPathNameとGetFullPathNameの違いテスト
//  GetLongPathNameはWin98でも大文字と小文字を区別して取得可能
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
    AFileName : String;
    Buffer    : array[0..256] of Char;
    Dummy     : PChar;
begin
     AFileName:=ParamStr(0);
     Memo1.Lines.Add(AFileName);
     if (GetLongPathNameA(PChar(AFileName),Buffer,SizeOf(Buffer)))<>0 then begin
       Memo1.Lines.Add('GetLong  '+ Buffer);
     end;
     if GetFullPathName(PChar(AFileName),SizeOf(Buffer),Buffer,Dummy)<>0 then begin
       Memo1.Lines.Add('GetFull  '+Buffer);
     end;
end;

end.


Q&  2004-10-01 05:51:17  No: 11193

先ほどの参照は間違っていました(汗)
FindFirstで探す方法でした
>function GetLongPathNameA(ShortPathName: PChar; LongPathName: PChar;cchBuffer: Integer): Integer; stdcall; external 'kernel32.dll';
なるほど。DLLから取り込むわけですね
試してみます


Q&  2004-10-01 05:57:31  No: 11194

function xxx(SP:String): String;
begin
  SetLength(Result, MAX_PATH);
  SetLength(Result, GetLongPathNameA(pchar(SP), pchar(Result),MAX_PATH));
end;

ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加