Obtener un puerto

Un puerto representa una conexión a una máquina en la que se ejecutan los procesos. Esa máquina podría ser la máquina local o una máquina remota (que podría estar ejecutando un sistema operativo no basado en Windows; consulte Puertos para obtener más información).

Un puerto se representa mediante la interfaz IDebugPort2 . Se usa para obtener información sobre los procesos que se ejecutan en la máquina a la que está conectado el puerto.

Un motor de depuración necesita acceso a un puerto para registrar nodos de programa con el puerto y satisfacer las solicitudes de información del proceso. Por ejemplo, si el motor de depuración implementa la interfaz IDebugProgramProvider2 , la implementación del método GetProviderProcessData podría pedir al puerto que se devuelva la información de proceso necesaria.

Visual Studio proporciona el puerto necesario al motor de depuración y obtiene este puerto de un proveedor de puertos. Si se adjunta un programa a (ya sea desde el depurador o debido a una excepción, que desencadena el cuadro de diálogo Just-In-Time [JIT], el usuario tiene la opción de transporte (otro nombre para un proveedor de puertos) que se va a usar. De lo contrario, si el usuario inicia el programa desde el depurador, el sistema de proyecto especifica el proveedor de puertos que se va a usar. En cualquier caso, Visual Studio crea una instancia del proveedor de puertos, representado por una interfaz IDebugPortSupplier2 y solicita un puerto nuevo llamando a AddPort con una interfaz IDebugPortRequest2 . A continuación, este puerto se pasa al motor de depuración de un formulario u otro.

Ejemplo

Este fragmento de código muestra cómo usar el puerto proporcionado a LaunchSuspended para registrar un nodo de programa en ResumeProcess. Los parámetros no relacionados directamente con este concepto se han omitido para mayor claridad.

Nota:

En este ejemplo se usa el puerto para iniciar y reanudar el proceso y se supone que la interfaz IDebugPortEx2 se implementa en el puerto. Esto no es la única manera de realizar estas tareas, y es posible que el puerto ni siquiera esté implicado aparte de tener el IDebugProgramNode2 del programa dado.

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