C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: フォントフォルダを取得したい


(過去ログ 64 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■36867 / inTopicNo.1)  フォントフォルダを取得したい
  
□投稿者/ たっく (1回)-(2009/06/08(Mon) 13:45:25)

分類:[C#] 

2009/06/08(Mon) 13:48:47 編集(投稿者)
フォントフォルダを取得したくコードを書きましたがうまく取得できません。
GetFontFolderの戻り値が空文字で返ってきます。
何が間違っているのかどうかご教授願います。


    using System.Runtime.InteropServices;
    using System.Reflection;


        [DllImport("shell32.dll")]
        private static extern bool SHGetSpecialFolderPath(
            IntPtr hwndOwner,
            char[] lpszPath,
            int csidl,
            bool fCreate);

        const int CSIDL_FONTS = 0x0014;


        string GetFontFolder()
        {
            char[] c = new char[255]; 
            Module[] ms = Assembly.GetEntryAssembly().GetModules();
            IntPtr hInstance = Marshal.GetHINSTANCE(ms[0]);

            SHGetSpecialFolderPath(hInstance, c, CSIDL_FONTS, false);
            return new string(c);
        }

引用返信 編集キー/
■36871 / inTopicNo.2)  Re[1]: フォントフォルダを取得したい
□投稿者/ aetos (153回)-(2009/06/08(Mon) 14:05:44)
aetos さんの Web サイト
No36867 (たっく さん) に返信
> string GetFontFolder()
> {
> char[] c = new char[255];
> Module[] ms = Assembly.GetEntryAssembly().GetModules();
> IntPtr hInstance = Marshal.GetHINSTANCE(ms[0]);
>
> SHGetSpecialFolderPath(hInstance, c, CSIDL_FONTS, false);
> return new string(c);
> }

どうして第一引数に hInstance なんて渡そうと思ったんですか?
第一引数の型は hWnd ですし、予約されているので IntPtr.Zero で構いません。
http://msdn.microsoft.com/en-us/library/bb762204.aspx

また、第二引数は StringBuilder がいいんじゃないのかな。
引用返信 編集キー/
■36872 / inTopicNo.3)  Re[1]: フォントフォルダを取得したい
□投稿者/ 魔界の仮面弁士 (1129回)-(2009/06/08(Mon) 14:13:22)
2009/06/08(Mon) 14:28:00 編集(投稿者)

No36867 (たっく さん) に返信
> char[] lpszPath,
ではなく、
 StringBuilder lpszPath,
にしましょう。

> Module[] ms = Assembly.GetEntryAssembly().GetModules();
> IntPtr hInstance = Marshal.GetHINSTANCE(ms[0]);
> SHGetSpecialFolderPath(hInstance, c, CSIDL_FONTS, false);
第1引数に渡すべきは HWND であって、HINSTANCE では無いはず。
デスクトップの HWND 、もしくは Process.MainWindowHandle 、あるいは IntPtr.Zero でどうでしょう。


# 被った。
引用返信 編集キー/
■36873 / inTopicNo.4)  Re[1]: フォントフォルダを取得したい
□投稿者/ Hongliang (415回)-(2009/06/08(Mon) 14:15:04)
P/Invoke の定義内の仮引数に blittable な型の配列を使用する場合、その仮引数に Out 属性を指定しないと、呼び出し先の変更が呼び出し元の配列にコピーされません。
それより、文字列のやりとりなら配列を使うより StringBuilder を使った方が楽ちんです。ちなみに StringBuilder の場合、常に In/Out 両方の属性持ちとして扱われます。
また、SHGetSpecialFolderPath に渡す文字列は最低 MAX_PATH 分のサイズがないといけません。255 じゃ足りてませんよ。
引用返信 編集キー/
■36874 / inTopicNo.5)  Re[1]: フォントフォルダを取得したい
□投稿者/ たっく (2回)-(2009/06/08(Mon) 14:35:39)
2009/06/08(Mon) 14:40:59 編集(投稿者)
aetosさん、魔界の仮面弁士さん、Hongliangさん、
たくさんのご指摘ありがとうございました。
ご指摘いただき非常に勉強になりました。
無事解決いたしました。ありがとうございました。

        using System.Runtime.InteropServices;

        [DllImport("shell32.dll")]
        private static extern bool SHGetSpecialFolderPath(
            IntPtr hwndOwner,
            StringBuilder lpszPath,
            int csidl, 
            bool fCreate);

        const int CSIDL_FONTS = 0x0014; 

        string GetFontFolder(StringBuilder lpszPath)
        {
            SHGetSpecialFolderPath(IntPtr.Zero, lpszPath, CSIDL_FONTS, false);
            string s = lpszPath.ToString();
            return s;
        }

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -