Sorry about the extra post, didn't want to make the
previous post unreadable with 'wide' code.
Here's a couple of samples(error checking ommitted):
Code:
/* ***********************************************
* RSSRead:
* Demonstrates reading an rss feed using MSXML.
*
============================================*/
void RSSRead(LPCTSTR szURL) {
DISPATCH_OBJ(xmlDoc);
struct RSS {
LPWSTR szTitle, szLink, szDescription;
} RSSItem;
/* Load the rss document from the URL */
dhCreateObject(L"MSXML.DOMDocument", NULL, &xmlDoc) );
dhPutValue(xmlDoc, L".Async = %b", FALSE) );
dhCallMethod(xmlDoc, L".Load(%T)", szURL) );
FOR_EACH1(xmlNode, xmlDoc, L".documentElement.getElementsByTagName(%S)", L"item") {
ZeroMemory(&RSSItem, sizeof(RSSItem));
dhGetValue(L"%S", &RSSItem.szTitle, xmlNode, L".selectSingleNode(%S).text", L"title");
dhGetValue(L"%S", &RSSItem.szLink, xmlNode, L".selectSingleNode(%S).text", L"link");
dhGetValue(L"%S", &RSSItem.szDescription, xmlNode, L".selectSingleNode(%S).text", L"description");
wprintf(L"Title: %s\nLink: %s\nDescription: %.140s\n\n",
RSSItem.szTitle, RSSItem.szLink, RSSItem.szDescription);
dhFreeString(RSSItem.szTitle);
dhFreeString(RSSItem.szLink);
dhFreeString(RSSItem.szDescription);
} NEXT(xmlNode);
SAFE_RELEASE(xmlDoc);
}
Code:
/* ********************************************
* MonitorProcessActivity:
* Monitors process startup and termination on local or remote computer.
*
* =========================================== */
void MonitorProcessActivity(LPCWSTR szComputer) {
DISPATCH_OBJ(wmiSvc);
DISPATCH_OBJ(wmiEventSrc);
dhGetObject(getWmiStr(szComputer), NULL, &wmiSvc) );
dhGetValue(L"%o", &wmiEventSrc, wmiSvc, L".ExecNotificationQuery(%S)",
L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE (__Class = '__InstanceCreationEvent' OR __Class = '__InstanceDeletionEvent') AND TargetInstance ISA 'Win32_Process'") );
while (TRUE) {
DISPATCH_OBJ(wmiLatestEvent);
LPWSTR szProcessName = NULL;
LPWSTR szClassName = NULL;
dhGetValue(L"%o", &wmiLatestEvent, wmiEventSrc, L".NextEvent") );
dhGetValue(L"%S", &szProcessName, wmiLatestEvent, L".TargetInstance.Name");
dhGetValue(L"%S", &szClassName, wmiLatestEvent, L".SystemProperties_(%S)", L"__Class");
if (szClassName && 0 == wcscmp(L"__InstanceDeletionEvent", szClassName))
wprintf(L"TERMINATED: \t%s\n", szProcessName);
else
wprintf(L"STARTED: \t%s\n", szProcessName);
dhFreeString(szProcessName);
dhFreeString(szClassName);
SAFE_RELEASE(wmiLatestEvent);
}
SAFE_RELEASE(wmiEventSrc);
SAFE_RELEASE(wmiSvc);
}