none
win API 宣告的方式 RRS feed

  • 問題

  • ??????,?????Visual Basic??? Win API?????????,????????

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecoreos5/html/wce50lrfcomstat.asp

    ????????????????(????ClearCommError??API?????);

    Private Structure COMSTAT
            Public fCtsHold As Int32
            Public fDsrHold As Int32
            Public fRlsdHold As Int32
            Public fXoffHold As Int32
            Public fXoffSent As Int32
            Public fEof As Int32
            Public fTxim As Int32
            Public fReserved As Integer
            Public cbInQue As Integer
            Public cbOutQue As Integer
    End Structure

    ?????????compact framework sample,????????class??,??????property???,??

    [StructLayout(LayoutKind.Sequential)]
     internal class CommStat
     {
      //
      // typedef struct _COMSTAT {
      //     DWORD fCtsHold : 1;
      //     DWORD fDsrHold : 1;
      //     DWORD fRlsdHold : 1;
      //     DWORD fXoffHold : 1;
      //     DWORD fXoffSent : 1;
      //     DWORD fEof : 1;
      //     DWORD fTxim : 1;
      //     DWORD fReserved : 25;
      //     DWORD cbInQue;
      //     DWORD cbOutQue;
      // } COMSTAT, *LPCOMSTAT;
      //

      //
      // Since the structure contains a bit-field, use a UInt32 to contain
      // the bit field and then use properties to expose the individual
      // bits as a bool.
      //
      private UInt32 bitfield;
      public UInt32 cbInQue = 0;
      public UInt32 cbOutQue = 0;

      // Helper constants for manipulating the bit fields.
      private readonly UInt32 fCtsHoldMask    = 0x00000001;
      private readonly Int32 fCtsHoldShift    = 0;
      private readonly UInt32 fDsrHoldMask    = 0x00000002;
      private readonly Int32 fDsrHoldShift    = 1;
      private readonly UInt32 fRlsdHoldMask   = 0x00000004;
      private readonly Int32 fRlsdHoldShift   = 2;
      private readonly UInt32 fXoffHoldMask   = 0x00000008;
      private readonly Int32 fXoffHoldShift   = 3;
      private readonly UInt32 fXoffSentMask   = 0x00000010;
      private readonly Int32 fXoffSentShift   = 4;
      private readonly UInt32 fEofMask        = 0x00000020;
      private readonly Int32 fEofShift        = 5;       
      private readonly UInt32 fTximMask       = 0x00000040;
      private readonly Int32 fTximShift       = 6;

      public bool fCtsHold
      {
       get { return ((bitfield & fCtsHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fCtsHoldShift); }
      }
      public bool fDsrHold
      {
       get { return ((bitfield & fDsrHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fDsrHoldShift); }
      }
      public bool fRlsdHold
      {
       get { return ((bitfield & fRlsdHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fRlsdHoldShift); }
      }
      public bool fXoffHold
      {
       get { return ((bitfield & fXoffHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fXoffHoldShift); }
      }
      public bool fXoffSent
      {
       get { return ((bitfield & fXoffSentMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fXoffSentShift); }
      }
      public bool fEof
      {
       get { return ((bitfield & fEofMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fEofShift); }
      }
      public bool fTxim
      {
       get { return ((bitfield & fTximMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fTximShift); }
      }
     }

    ??????????????????????

    2006年5月30日 上午 10:02

解答

  • 應該是 P/Invoke 內部,可以把 class 當 struct 來用吧,但前提是顯露出來的屬性必須要在 API 宣告中的成員一模一樣(最好是順序都相同).
    2006年7月1日 上午 02:10
    版主
  • 你可以先看一下這篇,在整個 .Net framework 內都一樣。

    http://tlcheng.spaces.msn.com/blog/cns!145419920BFD55A7!1012.entry

    註:小朱那天我要發 MSN Messenger 給你,剛好你不在線上。

    2006年7月1日 下午 03:09
    版主
  •  bauann 寫信:

    抱歉,小弟重新發一次,不知到會甚麼中文字都變成"?????",是文章一經編輯之後就變成這樣。

    在複製跟貼文時,請先將兩視窗分別轉換到新注音或新倉頡輸入法下,在進行複製及貼上。

    2006年7月3日 下午 03:48
    版主

所有回覆

  • 抱歉,小弟重新發一次,不知到會甚麼中文字都變成"?????",是文章一經編輯之後就變成這樣。

    以下為原文

    請教各位先進,小弟在使用Visual Basic來操作 Win API的時候一直有些不懂,像是下面這個例子

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecoreos5/html/wce50lrfcomstat.asp

    這部份之前我都是宣告一個結構出來(小弟呼叫ClearCommError這個API是不成功的);

    Private Structure COMSTAT
            Public fCtsHold As Int32
            Public fDsrHold As Int32
            Public fRlsdHold As Int32
            Public fXoffHold As Int32
            Public fXoffSent As Int32
            Public fEof As Int32
            Public fTxim As Int32
            Public fReserved As Integer
            Public cbInQue As Integer
            Public cbOutQue As Integer
    End Structure

    而小弟在微軟下載了compact framework sample,其中這部份卻是用class來做,其中還有一些property的部份,如下

    [StructLayout(LayoutKind.Sequential)]
     internal class CommStat
     {
      //
      // typedef struct _COMSTAT {
      //     DWORD fCtsHold : 1;
      //     DWORD fDsrHold : 1;
      //     DWORD fRlsdHold : 1;
      //     DWORD fXoffHold : 1;
      //     DWORD fXoffSent : 1;
      //     DWORD fEof : 1;
      //     DWORD fTxim : 1;
      //     DWORD fReserved : 25;
      //     DWORD cbInQue;
      //     DWORD cbOutQue;
      // } COMSTAT, *LPCOMSTAT;
      //

      //
      // Since the structure contains a bit-field, use a UInt32 to contain
      // the bit field and then use properties to expose the individual
      // bits as a bool.
      //
      private UInt32 bitfield;
      public UInt32 cbInQue = 0;
      public UInt32 cbOutQue = 0;

      // Helper constants for manipulating the bit fields.
      private readonly UInt32 fCtsHoldMask    = 0x00000001;
      private readonly Int32 fCtsHoldShift    = 0;
      private readonly UInt32 fDsrHoldMask    = 0x00000002;
      private readonly Int32 fDsrHoldShift    = 1;
      private readonly UInt32 fRlsdHoldMask   = 0x00000004;
      private readonly Int32 fRlsdHoldShift   = 2;
      private readonly UInt32 fXoffHoldMask   = 0x00000008;
      private readonly Int32 fXoffHoldShift   = 3;
      private readonly UInt32 fXoffSentMask   = 0x00000010;
      private readonly Int32 fXoffSentShift   = 4;
      private readonly UInt32 fEofMask        = 0x00000020;
      private readonly Int32 fEofShift        = 5;       
      private readonly UInt32 fTximMask       = 0x00000040;
      private readonly Int32 fTximShift       = 6;

      public bool fCtsHold
      {
       get { return ((bitfield & fCtsHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fCtsHoldShift); }
      }
      public bool fDsrHold
      {
       get { return ((bitfield & fDsrHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fDsrHoldShift); }
      }
      public bool fRlsdHold
      {
       get { return ((bitfield & fRlsdHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fRlsdHoldShift); }
      }
      public bool fXoffHold
      {
       get { return ((bitfield & fXoffHoldMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fXoffHoldShift); }
      }
      public bool fXoffSent
      {
       get { return ((bitfield & fXoffSentMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fXoffSentShift); }
      }
      public bool fEof
      {
       get { return ((bitfield & fEofMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fEofShift); }
      }
      public bool fTxim
      {
       get { return ((bitfield & fTximMask) != 0); }
       set { bitfield |= (Convert.ToUInt32(value) << fTximShift); }
      }
     }

    請問這部份是怎麼判斷出來的?請指點一下小弟。

    2006年5月30日 上午 10:08
  • 應該是 P/Invoke 內部,可以把 class 當 struct 來用吧,但前提是顯露出來的屬性必須要在 API 宣告中的成員一模一樣(最好是順序都相同).
    2006年7月1日 上午 02:10
    版主
  • 你可以先看一下這篇,在整個 .Net framework 內都一樣。

    http://tlcheng.spaces.msn.com/blog/cns!145419920BFD55A7!1012.entry

    註:小朱那天我要發 MSN Messenger 給你,剛好你不在線上。

    2006年7月1日 下午 03:09
    版主
  • 嗯,現在小弟還是測試不出來....再請教一下

     typedef struct _COMSTAT {
      //     DWORD fCtsHold : 1;
      //     DWORD fDsrHold : 1;
      //     DWORD fRlsdHold : 1;
      //     DWORD fXoffHold : 1;
      //     DWORD fXoffSent : 1;
      //     DWORD fEof : 1;
      //     DWORD fTxim : 1;
      //     DWORD fReserved : 25;
      //     DWORD cbInQue;
      //     DWORD cbOutQue;
      // } COMSTAT, *LPCOMSTAT;
    這一段中, DWORD fCtsHold : 1;是不是表示它是佔掉一個bit?這樣看起來總共應該是3個4bytes的空間丟過去就可以才對...是這樣子嗎?

    現在我是像下面這樣子

    Private Declare Function ClearCommError Lib "coredll.dll " (ByVal hComm As Integer, ByRef lpErrors As Int32, ByRef lpStat As COMSTAT) As Integer

        <StructLayout(LayoutKind.Sequential)> _
        Public Structure COMSTAT
            Public StateFlag As Int32
            Public cbInQue As Int32
            Public cbOutQue As Int32
        End Structure

            Dim iReturn As Int32
            Dim ABC As New COMSTAT
            Dim b As Int32
            b = ClearCommError(_hPort, iReturn, ABC).......

    是不是還有錯誤的地方?請指點一下,Thanks !

     附註:錯誤訊息為 " 類型 'System.MissingMethodException' 的未處理例外狀況發生於 "

     

     

    2006年7月3日 上午 10:52
  • Windows API 內的結構,沒有以 bit 為單位的,最小單位是 Byte 。

    在 WinNT 下,DWORD 是 4 Bytes ...

    2006年7月3日 下午 03:01
    版主
  • 還有,那篇網址內,下面那個設定是重點,並不只有序列化而已:

    Pack:=1

    2006年7月3日 下午 03:24
    版主
  • 感謝您的指點;

    但Pack這個部份在compact framework好像沒有支援;請問有變通的方式嗎?

    2006年7月3日 下午 03:40
  • 我沒有在開發 Mobile 之類的程式,你問我我也不知道...
    2006年7月3日 下午 03:45
    版主
  •  bauann 寫信:

    抱歉,小弟重新發一次,不知到會甚麼中文字都變成"?????",是文章一經編輯之後就變成這樣。

    在複製跟貼文時,請先將兩視窗分別轉換到新注音或新倉頡輸入法下,在進行複製及貼上。

    2006年7月3日 下午 03:48
    版主
  • 嗯嗯,了解;我再繼續測試看看,感謝您~~
    2006年7月4日 上午 08:04