On 19.06.2009 09:17, Yuki KODAMA wrote:
> On Thu, Jun 18, 2009 at 4:08 PM, Adrian Buehlmann<adr...@cadifra.com> wrote:
>> On 18.06.2009 03:58, Yuki KODAMA wrote:
>>> On Thu, Jun 18, 2009 at 8:49 AM, Yuki KODAMA<endflow....@gmail.com> wrote:
>>>> On Thu, Jun 18, 2009 at 8:00 AM, Adrian Buehlmann<adr...@cadifra.com> 
>>>> 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.
>> We should be able to correctly implement the current ANSI string
>> implementation.
>>
>> If the calling side requests a wide string, we can convert
>> our ANSI strings we have. Seems that's what you did.
>>
>> Thanks for your patch.
>>
>>>> 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.
>> Thanks for the hint. I haven't had time to look at this yet,
>> as I was absorbed by the overlays.
>>
>> The context menu is mostly still as per TK's implementation.
>> Since it just seemed to work, I had no reason to dig into
>> this further yet.
>>
>> Maybe we should at least return an error if we haven't found
>> the string. I might play with this today a bit.
>>
>> There seem to be quite a couple to ways to call this function
>> which don't seem to be really used/needed.
>> Looks like explorer is just happy with our current implementation.
>>
>> I was wondering about the not-found idCmd cases in debug
>> output:
>>
>> [3504] [THG] CShellExt::GetCommandString: idCmd = 0, uFlags = 4
>> [3504] [THG] CShellExt::GetCommandString: name = commit
>> [3504] [THG] CShellExt::GetCommandString: idCmd = 14, uFlags = 4
>> [3504] [THG] CShellExt::GetCommandString: can't find idCmd 14
>> [3504] [THG] CShellExt::GetCommandString: idCmd = 14, uFlags = 4
>> [3504] [THG] CShellExt::GetCommandString: can't find idCmd 14
>>
>> we currently just return an empty string in this case but
>> don't flag an error.
>>
>> Maybe it would be better to return an error.
>>
>> Another open question I have is where do we get this unknown
>> idCmd with value 14 from. Just smells to me like we shouldn't get
>> this 14 in the first place. A hint for an incorrectness somewhere
>> else.
>>
>>> "_WCSTR" is a macro that convert string from ANSI to Unicode:
>>>
>>> #define _WCSTR(str) hf_mbtowc((LPWSTR)alloca((strlen(str) + 1) *
>>> sizeof(WCHAR)),(str),strlen(str) + 1)
>>>
>>> in TortoiseUtils.h header file.
>> Ah, thanks for the pointer (I was looking too far :). So this is
>> allocating space on the stack, which is correct.
>>
> 
> I also noticed unknown idCmd. But I didn't track any more in back then.
> Are there some finding of you?
> 

Looks like idCmd = 14 is for the "TortoiseHg..." root menu entry,
which is not a command we have in our bookkeeping of Cmd id's.

We are queried for the help text by explorer for this entry as well.

This is caused by:

    TDEBUG_TRACE("  CShellExt::QueryContextMenu: adding main THG menu");
    InsertSubMenuItemWithIcon(hMenu, hSubMenu, indexMenu++, idCmd++,
            "TortoiseHG...", "hg.ico");

in QueryContextMenu

So, maybe implemented a bit oddly but no problem here.

------------------------------------------------------------------------------
_______________________________________________
Tortoisehg-develop mailing list
Tortoisehg-develop@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop

Reply via email to