エクスプローラからアイコンにドラッグした時パラメータを取得すると全て大文字になるのはどうしてですか?
どうやって防げますか?
ご教授おねがいします
たしか NT や 9x系ですよね? Windows の仕様です。
2K/XP ではロングファイル名+大小区別されて入りますよね。
98 以降は GetLongPathName API が使えたと思います。
それ以前はルートパスから FindFirst で検索して自分で組み立てる
必要があったような...
たぶん "ショートファイル名" で検索すれば変換処理はいっぱい
見つかると思います。
jamさんありがとうございました。
「GetLongPathName」で解決できました。
調べたのですが、「GetLongPathName」のユニットが分かりません。
>「GetLongPathName」で解決できました。
>調べたのですが、「GetLongPathName」のユニットが分かりません。
矛盾していませんか?
>調べたのですが、「GetLongPathName」のユニットが分かりません。
D7以降はよく知らないけど、多分どのユニットにも定義されていないので、
自前で定義しましょう。
>「GetLongPathName」で解決できました。
「GetLongPathName」を調べるということが分かりました
と言う意味でした(汗)
>自前で定義しましょう。
定義されていないAPIはどのようにして定義するのでしょうか?
>定義する
というのは、FindFirst等を使っている例がありますが、それのことですか?
もしそうなら
>98 以降は GetLongPathName API が使えたと思います。
というのはどういうことですか?
http://forum.nifty.com/fdelphi/faq/00073.htm
こちらの方法にしました
皆様ありがとうございました。
ご自分の環境は書いてないし,解決の文章を読んでも,何をやりたかった
のか,いまいち理解ができないのですが.
そんなこととは関係なしに,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.
先ほどの参照は間違っていました(汗)
FindFirstで探す方法でした
>function GetLongPathNameA(ShortPathName: PChar; LongPathName: PChar;cchBuffer: Integer): Integer; stdcall; external 'kernel32.dll';
なるほど。DLLから取り込むわけですね
試してみます
function xxx(SP:String): String;
begin
SetLength(Result, MAX_PATH);
SetLength(Result, GetLongPathNameA(pchar(SP), pchar(Result),MAX_PATH));
end;
ありがとうございました
ツイート | ![]() |