スポンサーサイト

--/--/--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DLLImportの多言語化について

2013/09/26

DLLImportの多言語化について

ちょっとハマったのでメモ。

現在、C#のアプリを作成してましてフォルダ複数選択ダイアログを自作しました。

C#単体では「マイコンピュータ」のような特殊なフォルダ?とか、
フォルダのアイコンとか取得できないのでShellAPIを使うことになります。

で、作成できたものの、
フォルダ名に日本語にない文字がある場合、化けてしまったのでその対応をしました。
たとえば中国OSで上記問題が起こりました。

環境をまとめると
ベース:C#
多言語したい対象 : C++(DLLImportで使用)

この場合はsetlocaleとかCurrentInfoとかで設定できません。

前置きが長くなりましたが、解決策。

DLLImportに文字コードを設定できるプロパティ CharSet がありますのでこれを設定すればOK。

具体的にはこんな書き方です。

[DllImport("shell32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SHGetFileInfo(IntPtr pIDL, uint dwFileAttributes, out SHFILEINFO psfi, uint cbFileInfo, SHGFI uFlags);

CharSet.Autoは実行しているOSによって自動的に選択されるプロパティ。
ちなみに何も指定しない場合は、コンパイルした言語になるっぽいです。バグってた時だとAnsiかな。


あと注意するのはこの関数で使っている構造体などなども設定する必要があります。

上記の例だと「SHFILEINFO」ですね。

構造体の前に「StructLayout」で設定します。

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}

こんな感じ。


ShellAPIなんか滅多に使わないですけど、使わないからこそ情報も少ない、
よって詰むので一応。

コメントの投稿

非公開コメント

advertisement


プロフィール

hane

Author:hane
ゲーム好きなプログラマーやってます。

使用可能言語:C,C++,C#,WPF,JavaScript,Cuda
使用可能開発環境:VisualStudio2005-2013,Unity,CodeWarrior

リンクフリーです
相互リンクなどはこちら↓までかコメント欄にでもよろしくです。
skymail_tt@yahoo.co.jp

検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。