前言
Windows 遠端桌面連線 (RDP) 核心功能封裝於 mstscax.dll (Microsoft Terminal Services ActiveX Client) 中。本文詳細指導如何在 C++ Builder 中匯入此 ActiveX 控制項,建立自訂遠端桌面客戶端應用程式,涵蓋元件安裝、關鍵屬性/方法、連線流程與部署注意事項。
先決條件
- mstscax.dll 存在並已註冊:
- Windows XP/Server 2003 內建:
%SystemRoot%\System32\mstscax.dll (版本 5.1.2600.0+)
- Windows 2000 需下載安裝「遠端桌面連線」客戶端 (
msrdpcli.exe)
- 註冊命令:
regsvr32 mstscax.dll (需管理員權限)
- C++ Builder 6/2007/2009/XE 及以上版本
步驟 1:匯入 ActiveX 控制項
- 選單 Component → Import ActiveX Control
- 列表中尋找:Microsoft Terminal Services Active Client 1.0 Type Library (Version 1.0)
- 點擊 Install...
- 選擇 Into new package,儲存為
mstsc.bpk (如 D:\Packages\mstsc\mstsc.bpk)
- Description 填入:
Microsoft Terminal Service Control
- 確定 → 編譯安裝
已知問題:BCB 編譯錯誤 OlePrecedure 未定義
匯入產生的 _OCX 單元中可能出現拼寫錯誤:OlePrecedure (缺少 'o')。解決方法:
- 開啟產生的
MSTSCLib_TLB.cpp (或 .h)
- 搜尋
OlePrecedure → 全部替換為 OleProcedure
- 重新編譯套件 → 安裝成功
步驟 2:元件面板新增控制項
安裝成功後,ActiveX 頁面將出現兩個控制項:
- TMsTscAx - 主要控制項 (對應
IMsTscAx 介面),本文重點使用
- TMsRdpClient - 較新版本介面封裝 (RDP 6.0+)
步驟 3:關鍵屬性與方法完整參考
連線設定屬性
| 屬性 | 類型 | 說明 | 範例 |
| Server | WideString | 遠端伺服器 IP 或主機名 | MsTscAx1->Server = WideString("192.168.1.100"); |
| UserName | WideString | 登入使用者名稱 | MsTscAx1->UserName = WideString("Administrator"); |
| DesktopWidth | long | 桌面寬度 (像素) | MsTscAx1->DesktopWidth = 1024; |
| DesktopHeight | long | 桌面高度 (像素) | MsTscAx1->DesktopHeight = 768; |
| ColorDepth | long | 色深:8=256色, 16=高彩色, 24=真彩色 | MsTscAx1->ColorDepth = 16; |
| FullScreen | VARIANT_BOOL | 全螢幕模式 | MsTscAx1->FullScreen = FALSE; |
進階設定 (AdvancedSettings 子物件)
// 啟用位圖快取到磁碟 (提升效能)
MsTscAx1->AdvancedSettings->BitmapPersistence = 1;
// 啟用資料壓縮 (低頻寬環境建議)
MsTscAx1->AdvancedSettings->Compress = 1;
// 其他常用進階屬性:
// EnableWindowsKey (Win 鍵傳遞)、RedirectDrives (磁碟重導向)、
// RedirectPrinters (印表機重導向)、RedirectPorts (序列埠重導向)
// RedirectSmartCards (智慧卡重導向)、RedirectClipboard (剪貼板重導向)
安全設定 (SecuredSettings 子物件,需較高權限)
// 連線後自動啟動指定程式 (替代完整桌面),關閉該程式即斷線
// 適用於「遠端應用程式」模式 (RemoteApp)
MsTscAx1->SecuredSettings->StartProgram = WideString("C:\\RemoteApps\\MyApp.exe");
// 也可設定 StartProgram 的工作目錄、參數等
UI 客製化屬性
| 屬性 | 說明 |
| ConnectingText | 連線中顯示的文字 (支援換行 \n) |
| DisconnectedText | 斷線後顯示的文字 |
| DisplayConnectionBar | 全螢幕模式下是否顯示連線列 (預設 TRUE) |
核心方法
| 方法 | 說明 |
Connect() | 發起連線 (非同步,觸發 OnConnected 事件) |
Disconnect() | 斷開連線 |
CreateTransport() | 建立傳輸層 (內部呼叫) |
RequestControl() | 請求控制權 (影子模式) |
重要事件
OnConnected - 連線成功建立
OnDisconnected - 連線斷開 (參數 discReason 含斷線原因碼)
OnLoginComplete - 登入流程完成
OnFatalError - 嚴重錯誤 (參數錯誤碼)
OnWarning - 警告訊息
OnRemoteDesktopSizeChange - 遠端桌面解析度變更
步驟 4:建立完整客戶端範例
表單設計 (Form1)
- 放置
TMsTscAx (命名 MsTscAx1),設 Align = alClient
- 輸入控制項:
EdtServer (IP/主機名)、EdtUser、EdtPass (PasswordChar='*')
- 勾選框:
ChkFullScreen, ChkCompress, ChkBitmapCache
- 按鈕:
BtnConnect (Caption="連線"), BtnDisconnect (Caption="斷線")
- 狀態列:
StatusBar1 顯示連線狀態
核心代碼 (Unit1.cpp)
#include
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
void __fastcall TForm1::FormCreate(TObject *Sender) {
// 預設值
EdtServer->Text = "127.0.0.1";
EdtUser->Text = "Administrator";
ChkCompress->Checked = true;
ChkBitmapCache->Checked = true;
MsTscAx1->ColorDepth = 16; // 預設高彩色
MsTscAx1->DesktopWidth = 1024;
MsTscAx1->DesktopHeight = 768;
MsTscAx1->ConnectingText = WideString("正在連線到遠端桌面...\n請稍候");
MsTscAx1->DisconnectedText = WideString("連線已中斷。\n感謝使用!");
}
void __fastcall TForm1::BtnConnectClick(TObject *Sender) {
try {
// 基本設定
MsTscAx1->Server = WideString(EdtServer->Text);
MsTscAx1->UserName = WideString(EdtUser->Text);
// 注意:密碼無法透過屬性直接設定 (安全性考量)
// 需使用 SecuredSettings->Password (需簽名的 ActiveX) 或讓使用者手動輸入
MsTscAx1->FullScreen = ChkFullScreen->Checked;
MsTscAx1->AdvancedSettings->Compress = ChkCompress->Checked ? 1 : 0;
MsTscAx1->AdvancedSettings->BitmapPersistence = ChkBitmapCache->Checked ? 1 : 0;
MsTscAx1->AdvancedSettings->RedirectClipboard = true; // 預設開啟剪貼板共用
// 可選:啟動特定遠端應用程式
// MsTscAx1->SecuredSettings->StartProgram = WideString("C:\\Apps\\Notepad.exe");
StatusBar1->Panels->Items[0]->Text = "正在連線...";
BtnConnect->Enabled = false;
BtnDisconnect->Enabled = true;
MsTscAx1->Connect(); // 非同步啟動連線
}
catch (Exception &E) {
ShowMessage("連線啟動失敗:" + E.Message);
BtnConnect->Enabled = true;
}
}
void __fastcall TForm1::BtnDisconnectClick(TObject *Sender) {
MsTscAx1->Disconnect();
BtnConnect->Enabled = true;
BtnDisconnect->Enabled = false;
StatusBar1->Panels->Items[0]->Text = "已斷線";
}
// 事件處理範例
void __fastcall TForm1::MsTscAx1OnConnected(TObject *Sender) {
StatusBar1->Panels->Items[0]->Text = "已連線 - " + EdtServer->Text;
}
void __fastcall TForm1::MsTscAx1OnDisconnected(TObject *Sender, long discReason) {
StatusBar1->Panels->Items[0]->Text = "斷線原因碼:" + IntToStr(discReason);
BtnConnect->Enabled = true;
BtnDisconnect->Enabled = false;
}
void __fastcall TForm1::MsTscAx1OnFatalError(TObject *Sender, long errorCode) {
ShowMessage("遠端桌面嚴重錯誤 (代碼 " + IntToStr(errorCode) + "),請檢查網路/伺服器設定。");
BtnConnect->Enabled = true;
BtnDisconnect->Enabled = false;
}
部署與相容性注意事項
目標機器需求
- mstscax.dll 必須存在並已註冊 (同開發環境)
- Windows 2000 目標機:必須安裝遠端桌面連線客戶端 (
msrdpcli.exe)
- Windows XP/Server 2003+ 內建,通常無需額外安裝
常見連線問題排查
- Q: 連線後立即斷開,OnDisconnected 原因碼 1/2/3?
- A: 常見原因碼:1=協議錯誤, 2=記憶體不足, 3=安全協商失敗。檢查:目標主機是否啟用「允許遠端連線」、防火牆 3389 埠、使用者是否有遠端登入權限 (Remote Desktop Users 群組)、網路層級驗證 (NLA) 相容性。
- Q: 如何自動輸入密碼避免使用者手動輸入?
- A: 標準
MsTscAx 不支援直接設定密碼屬性。解決方案:1) 使用 SecuredSettings->Password (需經 Microsoft 簽章的控制項);2) 群組原則設定「不提示密碼」;3) 使用 .rdp 檔案預存密碼 (加密) 並透過命令列 mstsc.exe file.rdp 啟動;4) 第三方庫 (如 FreeRDP) 實現完整協議。
- Q: 高 DPI 螢幕下遠端桌面模糊?
- A: 設定應用程式 DPI 感知 (Manifest
dpiAware=true),並確保 DesktopWidth/Height 設為遠端實際解析度而非縮放後值。
- Q: 多監視器支援?
- A: RDP 6.0+ (mstscax.dll 6.0+) 支援
UseMultimon 進階設定。需 MsTscAx1->AdvancedSettings->Put_UseMultimon(VARIANT_TRUE) (IDispatch 呼叫)。
進階擴展方向
- 影子模式 (Shadow):監控現有 Session 而非建立新 Session,需
RequestControl 與伺服器端設定
- RemoteApp 整合:僅發布單一應用程式,設定
SecuredSettings->StartProgram 並配合伺服器端 RD Web Access / RemoteApp 發布
- 智慧卡/雙因子認證:啟用
RedirectSmartCards 搭配 CSP
- 自訂 UI 覆蓋層:在
TMsTscAx 上層疊 VCL 控制項實現工具列、狀態指示器
替代方案對比
| 方案 | 優點 | 缺點 | 適用場景 |
| MsTscAx ActiveX | 原生整合、完整 UI、微軟支援 | 僅 Windows、部署需註冊 DLL、密碼自動化受限 | Windows 專用內嵌 RDP 客戶端 |
| FreeRDP (C/C++) | 跨平台、開源、完整協議控制、可自動輸入密碼 | 需自行處理 UI、編譯複雜、授權 (Apache 2.0) | 跨平台、嵌入式、自動化測試 |
| rdesktop (C) | 輕量、Linux 主流 | 僅支援 RDP 4/5、維護較少 | Linux 瘦客戶機 |
| .rdp 檔 + mstsc.exe | 零代碼、支援所有功能、密碼加密儲存 | 無法內嵌、進程隔離、UI 不可控 | 啟動器、入口網站下載 .rdp |
- 上一篇文章: 在 Windows 快速啟動列建立捷徑完整實現 (C++ Builder)
- 下一篇文章: Windows NT/2000 當前登入使用者密碼提取技術深度解析與安全性警示
Copyright ©
程式碼之家 All Rights Reserved