Sdílet prostřednictvím


Získání portu

Port představuje připojení k počítači, na kterém běží procesy. Tento počítač může být místním nebo vzdáleným počítačem (který může být spuštěný operační systém, který není založený na Windows; další informace najdete v tématu Porty ).

Port je reprezentován rozhraním IDebugPort2 . Slouží k získání informací o procesech spuštěných na počítači, ke kterému je port připojený.

Ladicí modul potřebuje přístup k portu, aby mohl registrovat programové uzly s portem a uspokojovat požadavky na informace o procesu. Pokud například ladicí modul implementuje IDebugProgramProvider2 rozhraní, implementace metody GetProviderProcessData může požádat port o potřebné informace o procesu, které mají být vráceny.

Visual Studio poskytuje potřebný port pro ladicí modul a získá tento port od dodavatele portu. Pokud je program připojený (buď z ladicího programu, nebo kvůli výjimce, která aktivuje dialogové okno Just-in-Time [JIT], uživatel má možnost přenosu (jiný název dodavatele portu), který se má použít. V opačném případě, pokud uživatel spustí program z ladicího programu, systém projektu určuje dodavatele portu, který má použít. V obou událostech Visual Studio vytvoří instanci dodavatele portu reprezentované rozhraním IDebugPortSupplier2 a požádá o nový port voláním AddPort s rozhraním IDebugPortRequest2 . Tento port se pak předá do ladicího modulu v jednom formuláři nebo jiném.

Příklad

Tento fragment kódu ukazuje, jak pomocí portu dodaného pro LaunchSuspended zaregistrovat programový uzel v ResumeProcess. Parametry, které přímo nesouvisely s tímto konceptem, byly kvůli přehlednosti vynechány.

Poznámka:

Tento příklad používá port ke spuštění a obnovení procesu a předpokládá, že IDebugPortEx2 rozhraní je implementováno na portu. To neznamená, že jediný způsob, jak tyto úlohy provést, a je možné, že port nemusí být ani zapojen do jiného než mít i IDebugProgramNode2 programu.

// 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);
}