#include #include #include #include "stdio.h" LPWSTR g_wszQueue; DWORD g_dwNumQueues = 1; DWORD g_dwQuota = 0xffffffff; DWORD g_dwQos = WMIMSG_FLAG_QOS_EXPRESS; BOOL g_bAuth = FALSE; BOOL g_bDestroy = FALSE; BOOL g_bCreate = FALSE; BOOL g_bVerbose = FALSE; GUID g_guidType = { 0x5b6ef4a4, 0x931, 0x46a4, {0xa5,0xa9,0x8e,0x4,0xfc,0xcd,0xb0,0xd5} }; BOOL ParseArg( LPWSTR wszArg ) { WCHAR* pCurr = wszArg; if ( *pCurr != '/' && *pCurr != '-' ) { g_wszQueue = pCurr; return TRUE; } pCurr++; // remove the / or - if ( wbem_wcsicmp( pCurr, L"auth" ) == 0 ) { g_bAuth = TRUE; } else if ( wbem_wcsicmp( pCurr, L"create" ) == 0 ) { g_bCreate = TRUE; } else if ( wbem_wcsicmp( pCurr, L"destroy" ) == 0 ) { g_bDestroy = TRUE; } else if ( wbem_wcsicmp( pCurr, L"txn" ) == 0 ) { g_dwQos = WMIMSG_FLAG_QOS_XACT; } else if ( wbem_wcsicmp( pCurr, L"express" ) == 0 ) { g_dwQos = WMIMSG_FLAG_QOS_EXPRESS; } else if ( wbem_wcsicmp( pCurr, L"guaranteed" ) == 0 ) { g_dwQos = WMIMSG_FLAG_QOS_GUARANTEED; } else if ( wbem_wcsicmp( pCurr, L"verbose") == 0 ) { g_bVerbose = TRUE; } else if ( wbem_wcsnicmp( pCurr, L"quota", 5 ) == 0 ) { pCurr += 5; if ( *pCurr++ != ':' ) { return FALSE; } g_dwQuota = _wtol( pCurr ); } else if ( wbem_wcsnicmp( pCurr, L"numqueues", 9 ) == 0 ) { pCurr += 9; if ( *pCurr++ != ':' ) { return FALSE; } g_dwNumQueues = _wtol( pCurr ); } else if ( wbem_wcsnicmp( pCurr, L"type", 4 ) == 0 ) { pCurr += 4; if ( *pCurr++ != ':' ) { return FALSE; } if ( FAILED( CLSIDFromString( pCurr, &g_guidType ) ) ) { return FALSE; } } else { return FALSE; } return TRUE; } BOOL ParseArgs( int nArgs, LPWSTR* awszArgs ) { if ( nArgs < 1 ) { return FALSE; } for( int i=1; i < nArgs; i++ ) { if ( !ParseArg( awszArgs[i] ) ) { return FALSE; } } if ( (g_bCreate || g_bDestroy) && g_wszQueue == NULL ) { return FALSE; } return TRUE; } int TestMain() { HRESULT hr; CWbemPtr pQueueMgr; hr = CoCreateInstance( CLSID_WmiMessageQueueManager, NULL, CLSCTX_INPROC, IID_IWmiMessageQueueManager, (void**)&pQueueMgr ); if ( FAILED(hr) ) { printf( "Failed Obtaining Queue Object. HR = 0x%x\n", hr ); return 1; } WCHAR awchQueue[256]; SYSTEMTIME Start, End; GetSystemTime( &Start ); if ( g_bCreate ) { wcscpy( awchQueue, g_wszQueue ); hr = pQueueMgr->Create( awchQueue, g_guidType, g_bAuth, g_dwQos, g_dwQuota, NULL ); for( DWORD i=1; i < g_dwNumQueues && SUCCEEDED(hr); i ++ ) { swprintf( awchQueue, L"%s%d", g_wszQueue, i ); hr = pQueueMgr->Create( awchQueue, g_guidType, g_bAuth, g_dwQos, g_dwQuota, NULL ); } if ( FAILED(hr) ) { wprintf( L"Failed Creating Queue with name %s. HR = 0x%x\n", awchQueue, hr ); return 1; } } if ( g_bDestroy ) { wcscpy( awchQueue, g_wszQueue ); hr = pQueueMgr->Destroy( awchQueue ); if ( FAILED(hr) ) { wprintf( L"Failed Destroying Queue with name %s. HR = 0x%x\n", awchQueue, hr ); } for( ULONG i=1; i < g_dwNumQueues; i ++ ) { swprintf( awchQueue, L"%s%d", g_wszQueue, i ); hr = pQueueMgr->Destroy( awchQueue ); if ( FAILED(hr) ) { wprintf( L"Failed Destroying Queue with name %s. HR = 0x%x\n", awchQueue, hr ); } } } if ( g_bVerbose ) { WCHAR achType[256]; StringFromGUID2( g_guidType, achType, 256 ); wprintf( L"Getting all Names for Type : %s\n", achType ); LPWSTR* pwszNames; ULONG cwszNames; hr = pQueueMgr->GetAllNames(g_guidType, TRUE, &pwszNames, &cwszNames ); if ( FAILED(hr) ) { wprintf( L"Failed Getting All Queue Names. HR = 0x%x\n" ); return 1; } for( ULONG i=0; i < cwszNames; i++ ) { wprintf( L" %s\n", pwszNames[i] ); CoTaskMemFree( pwszNames[i] ); } CoTaskMemFree( pwszNames ); } GetSystemTime( &End ); __int64 i64Start, i64End; DWORD dwElapsed; SystemTimeToFileTime( &Start, PFILETIME(&i64Start) ); SystemTimeToFileTime( &End, PFILETIME(&i64End) ); dwElapsed = DWORD(i64End - i64Start) / 10000; printf("Test Completed in %d msec!\n", dwElapsed ); return 0; } extern "C" int __cdecl wmain( int argc, wchar_t** argv ) { CoInitialize( NULL ); if ( !ParseArgs( argc, argv ) ) { wprintf( L"Usage : msgqueue [-express|-guaranteed|-txn] \n" L" [-auth] [-numqueues:#] [-quota:#]\n" L" [-create] [-destroy] [-verbose]\n" L" [-type:clsid] \n"); return 1; } int ret = TestMain(); CoUninitialize(); return ret; }