You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
2.9 KiB
133 lines
2.9 KiB
/*++
|
|
|
|
Copyright (C) 1997-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
TRACE.CPP
|
|
|
|
Abstract:
|
|
|
|
Support of trace output and internationalized strings.
|
|
|
|
History:
|
|
|
|
a-davj 13-July-97 Created.
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <wbemcli.h>
|
|
#include "trace.h"
|
|
#include <autoptr.h>
|
|
|
|
extern HINSTANCE ghModule;
|
|
|
|
|
|
TCHAR JustInCase = 0;
|
|
|
|
BSTR GetFromStdErrorFacility(HRESULT hres)
|
|
{
|
|
|
|
HRESULT hTemp = hres;
|
|
|
|
// Certain strings are obtained from the standard facility rather
|
|
// than the local string table.
|
|
|
|
if(hres == WBEM_E_NOT_FOUND || hres == WBEM_E_TYPE_MISMATCH || hres == WBEM_E_OVERRIDE_NOT_ALLOWED ||
|
|
hres == WBEM_E_PROPAGATED_QUALIFIER || hres == WBEM_E_VALUE_OUT_OF_RANGE)
|
|
return NULL;
|
|
|
|
// we are only interested in 0x8004xxxx values.
|
|
|
|
hTemp &= 0xffff0000;
|
|
if(hTemp != 0x80040000)
|
|
return NULL;
|
|
|
|
// attempt to read the string from the usual place
|
|
IWbemStatusCodeText * pStatus = NULL;
|
|
SCODE sc = CoCreateInstance(CLSID_WbemStatusCodeText, 0, CLSCTX_INPROC_SERVER,
|
|
IID_IWbemStatusCodeText, (LPVOID *) &pStatus);
|
|
|
|
if(FAILED(sc))
|
|
return NULL;
|
|
BSTR bstrError = 0;
|
|
sc = pStatus->GetErrorCodeText(hres, 0, 0, &bstrError);
|
|
pStatus->Release();
|
|
if(sc == S_OK)
|
|
return bstrError;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
IntString::IntString(DWORD dwID)
|
|
{
|
|
DWORD dwSize, dwRet, dwLen = 0;
|
|
|
|
// see if the message can be obtained for the standard place
|
|
|
|
BSTR bstrErrMsg = GetFromStdErrorFacility((HRESULT)dwID);
|
|
if(bstrErrMsg)
|
|
{
|
|
dwLen = lstrlen(bstrErrMsg)+1;
|
|
m_pString = new TCHAR[dwLen];
|
|
if(m_pString == NULL)
|
|
{
|
|
SysFreeString(bstrErrMsg);
|
|
m_pString = &JustInCase; // should never happen!
|
|
return;
|
|
}
|
|
StringCchCopyW(m_pString, dwLen, bstrErrMsg);
|
|
SysFreeString(bstrErrMsg);
|
|
return;
|
|
}
|
|
|
|
// Get the message from the string table.
|
|
|
|
m_pString = &JustInCase;
|
|
for(dwSize = 128; dwSize < 4096; dwSize *= 2)
|
|
{
|
|
|
|
wmilib::auto_buffer<TCHAR> p(new TCHAR[dwSize]);
|
|
if(NULL == p.get())
|
|
{
|
|
return;
|
|
}
|
|
dwRet = LoadString( ghModule, dwID, p.get(), dwSize);
|
|
|
|
// Check for failure to load
|
|
|
|
if(dwRet == 0)
|
|
{
|
|
return;
|
|
}
|
|
// Check for the case where the buffer was too small
|
|
|
|
if((dwRet + 1) >= dwSize)
|
|
{
|
|
//overrun, just loop
|
|
}
|
|
else
|
|
{
|
|
m_pString = p.release();
|
|
return; // all is well!
|
|
}
|
|
}
|
|
}
|
|
|
|
IntString::~IntString()
|
|
{
|
|
if(m_pString != &JustInCase)
|
|
delete(m_pString);
|
|
}
|
|
|
|
void CopyOrConvert(TCHAR * pTo, WCHAR * pFrom, int iLen)
|
|
{
|
|
#ifdef UNICODE
|
|
wcsncpy(pTo, pFrom,iLen);
|
|
#else
|
|
wcstombs(pTo, pFrom, iLen);
|
|
#endif
|
|
pTo[iLen-1] = 0;
|
|
return;
|
|
}
|