Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Port stellt eine Verbindung mit einem Computer dar, auf dem Prozesse ausgeführt werden. Dieser Computer könnte der lokale Computer oder ein Remotecomputer sein (bei dem möglicherweise ein nicht windowsbasiertes Betriebssystem ausgeführt wird; weitere Informationen finden Sie unter Ports ).
Ein Port wird durch die IDebugPort2-Schnittstelle dargestellt. Es wird verwendet, um Informationen zu Prozessen abzurufen, die auf dem Computer ausgeführt werden, mit dem der Port verbunden ist.
Ein Debugmodul benötigt Zugriff auf einen Port, um Programmknoten beim Port zu registrieren und Anforderungen für Prozessinformationen zu erfüllen. Wenn das Debugmodul beispielsweise die IDebugProgramProvider2-Schnittstelle implementiert, könnte die Implementierung für die GetProviderProcessData-Methode den Port nach den erforderlichen Prozessinformationen bitten, die zurückgegeben werden sollen.
Visual Studio stellt den erforderlichen Port zum Debugmodul bereit und ruft diesen Port von einem Portlieferanten ab. Wenn ein Programm angehängt wird (entweder innerhalb des Debuggers oder weil eine Ausnahme ausgelöst wurde, die das Just-in-Time [JIT] Dialogfeld aufruft), erhält der Benutzer die Wahl des Transports (eine andere Bezeichnung für einen Portanbieter). Andernfalls gibt das Projektsystem den zu verwendenden Portzulieferer an, wenn der Benutzer das Programm aus dem Debugger startet. In beiden Ereignissen instanziiert Visual Studio den Portanbieter, dargestellt durch eine IDebugPortSupplier2-Schnittstelle , und fordert einen neuen Port auf, indem AddPort mit einer IDebugPortRequest2-Schnittstelle aufgerufen wird. Dieser Port wird dann auf die eine oder andere Weise an die Debug-Engine übergeben.
Example
Dieses Codefragment zeigt, wie der Port, der für LaunchSuspended bereitgestellt wird, verwendet wird, um einen Programmknoten in ResumeProcess zu registrieren. Parameter, die sich nicht direkt auf dieses Konzept beziehen, wurden aus Gründen der Klarheit weggelassen.
Hinweis
In diesem Beispiel wird der Port zum Starten und Fortsetzen des Prozesses verwendet und davon ausgegangen, dass die IDebugPortEx2-Schnittstelle auf dem Port implementiert ist. Dies ist auf keinen Fall die einzige Möglichkeit, diese Aufgaben auszuführen, und es kann sein, dass der Port möglicherweise nicht einmal beteiligt ist, außer dass ihm das IDebugProgramNode2 des Programms übergeben wird.
// 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);
}