Explorer context menu problem

G

gilad

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
 
M

Mattias Sjögren

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/archive/2005/11/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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top