471,355 Members | 1,569 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,355 software developers and data experts.

Explorer context menu problem

Hi, I seem to be having a problem getting a context menu to work in
Explorer. The menu item installs fine, but when I click it a message box
should pop up indicating the command was received and handled.
Unfortunately, nothing occurs.

I suspect that I am doing something wrong with the command ID for the
menu item, but I can't figure out what. After registering my DLL, the
menu item "my context menu" appears if I right-click any file. If I
highlight the menu item with my mouse, the information on Explorer's
status bar reads "Encrypt the selected files". My "GetCommandString()"
implementation is as follows (nothing about encryption, as you can see):
void IContextMenu.GetCommandString(int idCmd, uint uFlags, int
pwReserved, StringBuilder commandString, int cchMax)
{
switch(uFlags)
{
case (uint)GCS.VERB:
commandString = new StringBuilder("...");
break;
case (uint)GCS.HELPTEXT:
commandString = new StringBuilder("...");
break;
}
}
This is obviously suspect. Then, if I click on the item, no message box
appears. I've included the relevant parts of my code below.

This is where I setup the menu, and return an incremented command ID:
int IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int
idCmdFirst, int idCmdLast, uint uFlags)
{

int id = 0;
if ( (uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) != 0)
{
uint nselected = Helpers.DragQueryFile(m_hDrop, 0xffffffff, null, 0);
if (nselected == 1)
{
StringBuilder sb = new StringBuilder(1024);
Helpers.DragQueryFile(m_hDrop, 0, sb, sb.Capacity + 1);
m_fileName = sb.ToString();

}
MENUITEMINFO mii = new MENUITEMINFO();
mii.cbSize = 48;
mii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE | (uint)MIIM.STATE;
mii.wID = idCmdFirst+id;
mii.fType = (uint)MF.STRING;
mii.dwTypeData = "my context menu";
mii.fState = (uint)MF.ENABLED;
Helpers.InsertMenuItem(hMenu, (uint)iMenu++, 1, ref mii);
}

return idCmdFirst+id+1;

}
Here is my "InvokeCommand()" implementation, which should show a simple
message box.
void IContextMenu.InvokeCommand (IntPtr pici)
{

try
{

Type typINVOKECOMMANDINFO = Type.GetType("TagSet.INVOKECOMMANDINFO");
INVOKECOMMANDINFO ici =
(INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, typINVOKECOMMANDINFO);

MessageBox.Show("InvokeCommand");

}
catch(Exception)
{
}
}
Any help would be appreciated. Thanks, JA
Feb 10 '06 #1
2 2582

First of all, you may want to think twice before writing a shell
extension in C# at all. There are good reasons why you shouldn't. See
http://blogs.msdn.com/junfeng/archiv...18/494572.aspx
It's hard to say exactly what's wrong without seeing your interface
and function declarations. But here are some general comments.
void IContextMenu.GetCommandString(int idCmd, uint uFlags, int
pwReserved, StringBuilder commandString, int cchMax)
{
switch(uFlags)
{
case (uint)GCS.VERB:
commandString = new StringBuilder("...");
break;
case (uint)GCS.HELPTEXT:
commandString = new StringBuilder("...");
break;
}
}
The value you assign to commandString here will not be seen by the
caller since it's passed by value.

Type typINVOKECOMMANDINFO = Type.GetType("TagSet.INVOKECOMMANDINFO");


You may want to consider using the typeof operator instead of
Type.GetType here.
Mattias

--
Mattias Sjögren [C# MVP] mattias @ mvps.org
http://www.msjogren.net/dotnet/ | http://www.dotnetinterop.com
Please reply only to the newsgroup.
Feb 10 '06 #2
Mattias Sjögren wrote:
First of all, you may want to think twice before writing a shell
extension in C# at all. There are good reasons why you shouldn't. See
http://blogs.msdn.com/junfeng/archiv...18/494572.aspx


Thanks, Mattias, for the note. I'll probably switch gears now.

Also, I got it to work after restarting my computer. Explorer had to be
restarted, I think, to release module completely.

JA
Feb 10 '06 #3

This discussion thread is closed

Replies have been disabled for this discussion.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.