文章編號: 194873 - 上次校閱: 2005年6月2日 - 版次: 5.0

如何從 Visual C++ 6.0 中的可執行檔存取 Visual Basic ActiveX DLL

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文章顯示三種方法可以從 Visual C++ 6.0 存取 Visual Basic ActiveX DLL 可執行檔。

其他相關資訊

這份文件代表簡介建立 Visual Basic ActiveX 元件的 Visual C++ 用戶端。如果您已經精通 Visual C++ 可能要請參閱參考一節的清單的更進階的主題。

建立 Visual Basic 伺服器的步驟



  1. 建立 Visual Basic ActiveX DLL 專案。預設會建立類別 1。
  2. 將下列程式碼加入至類別 1:
          Public Function MyVBFunction(x As Integer) As Integer
             MsgBox x
          End Function
    						
  3. 編譯成 c:\Project1.dll DLL,然後結束 Visual Basic。
方法 1-CreateDispatch:

  1. 啟動 Visual C++,然後選取 [檔案] 功能表上的 [新增]。選擇 [MFC AppWizard (Exe) 專案名稱並按一下 [確定]。當對話方塊便會出現 [MFC AppWizard 按一下 [完成]。在下一個對話方塊中按一下 [確定]。
  2. 在 [檢視] 功能表上選取 ClassWizard、 在 [類別名稱] 方塊中挑選 Ctst1App 然後連按兩下 InitInstance 在訊息方塊上。按一下 [編輯程式碼的 BOOL CTst1App::InitInstance() 帶出程式碼,請尋找行 AfxEnableControlContainer() ;,並加入之前它下的面這一行:
          AfxOleInit();
  3. 選取 [從 [檢視] 功能表的 [ClassWizard 和按一下 [自動化] 索引標籤,按一下 [AddClass 並選取 「 從 TypeLibrary 」。指定 Project1.dll,在步驟 3 中建立的 Visual Basic DLL。當出現 [確認類別] 對話方塊時,按一下 [確定]。再按一下 [確定],關閉 [MFC ClassWizard] 對話方塊。
  4. 開啟您 < 應用程式名稱 >.cpp 檔並加入一行 # include Project1.h 」。您需要包含 Project1.h,只要您有存取 project1.dll 的程式碼。
  5. 再次開啟 [ClassWizard。在訊息對應] 索引標籤上選取 CAboutDlg 類別名稱] 方塊及 IDOK 在物件的識別碼] 方塊中,然後再連按兩下 BN_CLICKED。按一下 [確定] 以回應 [對話方塊] 和 [一次 [確定] 關閉 [ClassWizard。
  6. 開啟 < 應用程式名稱 >.cpp、 捲動到下至 theCAboutDlg::OnOK(),並以下列的程式碼取代:
          void CAboutDlg::OnOK()
          {
    
          short st = 2;
          short st1;
          _Class1 p;
          p.CreateDispatch("Project1.Class1");
          st1 = p.MyVBFunction(&amp;st);
          CDialog::OnOK();
          }
    						
  7. 編譯.exe 檔 (F7)。
  8. 執行.exe 檔案,並選取 [說明] 功能表上的 [關於。按一下 [關於] 方塊上的 [確定],並在 project1.dll 中指定的訊息方塊出現。按一下 [關閉] 按鈕以關閉對話方塊。
方法 2-#IMPORT:

  1. 啟動 Visual C++ 6.0 中,並建立 Win32 主控台應用程式。選取 [」 的空專案],然後按一下 [完成]。
  2. 指向 [專案] 功能表並按一下 [新增] 將新的 C + + 原始程式檔加入至專案上的加入至專案。將下列程式碼貼入新的原始程式檔中,並將它儲存:
          #include <stdio.h>
    
          // This is the path for your DLL.
          // Make sure that you specify the exact path.
    
          #import "c:\project1.dll"  no_namespace
    
          void main()
          {
           BSTR bstrDesc;
    
          try
          {
          CoInitialize(NULL);
          short st = 2;
           short st1;
          // Declare the Interface Pointer for your Visual Basic object. Here,
          // _Class1Ptr is the Smart pointer wrapper class representing the
          // default interface of the Visual Basic object.
    
          _Class1Ptr ptr;
          // Create an instance of your Visual Basic object, here
          // __uuidof(Class1) gets the CLSID of your Visual Basic object.
    
           ptr.CreateInstance(__uuidof(Class1));
           st1 = ptr->MyVBFunction(&st);
          }
          catch(_com_error &e)
          {
           bstrDesc = e.Description();
    
          }
          CoUninitialize();
          }
    						
  3. 編譯並執行您的專案。從 Project1.DLL 訊息方塊應該會出現。
# import 方法可用的 Win32 應用程式一個主控台應用程式] 中或在 MFC 中也。

方法 3-純粹的 COM 介面

  1. 啟動 Visual C++,然後從 [檔案] 功能表中選取 [新增]。選擇 [MFC AppWizard (Exe) 命名為專案 tst1,再按一下 [確定]。當 [MFC 出現 Win32 應用程式] 將對話方塊,選取對話方塊架構並按一下 [完成]。下一個對話方塊出現時,請按一下 [確定]。
  2. 預設啟動資源編輯器。刪除] 對話方塊上的所有控制項,並保留預設標題 Button1 」 在它上, 新增命令按鈕。
  3. 連按兩下 [Button1] 以顯示加入成員函式] 對話方塊。按一下 [確定] 以接受 OnButton1 名稱。
  4. 按一下 [工具] 功能表上的 [OLE/COM 物件檢視器]。從 [檔案] 功能表選取 [檢視 Typelib,然後選擇您稍早建立的 Project1.dll。 按一下 [開啟] 以顯示包含針對您的 DLL 的.idl 檔案 「 ITypeLib 檢視器 」。
  5. 將.idl 檔 (右窗格的內容) 的內容複製到剪貼簿。按住 SHIFT 鍵同時分頁或捲動第一個字元從窗格中文字的結尾。請按 Ctrl + C 將標示的文字複製到剪貼簿]。
  6. 按一下 [Visual C++ 檔案] 功能表上的 [新增]。選取 [新的對話方塊名稱檔案 test1.idl 上的文字檔案,然後按一下 [確定]。
  7. 會出現空白文字檔。貼上剪貼簿資料,然後儲存檔案。
  8. 從 [專案] 功能表中選取 [設定]、 展開 [tst1] 和 [樹狀目錄] 檢視的原始程式檔節點,然後選取 test1.idl。按一下 [MIDL] 索引標籤、 在 「 輸出標頭檔名稱"] 方塊輸入 test1.h,然後按一下 [確定]。
  9. 開啟 tst1Dlg.cpp 並新增到下列檔案將包含區段:
          #include <initguid.h>
          #include "test1.h"
    						
  10. 按一下 [檢視] 功能表上 ClassWizard、 在 [類別名稱] 方塊中選取 Ctst1App,然後連按兩下 InitInstance 在訊息方塊上。按一下 [編輯程式碼] 以帶出的程式碼:
          BOOL CTst1App::InitInstance()
    						
    尋找行:
          AfxEnableControlContainer();
    						
    加入之前它下的面這一行:
          AfxOleInit();
    						
  11. 再次開啟 [ClassWizard。在訊息對應] 索引標籤上選取 [類別名稱] 方塊及 IDC_BUTTON1 在物件的識別碼] 方塊中的 [CTst1Dlg]。 連按兩下 [訊息] 方塊的 BN_CLICKED,並按一下 [編輯程式碼,為 void CTst1Dlg::OnButton1() 帶出程式碼]。使用下列程式碼取代 OnButton1() 函式:
          void CTst1Dlg::OnButton1()
          {
             // TODO: Add your control notification handler code here.
    
             _Class1 *pClass = NULL;
             IUnknown *pUnk = NULL;
    
          //   HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,
          //   CLSCTX_INPROC_SERVER,IID__Class1,(void **)&pClass);
          //   You can directly get the Interface ID as in the previous line or
          //   you can do a QueryInterface on IUnknown to get the IID
          //   as in the following three lines:
    
          HRESULT hr = CoCreateInstance(CLSID_Class1,NULL,CLSCTX_INPROC_SERVER,
          IID_IUnknown,(void **)&pUnk);
          hr = pUnk->QueryInterface(IID__Class1,(void **)&pClass);
          pUnk->Release();
    
          // Once you have the IID, you can make use of the interface pointer
          // to access our Visual Basic DLL.
    
          short st = 2;
          short st1;
          hr = pClass->MyVBFunction(&st,&st1);
          pClass->Release();
    
          }
    						
  12. 編譯.exe 檔 (F7) 並執行您的應用程式 (F5)。 按一下 [Button1] 對話方塊中。會出現訊息方塊,從 Visual Basic DLL。

?考

如需詳細資訊請參閱下列文件 「 Microsoft 知識庫 」 中:
178749? (http://support.microsoft.com/kb/178749/EN-US/ ) 如何建立使用 MFC 和型別程式庫的自動化專案

188817? (http://support.microsoft.com/kb/188817/EN-US/ ) 如何 ComCallingJava 範例的 VC + + MFC 用戶端

這篇文章中的資訊適用於:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbinfo kbcode kbhowto KB194873 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:194873? (http://support.microsoft.com/kb/194873/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。