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