Share via


Obtenir un port

Un port représente une connexion à un ordinateur sur lequel les processus sont en cours d’exécution. Cet ordinateur peut être l’ordinateur local ou un ordinateur distant (qui peut éventuellement exécuter un système d’exploitation non Windows ; consultez Ports pour plus d’informations).

Un port est représenté par l’interface IDebugPort2 . Il est utilisé pour obtenir des informations sur les processus en cours d’exécution sur la machine à laquelle le port est connecté.

Un moteur de débogage a besoin d’accéder à un port pour inscrire des nœuds de programme auprès du port et répondre aux demandes d’informations sur le processus. Par exemple, si le moteur de débogage implémente l’interface IDebugProgramProvider2 , l’implémentation de la méthode GetProviderProcessData peut demander au port que les informations de processus nécessaires soient retournées.

Visual Studio fournit le port nécessaire au moteur de débogage et obtient ce port auprès d’un fournisseur de ports. Si un programme est attaché à (à partir du débogueur ou en raison d’une exception levée, ce qui déclenche la boîte de dialogue Juste-à-temps [JIT], l’utilisateur reçoit le choix de transport (un autre nom pour un fournisseur de ports) à utiliser. Sinon, si l’utilisateur lance le programme à partir du débogueur, le système de projet spécifie le fournisseur de ports à utiliser. Dans les deux cas, Visual Studio instancie le fournisseur de ports, représenté par une interface IDebugPortSupplier2 et demande un nouveau port en appelant AddPort avec une interface IDebugPortRequest2. Ce port est ensuite transmis au moteur de débogage dans un formulaire ou un autre.

Exemple

Ce fragment de code montre comment utiliser le port fourni à LaunchSuspended pour inscrire un nœud de programme dans ResumeProcess. Les paramètres qui ne sont pas directement liés à ce concept ont été omis pour plus de clarté.

Remarque

Cet exemple utilise le port pour lancer et reprendre le processus et suppose que l’interface IDebugPortEx2 est implémentée sur le port. Cela n’est pas la seule façon d’effectuer ces tâches, et il est possible que le port ne soit même pas impliqué autre que le fait que le programme IDebugProgramNode2 lui soit donné.

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