IDebugPendingBreakpoint2:: CanBind
Determina se questo punto di interruzione corrente può essere associato a un percorso di codice.
HRESULT CanBind (
IEnumDebugErrorBreakpoints2** ppErrorEnum
);
int CanBind (
out IEnumDebugErrorBreakpoints2 ppErrorEnum
);
Parametri
- ppErrorEnum
[out] Restituisce IEnumDebugErrorBreakpoints2 un oggetto che contiene un elenco IDebugErrorBreakpoint2 di oggetti se vi possano essere errori.
Valore restituito
Se l'operazione riesce, il S_OK.restituisce S_FALSE se il punto di interruzione non può essere associato, nel qual caso di errore restituiti dal parametro di ppErrorEnum . In caso contrario, restituisce un codice di errore. Restituisce E_BP_DELETED se il punto di interruzione è stato eliminato.
Note
Questo metodo viene chiamato per determinare che si verificherebbe se questo punto di interruzione corrente è stato associato. Effettivamente IDebugPendingBreakpoint2:: associazione chiamato il metodo per associare il punto di interruzione in attesa.
Esempio
Nell'esempio seguente viene illustrato come implementare questo metodo per un oggetto semplice di CPendingBreakpoint che espone IDebugPendingBreakpoint2 l'interfaccia.
HRESULT CPendingBreakpoint::CanBind(IEnumDebugErrorBreakpoints2** ppErrorEnum)
{
HRESULT hr;
HRESULT hrT;
// Check for a valid pointer to an error breakpoint enumerator
// interface; otherwise, return hr = E_INVALIDARG.
if (ppErrorEnum)
{
// Verify that the pending breakpoint has not been deleted. If
// deleted, then return hr = E_BP_DELETED.
if (m_state.state != PBPS_DELETED)
{
// Verify that the breakpoint is a file/line breakpoint.
if (IsFlagSet(m_pBPRequest->m_bpRequestInfo.dwFields, BPREQI_BPLOCATION) &&
m_pBPRequest->m_bpRequestInfo.bpLocation.bpLocationType == BPLT_CODE_FILE_LINE)
{
hr = S_OK;
}
// If the breakpoint type is not a file/line breakpoint, then the
// result should be an error breakpoint.
else
{
// If the error breakpoint member variable does not have
// allocated memory.
if (!m_pErrorBP)
{
// Create, AddRef, and initialize a CErrorBreakpoint object.
if (CComObject<CErrorBreakpoint>::CreateInstance(&m_pErrorBP) == S_OK)
{
m_pErrorBP->AddRef();
m_pErrorBP->Initialize(this);
}
}
// Create a new enumerator of error breakpoints.
CComObject<CEnumDebugErrorBreakpoints>* pErrorEnum;
if (CComObject<CEnumDebugErrorBreakpoints>::CreateInstance(&pErrorEnum) == S_OK)
{
// Get the IDebugErrorBreakpoint2 information for the
// CErrorBreakpoint object.
CComPtr<IDebugErrorBreakpoint2> spErrorBP;
hrT = m_pErrorBP->QueryInterface(&spErrorBP);
assert(hrT == S_OK);
if (hrT == S_OK)
{
// Initialize the new enumerator of error breakpoints
// with the IDebugErrorBreakpoint2 information.
IDebugErrorBreakpoint2* rgpErrorBP[] = { spErrorBP.p };
hrT = pErrorEnum->Init(rgpErrorBP, &(rgpErrorBP[1]), NULL, AtlFlagCopy);
if (hrT == S_OK)
{
// Verify that the passed IEnumDebugErrorBreakpoints2
// interface can be successful queried by the
// created CEnumDebugErrorBreakpoints object.
hrT = pErrorEnum->QueryInterface(ppErrorEnum);
assert(hrT == S_OK);
}
}
// Otherwise, delete the CEnumDebugErrorBreakpoints object.
if (FAILED(hrT))
{
delete pErrorEnum;
}
}
hr = S_FALSE;
}
}
else
{
hr = E_BP_DELETED;
}
}
else
{
hr = E_INVALIDARG;
}
return hr;
}