1. gzyueqian
      13424082685

      驅(qū)動(dòng)程序和應(yīng)用程序之間通信

      更新時(shí)間: 2007-02-02 09:39:29來(lái)源: 粵嵌教育瀏覽量:932

        WinCE上驅(qū)動(dòng)程序的模型相對(duì)比較簡(jiǎn)單,實(shí)現(xiàn)一個(gè)驅(qū)動(dòng)程序不是什么難事。盡管如此,本文還是實(shí)現(xiàn)了一個(gè)比較通用一點(diǎn)的通訊接口。

        應(yīng)用程序發(fā)給信息驅(qū)動(dòng)程序有兩種方式,同步調(diào)用和異步調(diào)用。

        同步調(diào)用能夠讓驅(qū)動(dòng)程序立即處理應(yīng)用程序的請(qǐng)求,并返回驅(qū)動(dòng)程序處理后的結(jié)果。

      如:

      #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();
      }

        異步調(diào)用不需要結(jié)果返回,調(diào)用立即返回。對(duì)驅(qū)動(dòng)程序的請(qǐng)求會(huì)隨后執(zhí)行。

      如:

      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();
      }

        驅(qū)動(dòng)程序也可以通知應(yīng)用程序,應(yīng)用程序檢測(cè)到通知事件后,可以取回驅(qū)動(dòng)程序發(fā)送給應(yīng)用程序的請(qǐng)求。

      如:

      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();
      }

      免費(fèi)預(yù)約試聽(tīng)課

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

      
      

      1. 午夜热门精品一区二区 | 日韩欧美国产偷 | 亚洲欧美中文字幕在线一区91 | 中文字幕第8页在线亚洲 | 亚洲业余性爱视频偷窥 | 亚洲中亚洲中文字幕乱码首页 |