2012年6月30日土曜日

日記ちゃんGetProcessImageFileName


 生産がす: 日記ちゃんバグの問題を無事解決。
いままでの方法でパスの取得がうまくいかなかったら新しい方法でパスを取得する。

 Obtaining a File Name From a File Handle (Windows)
を参考にした。



 GetLogicalDriveStrings()で
{"A:\",0,"C:\",0,0}
といったNULLで区切られたドライブ名一覧を得られる。

 QueryDosDevice()は
A:C:といったドライブ名から
\Device\Floppy0\Device\HarddiskVolume1といったデバイス名を取得できる。

 GetLogicalDriveStrings()で得たドライブ名から'\'を削った文字列を、
つまりC:\C:にして、
QueryDosDevice()に渡してデバイス名を得られる。

 GetProcessImageFileName()を使うと
\Device\HarddiskVolume1\sumishiro\(省略)\test.exe
といった文字列を取得できる。

 ので、さっき取得したデバイス名をGetProcessImageFileName()で得た文字列と比較して
一致するようなら元のドライブ名で置換すれば
C:\sumishiro\(省略)\test.exeといった文字に変換できる。
という流れ。

\Device\HarddiskVolume1\sumishiro\(省略)\test.exe
\Device\HarddiskVolume1の部分を
C:に置換する。



 std::stringが使えるのならもっと手軽にできそう。
実行ファイルがでかくなるから使わなかったが。

0 件のコメント: