Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Uma porta representa uma conexão com um computador no qual os processos estão em execução. Esse computador pode ser o computador local ou um computador remoto (que possivelmente pode estar executando um sistema operacional não baseado no Windows; consulte Portas para obter mais informações).
Uma porta é representada pela interface IDebugPort2 . Ele é usado para obter informações sobre processos em execução no computador ao qual a porta está conectada.
Um motor de depuração precisa de acesso a uma porta para registrar nós do programa na porta e atender às solicitações de informações do processo. Por exemplo, se o mecanismo de depuração implementar a interface IDebugProgramProvider2 , a implementação do método GetProviderProcessData poderá solicitar à porta que as informações de processo necessárias sejam retornadas.
O Visual Studio fornece a porta necessária para o mecanismo de depuração e obtém essa porta de um fornecedor de porta. Se um programa estiver anexado (seja de dentro do depurador ou devido a uma exceção ter sido lançada, o que dispara a caixa de diálogo Just-in-Time [JIT]), o usuário recebe a opção de escolher o transporte (uma outra denominação para fornecedor de porta) a ser utilizado. Caso contrário, se o usuário iniciar o programa de dentro do depurador, o sistema de projeto especifica o fornecedor de porta a ser usado. Em qualquer caso, o Visual Studio instancia o fornecedor de porta, que é representado por uma interface IDebugPortSupplier2, e solicita uma nova porta chamando AddPort com uma interface IDebugPortRequest2. Essa porta é então passada para o mecanismo de depuração de uma forma ou de outra.
Example
Este fragmento de código mostra como usar a porta fornecida para LaunchSuspended para registrar um nó de programa no ResumeProcess. Parâmetros não diretamente relacionados a esse conceito foram omitidos para maior clareza.
Observação
Este exemplo usa a porta para iniciar e retomar o processo e pressupõe que a interface IDebugPortEx2 seja implementada na porta. De forma alguma, essa é a única maneira de executar essas tarefas, e é possível que a porta não esteja envolvida, a não ser para ter o IDebugProgramNode2 do programa dado a ela.
// 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);
}