首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC-ATL 開發 COM 元件實戰系列(六):VB 與 VC++ 用戶端完整實作

     編輯:VC 教學

本系列第六篇,示範如何在 Visual Basic 6.0 與 Visual C++ 6.0 中建立用戶端專案,呼叫前面開發的 ValidateCreditCardServer COM 元件,驗證信用卡號碼合法性。

一、Visual Basic 6.0 用戶端

步驟 1:建立標準 EXE 專案

專案名稱:VBTestVCComProj。在表單放置兩個文字框(Text1 輸入卡號、Text2 輸入卡別)、一個命令按鈕(Command1)。

步驟 2:加入類型庫參考

選單 Project → References… → Browse… 選取 ValidateCreditCardServer.dll(或 .tlb),勾選 VALIDATECREDITCARDSERVERLib。

步驟 3:撰寫程式碼

Private Sub Command1_Click()
    Dim comobj As New VALIDATECREDITCARDSERVERLib.ValidateCard
    If comobj.ValidateCreditCard(Text1.Text, Text2.Text) = 1 Then
        MsgBox "valid card"
    Else
        MsgBox "invalid card"
    End If
End Sub

VB 自動處理 CoInitialize/CoUninitialize、BSTR 轉換、錯誤攔截,開發效率極高。

二、Visual C++ 6.0 用戶端(對話框基礎)

步驟 1:建立 MFC 對話框專案

專案名稱:VCTestVCComProj,對話框放置兩個編輯控制項(IDC_EDIT1、IDC_EDIT2)、一個按鈕(IDC_BUTTON1)。

步驟 2:匯入型別庫

在 StdAfx.h 加入:

#import "..\ValidateCreditCardServer\Debug\ValidateCreditCardServer.dll" no_namespace
// 或 #import "..\ValidateCreditCardServer\ValidateCreditCardServer.tlb"

編譯 StdAfx.cpp 產生 .tlh/.tli 於輸出目錄。

步驟 3:使用命名空間

在 VCTestVCComProjDlg.cpp 頂部:

using namespace VALIDATECREDITCARDSERVERLib;

步驟 4:按鈕處理函式完整實作

void CVCTestVCComProjDlg::OnButton1()
{
    HRESULT hr = CoInitialize(NULL); // 1. 初始化 COM 庫
    if (FAILED(hr)) return;

    CLSID clsid;
    hr = CLSIDFromProgID(OLESTR("ValidateCreditCardServer.ValidateCard"), &clsid); // 2. 取得 CLSID
    if (FAILED(hr)) { CoUninitialize(); return; }

    IValidateCard* pCard = nullptr;
    hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IValidateCard), (LPVOID*)&pCard); // 3. 建立實例
    if (FAILED(hr)) { AfxMessageBox(_T("Server Creation Failed")); CoUninitialize(); return; }

    // 4. 使用 COM 物件
    CString strNum, strType;
    GetDlgItemText(IDC_EDIT1, strNum);
    GetDlgItemText(IDC_EDIT2, strType);
    _bstr_t bstrNum(strNum), bstrType(strType);

    long lStatus = 0;
    hr = pCard->ValidateCreditCard(bstrNum, bstrType, &lStatus); // Wrapper 方法
    if (SUCCEEDED(hr)) {
        AfxMessageBox(lStatus == 1 ? _T("valid card") : _T("invalid card"));
    } else {
        AfxMessageBox(_T("Call Failed"));
    }

    pCard->Release(); // 5. 釋放介面
    CoUninitialize(); // 6. 終止 COM 庫
}

三、關鍵差異比較表

面向Visual Basic 6.0Visual C++ 6.0 (MFC)
型別庫匯入Project → References#import 指示詞
物件建立New ClassNameCoCreateInstance + 智慧指標
BSTR 處理自動 String ↔ BSTR_bstr_t 或 SysAllocString
錯誤處理On Error / Err 物件_com_error 例外 / HRESULT 檢查
COM 初始化自動手動 CoInitialize/CoUninitialize
參考計數自動智慧指標自動 / 手動 Release

四、常見錯誤排查

  • LNK2001 未解析外部符號:未編譯 StdAfx.cpp 產生 .tlh,或 #import 路徑錯誤。
  • 執行時錯誤 429 (VB) / CLASS_E_CLASSNOTAVAILABLE (VC++):伺服器 DLL 未註冊(regsvr32)、位元數不符(x86/x64)、ProgID 拼寫錯誤。
  • 介面呼叫失敗 E_NOINTERFACE:用戶端 .tlh 與伺服器實際介面 GUID 不符,重新 #import 最新 DLL。

五、進階:非同步呼叫與事件

若驗證耗時較長,VC++ 可用 CoCreateInstanceEx + ISynchronize 或建立背景執行緒呼叫;VB 則需使用 WithEvents 配合連接點容器實作事件回呼,屬進階主題,後續專文探討。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved