Implementation of EnumMoniker and Partial impl on MkParseDisplayName

Mike McCormack mike at codeweavers.com
Mon Mar 28 10:10:35 CST 2005


Hi Jeff,

Jeff Latimer wrote:
> This is the first installment of the implementation of 
> MkParseDisplayName.  I would like feed back on style and usage.
> 
> I think the implementation of the EnumMoniker interface looks ok.  
> Comments appreciated.

I like that you've taken the time to write a test case!  I don't know 
alot about monikers, but seeing that you've tested it gives me confidence...

The following comments are a crash course in Wine programming...

> +/***********************************************************************
> + *        EnmumMoniker_Next
> + */
> +HRESULT   WINAPI EnumMonikerImpl_Next(IEnumMoniker* iface, ULONG celt, IMoniker** rgelt, ULONG * pceltFetched)
> +{
> +//    DWORD i;
> +//    ULONG ref;

We avoid C++ comments in Wine code to keep compatability with older 
compilers.

> +    EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
> +    TRACE("(%p) currentPos %d Tablastindx %d\n",This, (int)This->currentPos, (int)This->TabLastIndx);
> +    ULONG i;

You declared "i" above, but commented it out.   Try avoid putting dead 
code in comments.   If code isn't compiled, it will become stale and 
confuse people.

> +    rc = CoGetMalloc(1, (LPMALLOC *) &ppMalloc);
>      if (!(IsValidInterface((LPUNKNOWN) pbc)))
>  	return E_INVALIDARG;
> +    usernamelen = (int) lstrlenW(szUserName); 	// overall string len
> +
>  
> +    if (szUserName[char_cnt] == (WCHAR) '@') { 	// This is a progid not a file name

That's alot of casts.  I don't think you really need that many, do you?

> +    /* retrieve the requested number of moniker from the current position */
> +    for(i=0;((This->currentPos < This->TabLastIndx) && (i < celt));i++)
> +	rgelt[i]=(IMoniker*)This->TabMoniker[This->currentPos++].pmkObj;

Better to avoid tabs... and too many brackets. A space or two extra in 
the for( i=0; (This->... might make things look better.

> +	    if (szUserName[char_cnt] == '/' ||
> +	    	szUserName[char_cnt] == '?' ||
> +	    	szUserName[char_cnt] == '<' ||
> +	    	szUserName[char_cnt] == '>' ||
> +	    	szUserName[char_cnt] == '*' ||
> +	    	szUserName[char_cnt] == '|' ||
> +	    	szUserName[char_cnt] == ':')

Maybe that can be shortened to :
             if (strchr("/?<>*|:",szUserName[char_cnt]))

> +    todo_wine { ok(hr==0x800401e4, "MkParseDisplayName - Progid not implemented hr=%08x\n", (int) hr); }

0x800401e4 is defined as MK_E_SYNTAX.  It would be clearer to use the 
define rather than a number.

%08lx is probably what you want instead of casting hr to (int) to get 
rid of the printf parameter type warning.

> +
> +    IBindCtx_Release(pbc);
> +
> +    /* A bad drive */
> +    static const WCHAR wszDisplayName2[] = {'1',':','s','i','d',':',
>          '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8','-','0','8','0','0','2','B','3','0','3','0','9','D',':',0};

Again, for compatability, we avoid inline declarations, even though gcc 
can deal with them fine.

Mike



More information about the wine-devel mailing list