1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      驅動程序和應用程序之間通信

      更新時間: 2007-02-02 09:39:29來源: 粵嵌教育瀏覽量:927

        WinCE上驅動程序的模型相對比較簡單,實現一個驅動程序不是什么難事。盡管如此,本文還是實現了一個比較通用一點的通訊接口。

        應用程序發給信息驅動程序有兩種方式,同步調用和異步調用。

        同步調用能夠讓驅動程序立即處理應用程序的請求,并返回驅動程序處理后的結果。

      如:

      #define MSG_TYPE_TEST_1            0x00000000
      #define MSG_TYPE_ICMP_PACKET    0x00000001

      #pragma pack(push, 1)
      typedef struct __IO_MESSAGE
      {
          ULONG    Type;
          ULONG    Length;

          union
          {
              struct
              {
                  double x;
                  double y;
              }Test_1;

              struct
              {
                  UCHAR MiniPacket[128];
              }Icmp_Packet;

              // All other messages add here

          }value;
      }IO_MESSAGE, *PIO_MESSAGE;
      #pragma pack(pop)

      #include <windows.h>
      #include "ioexample.h"
      #include "ioapp.h"

      VOID SendMessageWithResult()
      {
          //
          // First of all, open the device
          //
          if(!IO_Open())
              return;


          //
          // Build message
          //
          IO_MESSAGE Msg;

          Msg.Type    = MSG_TYPE_TEST_1;
          Msg.Length    = sizeof(Msg.value.Test_1);
          Msg.value.Test_1.x = 3.0;
          Msg.value.Test_1.y = 4.0;

          //
          // Call API to send, IO_SendEx run sync and then return a result.
          //
          UCHAR lpOutBuf[8];
          DWORD BytesReturned;
          BOOL bRet = IO_SendEx((PTLV)&Msg, TLV_LENGTH(&Msg), lpOutBuf, 8, &BytesReturned);
          if(!bRet) // If return FALSE, BytesReturned is error code.
          {
              switch(BytesReturned)
              {
              case IO_ERROR_INVALID_LENGTH:
                  break;
              case IO_ERROR_UNKNOWN:
                  break;
              }
          }

          //
          // Then we get the result
          //
          double z = *(double*)lpOutBuf;

          //
          // When we quit application, don't forget close device.
          //
          IO_Close();
      }

        異步調用不需要結果返回,調用立即返回。對驅動程序的請求會隨后執行。

      如:

      VOID SendMsg()
      {
          //
          // First of all, open the device
          //
          if(!IO_Open())
              return;


          //
          // Build message
          //
          IO_MESSAGE Msg;

          Msg.Type    = MSG_TYPE_TEST_1;
          Msg.Length    = sizeof(Msg.value.Test_1);
          Msg.value.Test_1.x = 3.0;
          Msg.value.Test_1.y = 4.0;

          //
          // Call API to send, IO_SendEx run async.
          //
          BOOL bRet = IO_Send((PTLV)&Msg, TLV_LENGTH(&Msg)); // if we give sizeof(Msg) is also OK.
          if(!bRet) // If return FALSE, something error.
          {
          }

          //
          // When we quit application, don't forget close device.
          //
          IO_Close();
      }

        驅動程序也可以通知應用程序,應用程序檢測到通知事件后,可以取回驅動程序發送給應用程序的請求。

      如:

      VOID ThreadForReceive()
      {
          //
          // First of all, open the device
          //
          if(!IO_Open())
              return;

          //
          // setup a receive event for driver
          //
          HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
          if(hEvent == NULL)
              return;

          IO_InitializeReceiveEvent(hEvent);

          //
          // We can wait for this event and then receive one or more times
          //
          while(1)
          {
              DWORD dRet = WaitForSingleObject(hEvent, INFINITE);
              if(dRet == WAIT_OBJECT_0)
              {
                  DWORD NumbersRemained;
                  IO_MESSAGE OutMessage;
                  BOOL bRet = IO_Receive((PTLV)&OutMessage, sizeof(IO_MESSAGE), &NumbersRemained);
                  if(bRet == FALSE) // if return false, numbersremained is error code
                  {
                  }
                  else
                  {
                      
                  }
                  
                  for(int i=0; i<NumbersRemained; i++)
                  {
                      DWORD temp;
                      bRet = IO_Receive((PTLV)&OutMessage, sizeof(IO_MESSAGE), &temp);
                  }
              }

              // We can test here whether main process let us quit
              //if(WAIT_OBJECT_0 == WaitForSingalObject(hQuitEvent, 0))
              //   break;

              // As a test, any way we should break here
              break;
          }


          // Free them
          IO_RemoveReceiveEvent();
          CloseHandle(hEvent);

          //
          // When we quit application, don't forget close device.
          //
          IO_Close();
      }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 在线精品国自产拍不卡 | 特黄特色的大片在线观看 | 夜色福利院在线看 | 亚洲人在线观看影院 | 亚洲精品456在线播放 | 日韩中文亚洲精品视频 |