Отладка приложений

Применение TraceSrv


Работать с программой TraceSrv довольно легко. Код на сопровождающем компакт-диске вызывает TraceSrv из программ, написанных на трех различных языках. В листинге 11-4 приведен пример вызова TraceSrv из программы на VBScript, который показывает, насколько легко использовать TraceSrv. Пример на C++ более интересен в том отношении, что прежде чем обращаться к TraceSrv, нужно конвертировать строки трассы в строки типа BSTR. Программа DCOMTEST.CPP показана в листинге 11-5.

RFC — Remote Procedure Call, удаленный вызов процедуры (средство передачи сообщений, которое позволяет распределенному приложению вызывать сервис различных компьютеров в сети; обеспечивает процедурно-ориентированный подход в работе с сетью; применяется в распределенных объектных технологиях, таких как DCOM, CORBA, Java RMI. — Пер

 Листинг 11-4. Вызов TraceSrv из VBScript 

<SCRIPT LANGUAGE="VBScript"><!- -

Dim g_TraceObj


set g_TraceObj = CreateObject ( "TraceSrv.Trace.1" )

g_TraceObj.Trace( "This is a test of the...?" + vbCRLF )

Sub ButtonOne_OnClick

g_TraceObj.Trace ( "Hey! I'm Button One!" + vbCRLF )

 End Sub 

Sub ButtonTwo__OnClick

g_TraceObj.Trace ( "VBScript is dangerous!" + vbCRLF )

 End Sub

 - -></SCRIPT>

Листинг 11-5. Вызов TraceSrv из программы на C++ (DCOMtESf .СРР)

void main ( void ) 

{

HRESULT hr ;

ITrace * IpTrace ;

lUnknown * IpUnknown ;

// Инициализировать библиотеки СОМ+.

hr = CoInitializeEx ( NULL , COINIT_APARTMENTTHREADED ) ;

if ( FAILED ( hr ) )

{

printf ( "Unable to initialize COM+\n" ) ; 

return ; 

}

hr = CoCreatelnstance ( CLSIDJTrace ,

NULL , CLSCTX_SERVER , IID_IUnknown , (LPVOID*)SlpUnknown } ;

 if ( FAILED ( hr ) ) 

{

LPVOID IpMsgBuf;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |

 FORMAT_MESSAGE__FROM_SYSTEM |

  FORMAT_MESSAGE_IGNORE__INSERTS, 

NULL,

  hr,

MAKELANGID ( LANG_NEUTRAL, SUBLANG__DEFAULT ), 


(LPTSTR) SlpMsgBuf, 

0,

NULL ) ;

printf ( " CoCreatelnstanceEx failed: Ox%08X\n" , hr ) ;

 printf ( "FormatMessage returned: %s\n" , IpMsgBuf ) ;

 return ; 

}

 hr = lpUnknown->Query!nterface ( IID_ITrace ,

(LPVOID*)&lpTrace ) ; 

lpUnknown->Release ( ) ;

 if ( FAILED ( hr } )

 {

LPVOID IpMsgBuf;

FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |

 FORMAT_MESSAGE_FROM_SYSTEM |

  FORMAT_MESSAGE_IGNORE_INSERTS, NULL,

hr,

MAKELANGID ( LANG_NEUTRAL, SUBLANG_DEFAULT ),

 (LPTSTR) SlpMsgBuf, 0,

NULL );

printf ( "Querylnterface failed: Ox%08X\n" , hr ) ; 

printf { "FormatMessage returned: %s\n" , IpMsgBuf ) ;

 return ; 

}

OLECHAR * pszTemp ;

pszTemp = SysAllocString ( OLESTR ( "Hello from a C++ program!!!" ) ); ,

 lpTrace->Trace ( pszTemp ) ; 

SysFreeString ( pszTemp ) ;

 lpTrace->Release ( ) ;

 CoUninitialize ( ) ; 

}



Содержание раздела