On 19.06.2009 09:17, Yuki KODAMA wrote:
> On Thu, Jun 18, 2009 at 4:08 PM, Adrian Buehlmann<[email protected]> wrote:
>> On 18.06.2009 03:58, Yuki KODAMA wrote:
>>> On Thu, Jun 18, 2009 at 8:49 AM, Yuki KODAMA<[email protected]> wrote:
>>>> 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.
>> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/tortoisehg-develop