다음을 통해 공유


IDebugBreakpointRequest2::GetRequestInfo

Gets the breakpoint request information that describes this breakpoint request.

HRESULT GetRequestInfo( 
   BPREQI_FIELDS    dwFields,
   BP_REQUEST_INFO* pBPRequestInfo
);
int GetRequestInfo( 
   eunm_BPREQI_FIELDS  dwFields,
   BP_REQUEST_INFO[]   pBPRequestInfo
);

Parameters

  • dwFields
    [in] A combination of flags from the BPREQI_FIELDS enumeration that determines which fields in the pBPRequestInfo parameter are to be filled out.

  • pBPRequestInfo
    [out] Specifies the BP_REQUEST_INFO structure to be filled in with the description of the breakpoint request.

Return Value

If successful, returns S_OK; otherwise, returns an error code.

Example

The following example shows how to implement this method for a simple CDebugBreakpointRequest object that exposes the IDebugBreakpointRequest2 interface.

HRESULT CDebugBreakpointRequest::GetRequestInfo(
   BPREQI_FIELDS    dwFields,
   BP_REQUEST_INFO* pBPRequestInfo)  
{  
   HRESULT hr;  
  
   if (pBPRequestInfo)  
   {  
      // Copy the specified fields of the request info from the class
      // member variable to the local BP_REQUEST_INFO variable.  
      hr = CopyBP_REQUEST_INFO(m_bpRequestInfo,
                               *pBPRequestInfo, dwFields);  
   }  
   else  
   {  
      hr = E_INVALIDARG;  
   }  
  
   return hr;  
}  
  
