Ottenere una porta
Una porta rappresenta una connessione a un computer in cui sono in esecuzione i processi. Tale computer potrebbe essere il computer locale o un computer remoto (che potrebbe eseguire un sistema operativo non basato su Windows. Per altre informazioni, vedere Porte ).
Una porta è rappresentata dall'interfaccia IDebugPort2 . Viene usato per ottenere informazioni sui processi in esecuzione nel computer a cui è connessa la porta.
Un motore di debug deve accedere a una porta per registrare i nodi del programma con la porta e soddisfare le richieste di informazioni sul processo. Ad esempio, se il motore di debug implementa l'interfaccia IDebugProgramProvider2 , l'implementazione per il metodo GetProviderProcessData potrebbe richiedere la porta per la restituzione delle informazioni necessarie sul processo.
Visual Studio fornisce la porta necessaria al motore di debug e ottiene questa porta da un fornitore di porte. Se un programma è collegato a (dall'interno del debugger o a causa di un'eccezione generata, che attiva la finestra di dialogo JUST-in-Time [JIT]), all'utente viene assegnata la scelta del trasporto (un altro nome per un fornitore di porte) da usare. In caso contrario, se l'utente avvia il programma dall'interno del debugger, il sistema di progetto specifica il fornitore di porte da utilizzare. In entrambi i casi, Visual Studio crea un'istanza del fornitore di porte, rappresentato da un'interfaccia IDebugPortSupplier2 e richiede una nuova porta chiamando AddPort con un'interfaccia IDebugPortRequest2 . Questa porta viene quindi passata al motore di debug in una maschera o in un'altra.
Esempio
Questo frammento di codice illustra come usare la porta fornita a LaunchSuspended per registrare un nodo del programma in ResumeProcess. I parametri non direttamente correlati a questo concetto sono stati omessi per maggiore chiarezza.
Nota
Questo esempio usa la porta per avviare e riprendere il processo e presuppone che l'interfaccia IDebugPortEx2 sia implementata sulla porta. Questo non significa che l'unico modo per eseguire queste attività, ed è possibile che la porta non sia neanche coinvolta oltre ad avere assegnato il IDebugProgramNode2 del programma.
// 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);
}