本系列第六篇,示範如何在 Visual Basic 6.0 與 Visual C++ 6.0 中建立用戶端專案,呼叫前面開發的 ValidateCreditCardServer COM 元件,驗證信用卡號碼合法性。
專案名稱:VBTestVCComProj。在表單放置兩個文字框(Text1 輸入卡號、Text2 輸入卡別)、一個命令按鈕(Command1)。
選單 Project → References… → Browse… 選取 ValidateCreditCardServer.dll(或 .tlb),勾選 VALIDATECREDITCARDSERVERLib。
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 轉換、錯誤攔截,開發效率極高。
專案名稱:VCTestVCComProj,對話框放置兩個編輯控制項(IDC_EDIT1、IDC_EDIT2)、一個按鈕(IDC_BUTTON1)。
在 StdAfx.h 加入:
#import "..\ValidateCreditCardServer\Debug\ValidateCreditCardServer.dll" no_namespace
// 或 #import "..\ValidateCreditCardServer\ValidateCreditCardServer.tlb"
編譯 StdAfx.cpp 產生 .tlh/.tli 於輸出目錄。
在 VCTestVCComProjDlg.cpp 頂部:
using namespace VALIDATECREDITCARDSERVERLib;
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.0 | Visual C++ 6.0 (MFC) |
|---|---|---|
| 型別庫匯入 | Project → References | #import 指示詞 |
| 物件建立 | New ClassName | CoCreateInstance + 智慧指標 |
| BSTR 處理 | 自動 String ↔ BSTR | _bstr_t 或 SysAllocString |
| 錯誤處理 | On Error / Err 物件 | _com_error 例外 / HRESULT 檢查 |
| COM 初始化 | 自動 | 手動 CoInitialize/CoUninitialize |
| 參考計數 | 自動 | 智慧指標自動 / 手動 Release |
StdAfx.cpp 產生 .tlh,或 #import 路徑錯誤。regsvr32)、位元數不符(x86/x64)、ProgID 拼寫錯誤。.tlh 與伺服器實際介面 GUID 不符,重新 #import 最新 DLL。若驗證耗時較長,VC++ 可用 CoCreateInstanceEx + ISynchronize 或建立背景執行緒呼叫;VB 則需使用 WithEvents 配合連接點容器實作事件回呼,屬進階主題,後續專文探討。