Compartir a través de


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 (ya sea desde el depurador o debido a que se lanzó una excepción, lo que desencadena el cuadro de diálogo Just-in-Time [JIT]), el usuario tiene la opción de elegir el transporte (otro nombre para un proveedor de puertos) que desea 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 . Este puerto se pasa al motor de depuración de una forma u otra.

Example

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. Esta no es la única manera de realizar estas tareas, y es posible que el puerto ni siquiera esté involucrado, aparte de que se le haya dado el IDebugProgramNode2 del programa.

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