<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      怎么用VC++與Visual Foxpro進行ActiveX數據通訊

      [摘要]作者:粟利民 孫強   摘要 本文描述了如何利用自動服務器 Active Automation,在VC++ 中與Visual Foxpro 進行數據通訊的方法。通過自動服務器,圓滿地解決 了各種數據...
      作者:粟利民 孫強

        摘要 本文描述了如何利用自動服務器 Active Automation,在VC++
      中與Visual Foxpro 進行數據通訊的方法。通過自動服務器,圓滿地解決
      了各種數據類型的交換問題。

        關鍵詞 VC++,Visual Foxpro,ActiveX Automation,數據通訊。

      在進行軟件開發的過程中,如何在不同的編程工具之間進行數據交換和通
      訊,需要進行不斷的探索和總結。我們在開發機械CAD仿真軟件的過程中,
      遇到了在VC++中讀取和修改Visual Foxpro 中數據的問題。經過許多次的
      試驗,我們通過采用自動服務器(ActiveX Automation)的方法圓滿解決
      了這個問題。

        自動服務器, 以前稱為 OLE Automation, 后來稱為 ActiveX OLE
      Automation, 就是編寫能被其他程序調用的代碼。其他程序不是以DLL的
      孤立方式而是直接調用自動服務器的用戶代碼。這其中比較難理解的概念
      是:自動服務器用戶代碼向其他應用程序揭示了屬性(變量)和方法(函
      數)。

        以下將以整型和雙精度(對浮點型同樣適用)的數據傳遞為例,講述
      如何用ActiveX Automation在VC++和Visual Foxpro 之間進行數據通訊,
      例子中的編程工具為VC++ 5.0和Visual Foxpro 5.0。

        一.在Visual Foxpro中創建自動服務器

        1.在Visual Foxpro中定義服務器類(此例中為CDATA類)

        首先在某目錄下新建一工程,在工程管理器中選擇代碼欄,同一目錄
      下新建一程序(如MyServer.prg),并在此程序文件中定義服務器類。

           *File Name: MyServer.prg
           DEFINE CLASS CData AS Custom OLEPUBLIC
            *對VC++而言, para1為整型, para2為double型
            para1=123
            para2=123.123
            PROCEDURE ChangeData
              this.para1=this.para1*2
              this.para2=this.para2*2
              RETURN
            ENDPROC
           ENDDEFINE

        2.將上述程序聯編為可執行程序(如MyServer.exe)

        選中程序MyServer,點擊“連編”按鈕,選擇“連編可執行程序”選
      項,并按確定,便可生成可執行程序。

        二.在VC++中對自動服務器進行測試

        1.關閉Visual Foxpro,在VC++中選擇菜單項“File-New”,再選擇
      “Projects”中的“MFC AppWizard (exe)” 選項,隨后按默認方式生成
      “Dialog Based”的工程項目(此例中工程名為MyTest)。

        2.在MyTest.cpp中的APP類的InitInstance()函數開頭加入OLE使能。

             BOOL CMyTestApp::InitInstance()
            {
                 BOOL OleEnable=AfxOleInit();
                 if(!OleEnable) return FALSE;
                ……
            }

        3.在ClassWizard中選“Automation”中的“Add Class-From a type
      library”。在“ Import from type library”對話框中找到剛才所創建
      的Visual Foxpro工程目錄下的tlb文件(如MyServer.tlb)并選擇“打開”
      按鈕,會有提示說明將要從Lib中生成CDATA類,點擊OK按鈕加以確認,將
      自動在項目中加入與CDATA類有關的文件MyServer.cpp 和MyServer.h。在
      ClassView 中可查看 CDATA 類的函數,如 GetPara1()、 SetPara1() 和
      CHANGEDATA()等。這里要注意類名CDATA和函數名CHANGEDATA() 的大小寫
      請參看具體的頭文件MyServer.h。

        4.在對話框類(此例中為CMyTestDlg)的頭文件MyTestDlg.h的開頭
      部分,將CDATA類的頭文件MyServer.h包含進來。隨后定義CDATA類的實例
      m_data作為對話框類的成員變量。

        // MyTestDlg.h : header file
        #include "myserver.h"
         ……
        class CMyTestDlg : public CDialog
        {
          // Construction
          public:
             CMyTestDlg(CWnd* pParent = NULL); // standard constructor
          private:
             CDATA m_data; //定義CDATA類的實例m_data
          ……
         }
         ……

        5.在對話框的初始化部分(如InitDialog()函數中)加入

          m_data.CreateDispatch(“MyServer.CDATA);

        6.使用自動服務器的通訊編程

        此例中,我們在對話框中設置一命令按鈕“Test”,通過點擊該按鈕
      來對自動服務器進行測試。

      void CMyTestDlg::OnButtonTest()
      {
          //首先利用CDATA類的GetPara1()等取值函數取出Foxpro中的變量值,
          //再利用CDATA類SetPara1()等賦值函數來修改Foxpro中的這些變量值
          //也可以在VC++中調用CDATA類的函數CHANGEDATA()來修改變量值
          //定義tagVARIANT型變量,請參看有關tagVARINAT的幫助
          tagVARIANT mypara1, mypara2;
          mypara1=m_data.GetPara1();  //讀取Foxpro中的變量值para1
          mypara2=m_data.GetPara2();  //讀取Foxpro中的變量值para2
          //檢驗讀取數據是否正確(Foxpro設定為123和123.123)
          if(mypara1.iVal==123)
             MessageBox("mypara1.iVal=123");
          if(mypara2.dblVal==123.123)
             MessageBox("mypara2.dblVal=123.123");
          //修改這些變量值(也可用調用CHANGEDATA()的方式來修改變量值)
          mypara1.iVal=mypara1.iVal*2; //整型變量乘以2
          mypara2.dblVal=mypara2.dblVal*2.0; //double型變量也乘以2
          m_data.SetPara1(mypara1);   //向Foxpro賦值
          m_data.SetPara2(mypara2);
        //再次讀取Foxpro中的變量值
          mypara1=m_data.GetPara1();
          mypara2=m_data.GetPara2();
          //檢驗修改數據是否正確(應改為246和246.246)
          if(mypara1.iVal==246)
             MessageBox("mypara1.iVal=246");
          if(mypara2.dblVal==246.246)
             MessageBox("mypara2.dblVal=246.246");
      }

        上面講述在VC++中如何與Visual Foxpro 進行整型和雙精度型變量的
      數據通訊的方法。通過查看tagVARIANT結構的幫助文件,可以看到其中有
      一個成員為VARTYPE vt。可以說vt是非常重要的,在VC++中讀取Foxpro中
      的數據后,vt 的值就決定了其數據的類型。在上例中,mypara1.vt等于3
      而mypara2.vt等于5,表示它們的數據類型分別為整型和雙精度型。在VC++
      中也可根據tagVARIANT變量的vt值來判斷所讀取的數據的確切類型。我們
      還可以看到,不同類型的數據,在VC++中的訪問方式也有所不同。如整型
      用 iVal,而雙精度型用 dblVal,上例中分別為mypara1.iVal和mypara2.
      dblVal。


      日韩精品一区二区三区高清