Partilhar via


Obtendo uma porta

Uma porta representa uma conexão a uma máquina em que processos estão em execução. Nessa máquina poderia ser a máquina local ou em um computador remoto (o que possivelmente poderia estar executando um sistema operacional que não sejam baseados em Windows; consulte Portas para obter mais informações).

Uma porta é representada pela IDebugPort2 interface. Ele é usado para obter informações sobre processos em execução na máquina a que a porta é conectada.

Um mecanismo de depuração precisa acessar uma porta para registrar nós do programa com a porta e atendendo às solicitações de informações do processo. Por exemplo, se o mecanismo de depuração implementa o IDebugProgramProvider2 de interface, a implementação para o IDebugProgramProvider2::GetProviderProcessData método poderia perguntar a porta para as informações de processo necessárias a serem retornados.

Visual Studio fornece a porta necessária para o mecanismo de depuração e, em seguida, ele obtém essa porta de um fornecedor de porta. Se um programa está associado (com o depurador ou por causa de uma exceção foi lançada, que aciona a caixa de diálogo [JIT] Just-in-Time), o usuário terá a opção de transporte (outro nome para um fornecedor de porta) para usar. Caso contrário, se o usuário inicia o programa a partir do depurador, o sistema do projeto Especifica o fornecedor de porta deve usar. Em ambos os casos, o Visual Studio instancia o fornecedor de porta, representado por um IDebugPortSupplier2 interface e solicita uma nova porta chamando IDebugPortSupplier2::AddPort com um IDebugPortRequest2 interface. Esta porta é então transmitida para o mecanismo de depuração em um formulário ou para outra.

Exemplo

Este fragmento de código mostra como usar a porta fornecida ao IDebugEngineLaunch2::LaunchSuspended para registrar um nó de programa na IDebugEngineLaunch2::ResumeProcess. Parâmetros não diretamente relacionados a esse conceito foram omitidos por motivos de clareza.

Dica

Este exemplo usa a porta para iniciar e continuar o processo e pressupõe que o IDebugPortEx2 interface é implementada na porta.Isso não é a única maneira de executar essas tarefas, e é possível que a porta pode não ainda estar envolvida diferente de ter o programa IDebugProgramNode2 fornecido a ele.

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

Consulte também

Conceitos

Registrando o programa

Fornecedores de porta

Portas

Outros recursos

A ativação de um programa a ser depurado.