#include #include #include #include BOOL MarshalTest( IWmiObjectMarshal* pMrsh, IWmiObjectMarshal* pUnmrsh, IWbemClassObject* pObj, DWORD dwFlags ) { HRESULT hr; // // pack original object into buffer // ULONG cLen; hr = pMrsh->Pack( pObj, NULL, dwFlags, 0, NULL, &cLen ); if ( FAILED(hr) && hr != WBEM_E_BUFFER_TOO_SMALL ) { return FALSE; } PBYTE pBuff = new BYTE[cLen]; if ( pBuff == NULL ) { return FALSE; } ULONG cUsed; hr = pMrsh->Pack( pObj, NULL, dwFlags, cLen, pBuff, &cUsed ); if ( FAILED(hr) ) { delete [] pBuff; return FALSE; } ULONG cPacked = cUsed; // // unpack buffer into new object // CWbemPtr pNewObj; hr = pUnmrsh->Unpack( cLen, pBuff, dwFlags, &pNewObj, &cUsed ); // delete [] pBuff; if ( FAILED(hr) || cUsed != cPacked ) { return FALSE; } // // compare original and new objects // hr = pNewObj->CompareTo( WBEM_FLAG_IGNORE_OBJECT_SOURCE, pObj ); if ( hr != WBEM_S_SAME ) { return FALSE; } delete [] pBuff; return TRUE; } int TestMain() { HRESULT hr; CWbemPtr pLocator; hr = CoCreateInstance( CLSID_WbemLocator, NULL, CLSCTX_SERVER, IID_IWbemLocator, (void**)&pLocator ); if ( FAILED(hr) ) { printf("ERROR CoCIing WbemLocator : hr = 0x%x\n",hr); return 1; } CWbemPtr pSvc; hr = pLocator->ConnectServer( L"root\\default", NULL, NULL, NULL, 0, NULL, NULL, &pSvc ); if ( FAILED(hr) ) { wprintf( L"ERROR Connecting to root\\default namespace : hr=0x%x\n",hr); return 1; } CWbemPtr pClass; hr = pSvc->GetObject( CWbemBSTR(L"TestMarshalClass"), 0, NULL, &pClass, NULL ); if ( FAILED(hr) ) { printf( "Failed getting test marshal class : hr=0x%x\n", hr ); return 1; } CWbemPtr pObj; hr = pSvc->GetObject( CWbemBSTR(L"TestMarshalClass='BasicObject'"), 0, NULL, &pObj, NULL ); if ( FAILED(hr) ) { printf( "Failed getting test marshal object : hr=0x%x\n", hr ); return 1; } CWbemPtr pMrsh, pUnmrsh; hr = CoCreateInstance( CLSID_WmiSmartObjectMarshal, NULL, CLSCTX_INPROC, IID_IWmiObjectMarshal, (void**)&pMrsh ); hr = CoCreateInstance( CLSID_WmiSmartObjectUnmarshal, NULL, CLSCTX_INPROC, IID_IWmiObjectMarshal, (void**)&pUnmrsh ); if ( FAILED(hr) ) { printf("Failed CoCIing WmiSmartObjectMarshal. HR = 0x%x\n", hr); return 1; } if ( MarshalTest( pMrsh, pUnmrsh, pClass, WMIMSG_FLAG_MRSH_FULL ) ) { printf( "Successful Marshal Test w/ Class Object and FULL Flag\n" ); } else { printf( "Failed Marshal Test w/ Class Object and FULL Flag\n" ); } if ( MarshalTest( pMrsh, pUnmrsh, pObj, WMIMSG_FLAG_MRSH_FULL ) ) { printf( "Successful Marshal Test w/ Instance and FULL Flag\n" ); } else { printf( "Failed Marshal Test w/ Instance and FULL Flag\n" ); } if ( MarshalTest( pMrsh, pUnmrsh, pObj, WMIMSG_FLAG_MRSH_PARTIAL ) ) { printf( "Successful Marshal Test w/ Instance and PARTIAL Flag\n" ); } else { printf( "Failed Marshal Test w/ Instance and PARTIAL Flag\n" ); } if ( MarshalTest( pMrsh, pUnmrsh, pObj, WMIMSG_FLAG_MRSH_PARTIAL ) ) { printf( "Successful Repeated Marshal Test w/ Instance and PARTIAL Flag\n" ); } else { printf( "Failed Repeated Marshal Test w/ Instance and PARTIAL Flag\n" ); } if ( MarshalTest( pMrsh, pUnmrsh, pObj, WMIMSG_FLAG_MRSH_FULL_ONCE ) ) { printf( "Successful Marshal Test w/ Instance and FULL_ONCE Flag\n" ); } else { printf( "Failed Marshal Test w/ Instance and FULL_ONCE Flag\n" ); } if ( MarshalTest( pMrsh, pUnmrsh, pObj, WMIMSG_FLAG_MRSH_FULL_ONCE ) ) { printf( "Successful Repeated Marshal Test w/ Instance and FULL_ONCE Flag\n" ); } else { printf( "Failed Repeated Marshal Test w/ Instance and FULL_ONCE Flag\n" ); } return 0; } extern "C" int __cdecl wmain( int argc, WCHAR** argv ) { CoInitialize( NULL ); TestMain(); CoUninitialize(); }