合計 昨日 今日

UnmanagedType.Boolとboolの違い

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ちゃん太
[URL]
Date: 2017年1月04日(水) 15:50
No: 1
(OFFLINE)

 UnmanagedType.Boolとboolの違い

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc,
IntPtr lparam);

[return: MarshalAs(UnmanagedType.Bool)]って必要ですか?

Name: Math
[URL]
Date: 2017年1月04日(水) 18:29
No: 2
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

これはマーシャリングといってC/C++とC#の言語間の型の違いを調整するためですよ。UnmanagedType.BoolがC/C++の「論理型」でbool がC#の「論理型」です。ここhttp://www.cactussoft.co.jp/Sarbo/divManageMarsh0.htmlに説明があります。
>[return: MarshalAs(UnmanagedType.Bool)]って必要ですか?
こういう時には必要です。(サイトのサンプル)。VS2008で動作確認しました。
(長い例しかなくてこれが短いコードのほうです。分からない事が有れば聞いて下さい)
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;using System.Runtime.InteropServices;using System.Text;
public class Program
{
    public static void Main()
    {
        //ウィンドウを列挙する
        EnumWindows(new EnumWindowsDelegate(EnumWindowCallBack), IntPtr.Zero);
        Console.ReadLine();
    }
    public delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam);
 
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc,
        IntPtr lparam);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int GetWindowText(IntPtr hWnd,
        StringBuilder lpString, int nMaxCount);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int GetWindowTextLength(IntPtr hWnd);
 
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int GetClassName(IntPtr hWnd,
        StringBuilder lpClassName, int nMaxCount);
 
    private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam)
    {
        //ウィンドウのタイトルの長さを取得する
        int textLen = GetWindowTextLength(hWnd);
        if (0 < textLen)
        {
            //ウィンドウのタイトルを取得する
            StringBuilder tsb = new StringBuilder(textLen + 1);
            GetWindowText(hWnd, tsb, tsb.Capacity);
 
            //ウィンドウのクラス名を取得する
            StringBuilder csb = new StringBuilder(256);
            GetClassName(hWnd, csb, csb.Capacity);
 
            //結果を表示する
            Console.WriteLine("クラス名:" + csb.ToString());
            Console.WriteLine("タイトル:" + tsb.ToString());
        }
        //すべてのウィンドウを列挙する
        return true;
    }
}

Name: ちゃん太
[URL]
Date: 2017年1月04日(水) 20:02
No: 3
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

Mathさんが書かれたコードの場合、てかあるサイトのコードで僕もそれを見ていましたけど、その場合MarshalAS~を書かないとエラーになるんですか?

Name: Math
[URL]
Date: 2017年1月04日(水) 20:24
No: 4
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

もちろんです。実際にやってみると”エラー 1 ID がありません。”となります。VisualStudioは2015を使っていますか?(私はVS2015です)

Name: ちゃん太
[URL]
Date: 2017年1月04日(水) 20:31
No: 5
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

dllファイルのBOOL型とC#のbool型を互換してるって事でいいですか?

Name: Math
[URL]
Date: 2017年1月04日(水) 20:40
No: 6
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

そうです。dll はC/C++で作ったものでC#とは違うものです。それをMarshalASで”C#の形に変えている”ということです。VSのVersionによって表示が違うかもしれません。私はVS2015です。なにをお使いですか?

Name: ちゃん太
[URL]
Date: 2017年1月04日(水) 21:05
No: 7
(OFFLINE)

 Re: UnmanagedType.Boolとboolの違い

[解決!]

Mathさん
ありがとうございます。ここ数日一番自分の理解度が高まったトピックでした。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[14人]