2016-12-22 11 views
0

ファイルをPNGまたはJPGにして壁紙として適用するときを特定しようとしています。 SHGetFileInfoを使用して、タイプ名を.szTypeName変数に変更しましたが、OSが別の言語であれば変更されています。Windows APIを使用してファイルのファイルタイプを取得する

これは私のコードです:

if (wcscmp(fileInfo.szTypeName, L"JPG File") == 0) 
{ 

//Code here 

} 

をOSがスペイン語である場合には、「Archivo JPG」への値の変化を私がしなければならないので:

SHFILEINFOW fileInfo; 
UINT sizeFile = sizeof(fileInfo); 
UINT Flags = SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES; 

// Getting file info to find out if it has JPG or PNG format 
SHGetFileInfoW(argv[1], 0, &fileInfo, sizeFile, Flags); 

は、これは私が検証しています方法ですすべての言語に対して有効であり、意味をなさない。

他にどのような機能を使用できますか?

答えて

1

このAPIは、既知のファイルタイプ1)のユーザ向きの文字列表現を生成するために使用されます。これは、コードロジックを実装するために使用されるものではありません。

さらに重要なことに、ファイルのコンテンツを解析しようとしません。ファイル拡張子だけで動作します。 Excelワークブックの名前を変更した場合MySpreadsheet.xlsxMySpreadsheet.png、これは"PNGファイル"であることを喜んで報告します。

問題の解決方法は簡単です。ファイル拡張子のフィルタリング以外は何もする必要はありません。完全修飾パス名からファイル拡張子を取得するには、PathFindExtension(またはWindows 8以降ではPathCchFindExtension)を使用します。

ユーザーが間違ったファイル拡張子を追加した場合、これは失敗する可能性があります。おそらく、これはあなたのアプリケーションが修正すべきものではありません。


さておき、あなたは SHGetFileInfoWSHGFI_USEFILEATTRIBUTESを渡しますが、コールに file attributes(第二引数)を渡していないことを決めたとして。これはバグです。詳細は、 What does SHGFI_USEFILEATTRIBUTES mean?を参照してください。


1) SHGFI_DISPLAYNAMEの道徳的等価です。 The only thing you can do with display names is display them

+0

お返事ありがとうございます!それは私が必要だったすべてでした。私は 'PathFindExtension'(' PWSTR findExt = PathFindExtensionW(argv [1]) '関数を使い、' SHGetFileInfoW'コードをすべて削除しました。 –

関連する問題