none
請問一下有關 IntPtr RRS feed

  • 問題

  •  

    最近使用一個用 C++ 寫的 .dll

    我在程式中 使用 [DllImport("xxxx.dll")] 方法去參考它,

    這個 .dll 裡面有段 內容是

    typedef char *msg;

     

    我在 C# 中要接這個型別的回傳值,使用

    private IntPtr _msg; 去接 .dll 的回傳值,

    但有個狀況是 有時 回傳值內容是 0 ,

    當沒判斷到時就出現

     

    嘗試讀取或寫入受保護的記憶體。這通常表示其他記憶體已損毀。

     

    想問一下在C#  的 指標中,當接到內容為0 ,該如何去判斷內容為 0 或有值 ??

     

     

    2007年10月25日 下午 04:28

解答

  • 你可以看一下 IntPtr.Zero 線上手冊的說明,其中備註提到:

    表示已經初始化為零的指標或控制代碼的唯讀欄位。

    程式碼區塊

    這個欄位的值不等於 Null 參照 (即 Visual Basic 中的 Nothing)。使用這個欄位來有效判斷 IntPtr 的執行個體是否已經設定為非零的值。

    例如,假設變數 ip 是 IntPtr 的執行個體。您可以將該變數與建構函式 (Constructor) 所傳回的值相比較,判斷它是否已經設定,例如:" if ip != new IntPtr(0)... "。不過,叫用 (Invoke) 建構函式來取得未初始化的指標效果不彰。最好是將程式碼撰寫成 "if ip != IntPtr.Zero... " 或 " if !IntPtr.Zero.Equals(ip)... "。

     

     

    2007年10月26日 上午 01:50

所有回覆

  • HI,

     

    指標的值為0代表有錯誤, 不能使用, 不需要再執行其他的判斷

     

    tihs

    2007年10月26日 上午 01:27
  • 你可以看一下 IntPtr.Zero 線上手冊的說明,其中備註提到:

    表示已經初始化為零的指標或控制代碼的唯讀欄位。

    程式碼區塊

    這個欄位的值不等於 Null 參照 (即 Visual Basic 中的 Nothing)。使用這個欄位來有效判斷 IntPtr 的執行個體是否已經設定為非零的值。

    例如,假設變數 ip 是 IntPtr 的執行個體。您可以將該變數與建構函式 (Constructor) 所傳回的值相比較,判斷它是否已經設定,例如:" if ip != new IntPtr(0)... "。不過,叫用 (Invoke) 建構函式來取得未初始化的指標效果不彰。最好是將程式碼撰寫成 "if ip != IntPtr.Zero... " 或 " if !IntPtr.Zero.Equals(ip)... "。

     

     

    2007年10月26日 上午 01:50