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

打造自訂 Windows 終端服務客戶端:整合 Microsoft Terminal Services ActiveX 控制項 (C++ Builder)

     編輯:VC 教學

前言

Windows 遠端桌面連線 (RDP) 核心功能封裝於 mstscax.dll (Microsoft Terminal Services ActiveX Client) 中。本文詳細指導如何在 C++ Builder 中匯入此 ActiveX 控制項,建立自訂遠端桌面客戶端應用程式,涵蓋元件安裝、關鍵屬性/方法、連線流程與部署注意事項。

先決條件

  1. mstscax.dll 存在並已註冊:
    • Windows XP/Server 2003 內建:%SystemRoot%\System32\mstscax.dll (版本 5.1.2600.0+)
    • Windows 2000 需下載安裝「遠端桌面連線」客戶端 (msrdpcli.exe)
    • 註冊命令:regsvr32 mstscax.dll (需管理員權限)
  2. C++ Builder 6/2007/2009/XE 及以上版本

步驟 1:匯入 ActiveX 控制項

  1. 選單 Component → Import ActiveX Control
  2. 列表中尋找:Microsoft Terminal Services Active Client 1.0 Type Library (Version 1.0)
  3. 點擊 Install...
  4. 選擇 Into new package,儲存為 mstsc.bpk (如 D:\Packages\mstsc\mstsc.bpk)
  5. Description 填入:Microsoft Terminal Service Control
  6. 確定 → 編譯安裝

已知問題:BCB 編譯錯誤 OlePrecedure 未定義

匯入產生的 _OCX 單元中可能出現拼寫錯誤:OlePrecedure (缺少 'o')。解決方法:

  • 開啟產生的 MSTSCLib_TLB.cpp (或 .h)
  • 搜尋 OlePrecedure → 全部替換為 OleProcedure
  • 重新編譯套件 → 安裝成功

步驟 2:元件面板新增控制項

安裝成功後,ActiveX 頁面將出現兩個控制項:

  • TMsTscAx - 主要控制項 (對應 IMsTscAx 介面),本文重點使用
  • TMsRdpClient - 較新版本介面封裝 (RDP 6.0+)

步驟 3:關鍵屬性與方法完整參考

連線設定屬性

屬性類型說明範例
ServerWideString遠端伺服器 IP 或主機名MsTscAx1->Server = WideString("192.168.1.100");
UserNameWideString登入使用者名稱MsTscAx1->UserName = WideString("Administrator");
DesktopWidthlong桌面寬度 (像素)MsTscAx1->DesktopWidth = 1024;
DesktopHeightlong桌面高度 (像素)MsTscAx1->DesktopHeight = 768;
ColorDepthlong色深:8=256色, 16=高彩色, 24=真彩色MsTscAx1->ColorDepth = 16;
FullScreenVARIANT_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 控制項實現工具列、狀態指示器

替代方案對比

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點適用場景
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