Применение 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 ( ) ;
}