.NET(C#)平台叫用:類和結構體的封送

來源:互聯網
上載者:User

以GetCursorPos做樣本,它返回當前滑鼠指標在螢幕的位置(以一個POINT結構體)。

關於GetCursorPos和POINT的定義可以參考MSDN:

http://msdn.microsoft.com/en-us/library/ms648390(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/dd162805(v=vs.85).aspx

 

首先實現用自訂C#結構體來調用GetCursorPos,一切看著很簡單。

定義一個記憶體分別連續的結構體POINT,然後在平台叫用生命上用out參數,因為GetCursorPos需要一個POINT的指標!在執行上,首先聲明一個POINT變數(這裡涉及到空間的分配),然後調用GetCursorPos,最後輸出結構,正確!

static void Main()

{

    POINT p;

    GetCursorPos(out p);

    Console.WriteLine(p);

}

 

[StructLayout(LayoutKind.Sequential)]

struct POINT

{

    public int X, Y;

    public override string ToString()

    {

        return String.Format("({0},{1})", X, Y);

    }

}

 

[DllImport("user32.dll")]

static extern void GetCursorPos(out POINT p);

 

接下來看看用一個POINT類(而不是結構體)來實現上面的功能。首先在平台叫用的生命上不需要用out參數,因為類是參考型別,本身就是指標!

其次很重要的是必須使用OutAttribute特性表明POINT參數,因為預設是InAttribute的(如果沒有ref/out的話)。

最後就是空間上的分配,參考型別需要用new來分配。

設定好上面的一切,就可以成功調用了。代碼:

static void Main()

{

    POINT p = new POINT();

    GetCursorPos(p);

    Console.WriteLine(p);

}

 

[StructLayout(LayoutKind.Sequential)]

class POINT

{

    public int X, Y;

    public override string ToString()

    {

        return String.Format("({0},{1})", X, Y);

    }

}

 

[DllImport("user32.dll")]

static extern void GetCursorPos([Out]POINT p);

 

最後注意StructLayout特性也可以修飾類的!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.