2011-01-30 47 views
3

Hey、 私のexeファイルと同じフォルダにあるDLLへのパスを取得しようとしています。方法は実行中の実行可能ファイルへのパスを取得するためにQueryFullProcessImageName()またはGetModuleFileName()のいずれかを使用し、代わりに必要なライブラリへのパスにするために文字列操作を使用するように思われます。SAFELY Windowsで実行可能な実行可能ファイルへのパス

残念ながら、これらの2つの機能のどちらも、必要なサイズバッファを事前に見つける方法を提供していません。私はnSizeパラメータのためにゼロを渡そうとしましたが、これは望みの効果がありません。

これを実行するベストプラクティス方法は何ですか?

+0

可能重複http://stackoverflow.com/questions/805814/how-can-i-calculate-the -complete-buffer-size-for-getmodulefilename) –

+0

私はそれを見ましたが、 'GetModuleFileName'以外のAPIを使用しています(' QueryFullProcessName'と 'GetProcessImageFileName'も試しました) –

+0

これらのAPIはすべてモジュールファイル名)は最終的に 'NtQueryInformationProcess'や' NtQuerySystemInformation'( 'SystemProcessIdInformation')を呼び出す必要があります。 Win32 APIが十分でない場合は、直接 'NtQueryInformationProcess'を呼び出してください。しかし、カーネルからユーザへのAPIがあなたのためにバッファを割り当てる方法はありません。 – wj32

答えて

3

実際には、Windows API MAX_PATHをバッファサイズとして使用できます。安全性を高めるために、おそらく1を追加します。

理論的には、では、Windowsのパスがはるかに大きくなる可能性があります。 MAX_PATHは270と似ていますが、NTFSファイルシステムでは約32767文字までのパスが可能です。しかし、その大きなサイズのためにはUnicodeとして扱われなければならず、重要なのは、Windowsエクスプローラはそのような大きなパスをサポートしていないため、実際には問題にはなりません。

実際には、このような大きなパスに遭遇し、明らかに削除することが不可能な場合は、Unicodeの名前付け(長いパスに使用する特殊な接頭辞があります)、または同等の短い名前(DOS 8.3名前)、および/または論理ドライブを定義してパスを短縮し、ディレクトリ/ファイルを削除することができます。

乾杯& HTH。、[私はGetModuleFileNameはのための完全なバッファサイズを計算するにはどうすればよい?](の

+0

Windowsエクスプローラが長いパスをサポートしていない場合、私の実行ファイルが270文字を超えるような可能性があります。 Thanks –

+0

'MAX_PATH'は260文字で定義されています。 1を追加する理由はありません。ここをクリックしてください:http://msdn.microsoft.com/en-us/library/aa365247.aspx –

+0

私はこれについて少し気をつけています - 私は遭遇し、パスで作業しましたMAX_PATHより長い私は完全なバックアップ/リストア/削除などを書いていることがよくあります。より長いパスを持つディレクトリ構造のためのもの。 –

0

GetModuleFilenameは、バッファにコピーされた文字数を返します。あなたのバッファのサイズよりも小さい場合、あなたは大丈夫です。バッファのサイズと等しい場合は、より大きなバッファを割り当てて、やり直してください。

+0

しかし、適切な長さが見つかるまで、これを繰り返しループして呼び出すことは、APIがそれがどれくらいの長さであるかを知っている必要があると考えると、非常に無駄に思えます...可能であれば、より良い方法を望んでいます –

+2

@KJ Tsanaktsidis: 。しかし、Windowsのエクスプローラがそれらをサポートしていないため、任意の大きなパス(愚かなもの)をサポートできるようにしたい場合、Jerryの「より大きなバッファ」では、以前のバッファサイズを倍増するなどの何らかの要因で増加させます。 –

+0

これは、事実上のメモリの上書きもチェックします。バッファーが小さすぎると、この時点までにメモリーはすでに上書きされています。これは間違いなく安全ではない –