Most likely you are parsing it wrong. Here is a
full sample
parser:
--------- grfdump.cpp
-------------------
#include <windows.h>
#include
<errno.h>
#include <stdio.h>
#define TRACE(x) x
#define trace_open(x,y)
#define
trace_close()
#ifdef UNICODE
# define trace wprintf
# define
TRACEWSTR TEXT("s")
#else
# define trace printf
# define
TRACEWSTR TEXT("S")
#endif
#define DWRESERVED 0
#define LPRESERVED
NULL
#define TRACEHR_STR TEXT("0x%08lX")
#define TRACEHR_REF(hr)
(hr)
#define LWS(c) ((c) == L'\n' || (c) == L'\r' || (c) ==
L'\t' || (c) == L' ')
LPWSTR token(LPWSTR p, LPWSTR* s1, LPWSTR* s2, WCHAR*
q)
{
for(; LWS(*p); p++);
if(*q = *p == L'"' ? *p++ :
L'\0') {
for(*s1 = p; *p != *q; p++); *s2 = p++;
} else
{
for(*s1 = p; !LWS(*p); p++); *s2 =
p;
}
return p;
}
HRESULT skip(LPWSTR s1, LPWSTR* p)
{
int n =
wcstol(s1,NULL,10);
if(n == 0 && errno == ERANGE) return
E_FAIL;
(*p)++; if(n > 0) *p =
(LPWSTR)&((LPBYTE)(*p))[n];
return S_OK;
}
int wmain(int argc, LPWSTR
argv[])
{
HRESULT hr =
S_OK;
IStorage* pGrfFile =
NULL;
IStream* pGrfData =
NULL;
STATSTG rGrfStat;
int cb;
LPWSTR pb =
NULL;
LPWSTR s1, s2,
p;
WCHAR q;
TRACE(trace_open(NULL,zFalse));
TRACE(trace(TEXT("*** StgOpenStorage(L\"%") TRACEWSTR
TEXT("\")...\n"),argv[1]));
if(S_OK != (hr =
StgOpenStorage(argv[1],NULL,STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE,NULL,DWRESERVED,&pGrfFile)))
goto exit;
TRACE(trace(TEXT("***
OpenStream(L\"ActiveMovieGraph\")...\n")));
if(S_OK != (hr =
pGrfFile->OpenStream(L"ActiveMovieGraph",LPRESERVED,STGM_DIRECT|STGM_READ|STGM_SHARE_EXCLUSIVE,DWRESERVED,&pGrfData)))
goto exit;
TRACE(trace(TEXT("*** Stat()...\n")));
if(S_OK
!= (hr = pGrfData->Stat(&rGrfStat,STATFLAG_NONAME))) goto
exit;
cb =
(int)rGrfStat.cbSize.QuadPart;
TRACE(trace(TEXT("*** new
BYTE[%d]...\n"),cb));
if(NULL == (pb = (LPWSTR)new BYTE[cb])) goto
exit;
TRACE(trace(TEXT("***
Read(%d)...\n"),cb));
if(S_OK != (hr =
pGrfData->Read(pb,(ULONG)cb,NULL))) goto exit;
p = pb;
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>> version
= %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
p = token(p,&s1,&s2,&q);
if(0 ==
wcsnicmp(s1,L"FILTERS",s2-s1)) {
TRACE(trace(TEXT(">>>
FILTERS\n")));
while(TRUE) {
p =
token(p,&s1,&s2,&q);
if(0 ==
wcsnicmp(s1,L"CONNECTIONS",s2-s1))
break;
TRACE(trace(TEXT(">>> %.*")
TRACEWSTR TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
name .... = L\"%.*") TRACEWSTR TEXT("\"\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
class_id = %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
if(0 ==
wcsnicmp(s1,L"SOURCE",s2-s1) || 0 == wcsnicmp(s1,L"SINK",s2-s1))
{
TRACE(trace(TEXT(">>>
file .... = %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
p
=
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
file_name = L\"%.*") TRACEWSTR
TEXT("\"\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
}
TRACE(trace(TEXT(">>>
length .. = %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
if(S_OK
!= (hr = skip(s1,&p))) goto exit;
}
}
if(0
== wcsnicmp(s1,L"CONNECTIONS",s2-s1))
{
TRACE(trace(TEXT(">>>
CONNECTIONS\n")));
while(TRUE) {
p =
token(p,&s1,&s2,&q);
if(0 ==
wcsnicmp(s1,L"CLOCK",s2-s1)) break;
if(0 ==
wcsnicmp(s1,L"END",s2-s1)) break;
TRACE(trace(TEXT(">>>
%.*") TRACEWSTR,s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT("
[L\"%.*") TRACEWSTR TEXT("\"]"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(" ->
%.*") TRACEWSTR,s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT("
[L\"%.*") TRACEWSTR TEXT("\"]\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
sample_size ........ = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
major_type ......... = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
subtype ............ = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
fixed_sample_size .. = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
temporal_compression = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
length(?) .......... = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
format_type ........ = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
length ............. = %.*") TRACEWSTR
TEXT("\n"),s2-s1,s1));
if(S_OK != (hr = skip(s1,&p)))
goto exit;
p++; /// where is this L'\0' terminator
documented??
}
}
if(0 ==
wcsnicmp(s1,L"CLOCK",s2-s1)) {
TRACE(trace(TEXT(">>>
CLOCK\n")));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
required = %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
p =
token(p,&s1,&s2,&q);
TRACE(trace(TEXT(">>>
clock_id = %.*") TRACEWSTR TEXT("\n"),s2-s1,s1));
}
if(0 ==
wcsnicmp(s1,L"END",s2-s1)) {
TRACE(trace(TEXT(">>>
END\n")));
}
exit:
TRACE(trace(TEXT("*** hr = ") TRACEHR_STR
TEXT("\n"),TRACEHR_REF(hr)));
if(pb) delete []
(LPBYTE)pb;
if(pGrfData) pGrfData->Release();
if(pGrfFile)
pGrfFile->Release();
TRACE(trace_close());
return
hr;
}
-----------------------------------------
--
// Alessandro Angeli
// MVP :: Digital Media
// a dot angeli at
psynet dot net