cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
avesty
Level 3

Update service reporting

Hello,

I seem to be having some trouble with the reporting available on the update service (we use the pro update service) website. Currently our application automatically checks for updates when the software launches and if any are available it will display these updates. That part of the process seems to be working fine. The problem is that the reports available in the update service seem totally innacurate with regards to the numbers of new users/unique users etc.

I assumed that every time our software launches and checks for an update that this should count towards the 'total uses' of the software on the report. Is this not correct? The reports are counting something (as in they're not zero) but they seem to be off by more than a factor of 100. Does it only count when people manually select from say a start menu shortcut to check for updates?

I've looked around for some more information on how to ensure reporting is accurately tracking usage etc, but like most update info docs it seems to be pretty scarce.

Any help/tips appreciated.

Vesty.
0 Kudos
(4) Replies
avesty
Level 3

FYI, here is the code we use on application startup. The intent here is to record OS type and machine speed, and also check for available updates. (product guid removed)


if (updcheck)
{
::CoInitialize(NULL);

USES_CONVERSION;

CComPtr spAgent;

if (SUCCEEDED(spAgent.CoCreateInstance(CLSID_Agent)))
{
CComBSTR profileName(L"WindowsVersion");
CComBSTR productCode;

//new single product code for all international versions
productCode = (L"{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}");

long flag = 0;
//spAgent->QueryInterface(IID_IProfileManager, (void**)&spProfileMan);

CComQIPtr spPfMgr = spAgent;
if (spPfMgr)
{
spPfMgr->ProfileAdd(productCode, profileName, flag);
wxString Version = CheckWindowsVersion();
wxLogDebug(Version+"\n");
CComBSTR Ver(Version.c_str());
spPfMgr->ProfileSetValue(productCode, profileName, L"Version", Ver);

//ULong
LARGE_INTEGER Frequency, ulTicks, ulValue, ulStartCounter, ulEAX_EDX;
QueryPerformanceFrequency(&Frequency);

// Query current value:
QueryPerformanceCounter(&ulTicks);
// Calculate end value (one second interval); this is (current + frequency)
ulValue.QuadPart = ulTicks.QuadPart + Frequency.QuadPart;
// Read CPU time-stamp counter:
__asm RDTSC
// And save in ulEAX_EDX:
__asm mov ulEAX_EDX.LowPart, EAX
__asm mov ulEAX_EDX.HighPart, EDX
// Store starting counter value:
ulStartCounter.QuadPart = ulEAX_EDX.QuadPart;
// Loop for one second (measured with the high-resolution counter):
do {
QueryPerformanceCounter(&ulTicks);
} while (ulTicks.QuadPart <= ulValue.QuadPart);
// Now again read CPU time-stamp counter:
__asm RDTSC
// And save:
__asm mov ulEAX_EDX.LowPart, EAX
__asm mov ulEAX_EDX.HighPart, EDX
// Calculate number of cycles done in interval; 1000000 Hz = 1 MHz
DWORD num = ((ulEAX_EDX.QuadPart - ulStartCounter.QuadPart) / 1000000);

std::ostringstream oNum("");
oNum << (int)num;
std::string a =oNum.str();

wxString Speed(a.c_str());
Speed << " Mhz";
wxLogDebug(Speed+"\n");

spPfMgr->ProfileAdd(productCode, L"Processor Speed", flag);
CComBSTR ProcSpeed(Speed.c_str());
spPfMgr->ProfileSetValue(productCode, profileName, L"Speed", ProcSpeed);

CComPtr spPfList;
CComPtr spPf;

if (SUCCEEDED(spPfMgr->ProfileEnum( productCode, &spPfList)))
{
long Count;
spPfList->get_Count(&Count);
for (long i = 0; i < Count; i++)
{
CComVariant vtItem;

if (SUCCEEDED(spPfList->get_Item(i+1, &vtItem)))
{
spPf = com_cast(vtItem.punkVal);

CComBSTR pfname;
spPf->get_profilename(&pfname);
CComBSTR name;
spPf->get_Name(&name);
CComBSTR value;
spPf->get_value(&value);
CComBSTR msg = L"";
msg.AppendBSTR(pfname);
msg.Append(L" - ");
msg.AppendBSTR(name);
msg.Append(L" : ");
msg.AppendBSTR(value);
//::MessageBoxW(0, msg, L"Title", MB_OK);
}
//else
// MessageBox(0, "Could not get profile", "error", 0);
}
}
//else
// MessageBox(0, "Could not enumerate profiles", "error", 0);
}

HRESULT hr = spAgent->AppUpdate(productCode, AppStart);
if (FAILED(hr))
{
CComPtr spErrorInfo;
if (::GetErrorInfo(0, &spErrorInfo) == S_OK)
{
CComBSTR bstrDescription;
if (SUCCEEDED(spErrorInfo->GetDescription(&bstrDescription)))
{
::MessageBoxW(0, bstrDescription, L"Error", 0);
}
}
}
}
0 Kudos
KellyF
Level 9

Vesty,

Have you reported this to the support folks so that they can dig more deeply into the numbers, etc? If so, can you PM me the service number so I can follow up with them?

Regards,
Kelly
0 Kudos
avesty
Level 3

KellyF wrote:
Vesty,

Have you reported this to the support folks so that they can dig more deeply into the numbers, etc? If so, can you PM me the service number so I can follow up with them?

Regards,
Kelly


Nope, wanted to check whether it seemed to be working fine for anyone else, or this was a known issue (ie it was broken).

How/Where do I report these problems to the support folks?
0 Kudos
KellyF
Level 9

http://support.macrovision.com alternatively, you can call in to the phone support (you'll have to look it up on the website though, as I really don't know the phone #).

They'll probably ask you info about the productcode you're using, your username on the site, etc. Be sure to let them know of your expectations in terms of usage (ie how many users you'd expect, the number of machines they'd be allowed, etc.) as well as anything you may do for the numbers (like if you have vm images that you install & test on).

Regards,
Kelly

PS. Once the next version is released, be sure to check the documentation about the "license abuse report" because that can help you identify serials in use, etc. I know there'll be docs about it. 🙂

avesty wrote:
How/Where do I report these problems to the support folks?
0 Kudos