HRESULT CDebugBreakpointRequest::CopyBP_REQUEST_INFO(
   BP_REQUEST_INFO& bpReqSrc,
   BP_REQUEST_INFO& bpReqDest,
   DWORD dwFields)  
{  
   HRESULT hr = S_OK;  
  
   // Start with a raw copy.  
   memcpy(&bpReqDest, &bpReqSrc, sizeof (BP_REQUEST_INFO));  
  
   // The fields in the destination are the result of the AND of
   // bpReqSrc.dwFields and dwFields.  
   bpReqDest.dwFields = dwFields & bpReqSrc.dwFields;  
  
   // Fill in the bp location information if the BPREQI_BPLOCATION flag is
   // set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_BPLOCATION))  
   {  
      // Switch based on the BP_LOCATION_TYPE.    
      switch (bpReqSrc.bpLocation.bpLocationType)  
      {  
         case BPLT_CODE_FILE_LINE:  
         {  
            // Copy the bstrContext and AddRef the IDebugDocumentPosition2
            // of the BP_LOCATION_CODE_FILE_LINE structure.  
            bpReqDest.bpLocation.bpLocation.bplocCodeFileLine.bstrContext =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeFileLine.bstrContext);  
            bpReqDest.bpLocation.bpLocation.bplocCodeFileLine.pDocPos->AddRef();  
            break;  
         }  
         case BPLT_CODE_FUNC_OFFSET:  
         {  
            // Copy the bstrContext and AddRef the IDebugFunctionPosition2
            // of the BP_LOCATION_CODE_FUNC_OFFSET structure.  
            bpReqDest.bpLocation.bpLocation.bplocCodeFuncOffset.bstrContext =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeFuncOffset.bstrContext);  
            bpReqDest.bpLocation.bpLocation.bplocCodeFuncOffset.pFuncPos->AddRef();  
            break;  
         }  
         case BPLT_CODE_CONTEXT:  
         {  
            // AddRef the IDebugCodeContext2 of the BP_LOCATION_CODE_CONTEXT
            // structure.  
            bpReqDest.bpLocation.bpLocation.bplocCodeContext.pCodeContext->AddRef();  
            break;  
         }  
         case BPLT_CODE_STRING:  
         {  
            // Copy the bstrContext and bstrCodeExpr of the BP_LOCATION_CODE_STRING
            // structure.  
            bpReqDest.bpLocation.bpLocation.bplocCodeString.bstrContext =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeString.bstrContext);  
            bpReqDest.bpLocation.bpLocation.bplocCodeString.bstrCodeExpr =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeString.bstrCodeExpr);  
            break;  
         }  
         case BPLT_CODE_ADDRESS:  
         {  
            // Copy the bstrContext, bstrModuleUrl, bstrFunction, and bstrAddress
            // of the BP_LOCATION_CODE_ADDRESS structure.  
            bpReqDest.bpLocation.bpLocation.bplocCodeAddress.bstrContext =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeAddress.bstrContext);  
            bpReqDest.bpLocation.bpLocation.bplocCodeAddress.bstrModuleUrl =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeAddress.bstrModuleUrl);  
            bpReqDest.bpLocation.bpLocation.bplocCodeAddress.bstrFunction =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeAddress.bstrFunction);  
            bpReqDest.bpLocation.bpLocation.bplocCodeAddress.bstrAddress =
               SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocCodeAddress.bstrAddress);  
            break;  
         }  
         case BPLT_DATA_STRING:  
         {  
            // Conditional AddRef of the IDebugThread2 of the BP_LOCATION_DATA_STRING
            // structure.  
            if (bpReqDest.bpLocation.bpLocation.bplocDataString.pThread)  
            {  
               bpReqDest.bpLocation.bpLocation.bplocDataString.pThread->AddRef();  
            }  
            // Copy the bstrContext and bstrDataExpr of the BP_LOCATION_DATA_STRING
            // structure.  
            bpReqDest.bpLocation.bpLocation.bplocDataString.bstrContext =
                  SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocDataString.bstrContext);  
            bpReqDest.bpLocation.bpLocation.bplocDataString.bstrDataExpr =
                  SysAllocString(bpReqSrc.bpLocation.bpLocation.bplocDataString.bstrDataExpr);  
            break;  
         }  
         case BPLT_RESOLUTION:  
         {  
            // AddRef of the IDebugBreakpointResolution2 of the BP_LOCATION_RESOLUTION
            // structure.  
            bpReqDest.bpLocation.bpLocation.bplocResolution.pResolution->AddRef();  
            break;  
         }  
         default:  
         {  
            assert(FALSE);  
            // Clear the BPREQI_BPLOCATION flag in the BPREQI_FIELDS of the
            // destination BP_REQUEST_INFO.  
            ClearFlag(bpReqDest.dwFields, BPREQI_BPLOCATION);  
            break;  
         }  
      }  
   }  
   // AddRef the IDebugProgram2 if the BPREQI_PROGRAM flag is set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_PROGRAM))  
   {  
      bpReqDest.pProgram->AddRef();  
   }   
   // Copy the bstrProgramName if the BPREQI_PROGRAMNAME flag is set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_PROGRAMNAME))  
   {  
      bpReqDest.bstrProgramName = SysAllocString(bpReqSrc.bstrProgramName);  
   }  
   // AddRef the IDebugThread2 if the BPREQI_THREAD flag is set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_THREAD))  
   {  
      bpReqDest.pThread->AddRef();  
   }  
   // Copy the bstrThreadName if the BPREQI_THREADNAME flag is set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_THREADNAME))  
   {  
      bpReqDest.bstrThreadName = SysAllocString(bpReqSrc.bstrThreadName);  
   }  
   // Check to see if the BPREQI_CONDITION flag is set in BPREQI_FIELDS.  
   if (IsFlagSet(bpReqDest.dwFields, BPREQI_CONDITION))  
   {  
      // Conditional AddRef of the IDebugThread2 of the BP_CONDITION structure.  
      if (bpReqDest.bpCondition.pThread)  
      {  
         bpReqDest.bpCondition.pThread->AddRef();  
      }  
      // Copy the bstrContext and bstrCondition of the BP_CONDITION structure.  
      bpReqDest.bpCondition.bstrContext = SysAllocString(bpReqSrc.bpCondition.bstrContext);  
      bpReqDest.bpCondition.bstrCondition = SysAllocString(bpReqSrc.bpCondition.bstrCondition);  
   }  
  
   return hr;  
}  

See Also

Reference

IDebugBreakpointRequest2

BPREQI_FIELDS

BP_REQUEST_INFO