Udostępnij za pośrednictwem


Pobieranie portu

Port reprezentuje połączenie z maszyną, na której są uruchomione procesy. Ta maszyna może być maszyną lokalną lub maszyną zdalną (która może być uruchomiona w systemie operacyjnym innym niż Windows; zobacz Porty , aby uzyskać więcej informacji).

Port jest reprezentowany przez interfejs IDebugPort2 . Służy do uzyskiwania informacji o procesach uruchomionych na maszynie, z którym jest połączony port.

Aparat debugowania potrzebuje dostępu do portu w celu zarejestrowania węzłów programu przy użyciu portu i spełnienia żądań dotyczących informacji o procesie. Jeśli na przykład aparat debugowania implementuje interfejs IDebugProgramProvider2 , implementacja metody GetProviderProcessData może poprosić port o zwrócenie niezbędnych informacji o procesie.

Program Visual Studio dostarcza niezbędny port do aparatu debugowania i uzyskuje ten port od dostawcy portów. Jeśli program jest dołączony do (z poziomu debugera lub z powodu wyjątku, który wyzwala okno dialogowe Just-in-Time [JIT], użytkownik otrzymuje wybór transportu (inną nazwę dostawcy portów) do użycia. W przeciwnym razie, jeśli użytkownik uruchamia program z poziomu debugera, system projektu określa dostawcę portu do użycia. W obu zdarzeniach program Visual Studio tworzy wystąpienie dostawcy portów reprezentowanego przez interfejs IDebugPortSupplier2 i prosi o nowy port przez wywołanie polecenia AddPort za pomocą interfejsu IDebugPortRequest2 . Ten port jest następnie przekazywany do aparatu debugowania w jednej lub innej postaci.

Przykład

W tym fragmencie kodu pokazano, jak używać portu dostarczonego do polecenia LaunchSuspended w celu zarejestrowania węzła programu w życiorysie. Parametry niezwiązane bezpośrednio z tą koncepcją zostały pominięte w celu zapewnienia przejrzystości.

Uwaga

W tym przykładzie użyto portu do uruchomienia i wznowienia procesu i przyjęto założenie, że interfejs IDebugPortEx2 jest implementowany na porcie. Nie jest to jedyny sposób wykonywania tych zadań i istnieje możliwość, że port może nawet nie być zaangażowany poza elementem 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);
}