共用方式為


取得連接埠

連接埠代表處理序執行所在的電腦連線。 該電腦可以是本機電腦或遠端電腦 (可能執行非 Windows 作業系統;如需詳細資訊,請參閱連接埠)。

連接埠是由 IDebugPort2 介面表示。 它會用來取得連接埠所連線之電腦上執行之處理序的相關資訊。

偵錯引擎需要存取連接埠,才能使用該連接埠註冊程式節點,並滿足處理序資訊的要求。 例如,如果偵錯引擎實作 IDebugProgramProvider2 介面,GetProviderProcessData 方法的實作可能會要求連接埠傳回必要的處理序資訊。

Visual Studio 會將必要的連接埠提供給偵錯引擎,並向連接埠提供者取得此連接埠。 如果已連結程式 (無論是從偵錯工具內,還是因為擲回例外狀況,這會觸發 Just-In-Time [JIT] 對話方塊),則使用者可以選擇要使用的傳輸 (連接埠提供者的另一個名稱)。 否則,如果使用者從偵錯工具內啟動程式,則專案系統會指定要使用的連接埠提供者。 在任一事件中,Visual Studio 都會具現化 IDebugPortSupplier2 介面所代表的連接埠提供者,並使用 IDebugPortRequest2 介面呼叫 AddPort 來要求新的連接埠。 然後,此連接埠會以任一形式傳遞至偵錯引擎。

範例

此程式碼片段說明如何使用提供給 LaunchSuspended 的連接埠,在 ResumeProcess 中註冊處理序節點。 為了清楚起見,已省略與這個概念無關的參數。

注意

此範例會使用連接埠來啟動和繼續處理序,並假設已在連接埠上實作 IDebugPortEx2 介面。 這絕不是執行這些工作的唯一方法,而且除了程式提供的 IDebugProgramNode2,甚至可能不涉及連接埠。

// This is an IDebugEngineLaunch2 method.
HRESULT CDebugEngine::LaunchSuspended(/* omitted parameters */,
                                      IDebugPort2 *pPort,
                                      /* omitted parameters */,
                                      IDebugProcess2**ppDebugProcess)
{
    // do stuff here to set up for a launch (such as handling the other parameters)
    ...

    // Now get the IPortNotify2 interface so we can register a program node
    // in CDebugEngine::ResumeProcess.
    CComPtr<IDebugDefaultPort2> spDefaultPort;
    HRESULT hr = pPort->QueryInterface(&spDefaultPort);
    if (SUCCEEDED(hr))
    {
        CComPtr<IDebugPortNotify2> spPortNotify;
        hr = spDefaultPort->GetPortNotify(&spPortNotify);
        if (SUCCEEDED(hr))
        {
            // Remember the port notify so we can use it in ResumeProcess.
            m_spPortNotify = spPortNotify;

            // Now launch the process in a suspended state and return the
            // IDebugProcess2 interface
            CComPtr<IDebugPortEx2> spPortEx;
            hr = pPort->QueryInterface(&spPortEx);
            if (SUCCEEDED(hr))
            {
                // pass on the parameters we were given (omitted here)
                hr = spPortEx->LaunchSuspended(/* omitted parameters */,ppDebugProcess)
            }
        }
    }
    return(hr);
}

HRESULT CDebugEngine::ResumeProcess(IDebugProcess2 *pDebugProcess)
{
    // Make a program node for this process
    HRESULT hr;
    CComPtr<IDebugProgramNode2> spProgramNode;
    hr = this->GetProgramNodeForProcess(pProcess, &spProgramNode);
    if (SUCCEEDED(hr))
    {
        hr = m_spPortNotify->AddProgramNode(spProgramNode);
        if (SUCCEEDED(hr))
        {
            // resume execution of the process using the port given to us earlier.
            // (Querying for the IDebugPortEx2 interface is valid here since
            // that's how we got the IDebugPortNotify2 interface in the first place.)
            CComPtr<IDebugPortEx2> spPortEx;
            hr = m_spPortNotify->QueryInterface(&spPortEx);
            if (SUCCEEDED(hr))
            {
                hr = spPortEx->ResumeProcess(pDebugProcess);
            }
        }
    }
    return(hr);
}