On Thu, Jun 18, 2009 at 8:00 AM, Adrian Buehlmann<[email protected]> wrote:
> On 18.06.2009 00:51, Adrian Buehlmann wrote:
>> I'm looking at 
>> http://bitbucket.org/tortoisehg/crew/src/e214839bf369/win32/shellext/ContextMenu.cpp#cl-445
>>
>> we have
>>
>> STDMETHODIMP
>> CShellExt::GetCommandString(
>>     UINT_PTR idCmd, UINT uFlags, UINT FAR *reserved,
>>     LPSTR pszName, UINT cchMax)
>> {
>>     *pszName = 0;
>>     char *psz;
>>
>>     TDEBUG_TRACE(
>>         "CShellExt::GetCommandString: idCmd = " << idCmd
>>         << ", uFlags = " << uFlags
>>     );
>>     MenuIdCmdMap::iterator iter = MenuIdMap.find(static_cast<UINT>(idCmd));
>>     if (iter != MenuIdMap.end())
>>     {
>>         TDEBUG_TRACE(
>>             "CShellExt::GetCommandString: name = " << iter->second.name);
>>         psz = (char*)iter->second.helpText.c_str();
>>     }
>>     else
>>     {
>>         TDEBUG_TRACE(
>>             "CShellExt::GetCommandString: can't find idCmd " << idCmd);
>>         psz = "";
>>     }
>>
>>     if (uFlags & GCS_UNICODE)
>>     {
>>         wcscpy((wchar_t*)pszName, _WCSTR(psz));
>>     }
>>     else
>>     {
>>         strcpy((char*)pszName, psz);
>>     }
>>     return NOERROR;
>> }
>>
>> Can someone explain what _WCSTR() does?
>>
>> http://msdn.microsoft.com/en-us/library/bb776083(VS.85).aspx specifies
>> that if uFlags & GCS_UNICODE, a "unicode" string must be copied into
>> pszName (I assume a wstring is meant with that).
>>
>> But how do we get that wstring?
>>
>> See also
>> http://bitbucket.org/tortoisehg/crew/changeset/70f7297adda2/
>>
>> Usage of _WCTSR() seems to go back to
>> http://bitbucket.org/tortoisehg/crew/src/c3caaf07dbcc/tortoise/shellext/ContextMenu.cpp#cl-260
>> (TK Soh's initial commit)
>>
>>
>
> On second look, the implementation of this function looks
> rather broken.
>
> The spec wants
>
> uFlags
>    Flags specifying the information to return. This parameter can have one of 
> the following values.
>
>    GCS_HELPTEXTA
>        Sets pszName to an ANSI string containing the help text for the 
> command.
>    GCS_HELPTEXTW
>        Sets pszName to a Unicode string containing the help text for the 
> command.
>    GCS_VALIDATEA
>        Returns S_OK if the menu item exists, or S_FALSE otherwise.
>    GCS_VALIDATEW
>        Returns S_OK if the menu item exists, or S_FALSE otherwise.
>    GCS_VERBA
>        Sets pszName to an ANSI string containing the language-independent 
> command name for the menu item.
>    GCS_VERBW
>        Sets pszName to a Unicode string containing the language-independent 
> command name for the menu item.
>
>
> we always seem return helpText, no matter what uFlags is.
>
>

Yes, I know. Actual implementation is broken and I've surprise when I
saw it at first time.
That patch (by me) is a just work around. It won't fix the root problem.

What is the root problem? I suppose it's handling of string.
We should use "TCHAR string system" instead of ''char" or "wchar_t" If
you want to
implement it proper,
But I though we can't rewrite the entire code before 0.8 release.

Using TCHAR system:
http://bitbucket.org/kuy/sharphg/src/tip/SharpHgShell/HgContextMenu.cpp#cl-148

> we always seem return helpText, no matter what uFlags is.

Yes and No. It's help text, but it's need different string types,
"Unicode" and "ANSI".
Windows explorer need "Unicode" version, but some applications
(integrated with shell extension) need "ANSI" string.

regards,
Yuki

------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing 
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
Tortoisehg-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to