Condividi tramite


ottenere una porta

Una porta rappresenta una connessione a un computer in cui i processi in esecuzione. Il computer può essere il computer locale o un computer remoto (in grado di eseguire anche in un sistema operativo basa non Finestra; vedere porte per ulteriori informazioni.

Una porta è rappresentata IDebugPort2 dall'interfaccia. Viene utilizzata per ottenere informazioni sui processi in esecuzione sul computer che la porta è connessa a.

Un motore di debug è necessario accedere a una porta per registrare i nodi di programma con la porta e soddisfare le richieste di informazioni del processo. Ad esempio, se il motore di debug implementa IDebugProgramProvider2 l'interfaccia, l'implementazione del IDebugProgramProvider2:: GetProviderProcessData metodo potrebbe chiedere alla porta le informazioni del processo necessari di essere restituito.

Visual Studio fornisce la porta necessaria al motore di debug e ottiene questa porta da un fornitore di porte. Se un programma è associato (dal debugger o a causa di un'eccezione è stato generato, che genera la finestra di dialogo JIT (just-in-time) []), l'utente viene fornito la scelta di trasporto (un altro nome per un fornitore di porte) da utilizzare. In caso contrario, se l'utente vara il programma nel debugger, il sistema del progetto specifica il fornitore di porte da utilizzare. In qualsiasi evento, Visual Studio crea un'istanza del fornitore di porte, rappresentato IDebugPortSupplier2 da un'interfaccia e richiede una nuova porta chiamando IDebugPortSupplier2:: AddPort con IDebugPortRequest2 un'interfaccia. Questa porta viene quindi passata al motore di debug in un form o in.

Esempio

In questo frammento di codice seguente viene illustrato come utilizzare la porta forniti IDebugEngineLaunch2:: LaunchSuspended per registrare un nodo di programma in IDebugEngineLaunch2:: ResumeProcess. I parametri non direttamente correlati a questo concetto sono stati omessi per maggiore chiarezza.

Nota

In questo esempio viene utilizzata la porta per avviare e riprendere il processo e presuppone che IDebugPortEx2 l'interfaccia viene implementata la porta.Si tratta in nessun caso l'unica modalità per eseguire queste attività ed è possibile che la porta può non essere implicitamente da disporre del IDebugProgramNode2 programma di fornita da.

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

Vedere anche

Concetti

registrare il programma

fornitori di porte

porte

Altre risorse

Impostazione di un programma da sottoporre a debug