Hi, i'm writing a shell extension in c# that will add two menu's to the
right-click menu of explorer if any file is selected, i.e. it's
registered in the * section of Classes in the registry.
Here is the problem. If i select one file and use the standard OPEN
context menu, for a .txt file let's say, all is well, but if i select
two or more files and use the standard OPEN context menu it seems to
want to run through the code snippet for MY created menus. Here is the
code in question for my created menus:
int IContextMenu.QueryContextMenu(uint hmenu,uint iMenu, int
idCmdFirst,int idCmdLast,uint uFlags)
{
// The first id to use (should be 1)
int id = 1;
if ((uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) !=
0)
{
// Create a new Menu Item to add to the context menu
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 = "Send file(s) to CheapFTP member(s)";
mii.fState = (uint)MF.ENABLED;
// Add it to the item
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref mii);
id = 2;
// Create a new Menu Item to add to the context menu
MENUITEMINFO miii = new MENUITEMINFO();
miii.cbSize = 48;
miii.fMask = (uint)MIIM.ID | (uint)MIIM.TYPE |
(uint)MIIM.STATE;
miii.wID = idCmdFirst + id;
miii.fType = (uint)MF.STRING;
miii.dwTypeData = "Quick Send file(s) to CheapFTP preferred
member(s)";
miii.fState = (uint)MF.ENABLED;
// Add it to the item
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref miii);
id = 3;
// Create a seperator
MENUITEMINFO sep = new MENUITEMINFO();
sep.cbSize = 48;
sep.fMask = (uint)MIIM.TYPE;
sep.wID = idCmdFirst + id;
sep.fType = (uint)MF.SEPARATOR;
// Add it to the seperator to the context menu
DllImports.InsertMenuItem(hmenu, (uint)2, 1, ref sep);
}
// Return the number of items added
return id;
}
void IContextMenu.InvokeCommand(IntPtr pici)
{
try
{
//fileList
StringBuilder fileList = new StringBuilder();
StringBuilder sb = new StringBuilder(1024);
uint i = 0;
//Get number of files
uint uNumFiles = 0;
uNumFiles = DllImports.DragQueryFile(m_hDrop, 0xFFFFFFFF, null,
0);
//make file name
while (i < uNumFiles)
{
DllImports.DragQueryFile(m_hDrop, i, sb, sb.Capacity + 1);
fileList.Append(sb + ",");
i++;
}
// Determine which of the context menus was clicked
Type t = Type.GetType("ShellExt.INVOKECOMMANDINFO");
INVOKECOMMANDINFO ici;
ici = (INVOKECOMMANDINFO)Marshal.PtrToStructure(pici, t);
switch (ici.verb - 1)
{
case 0:
// Send File(s) to CheapFTP client
Process.Start("c:\\CheapFTP.exe", "\"" +
fileList.ToString() + "\"");
break;
case 1:
// Send File(s) to CheapFTP client with QuickSend Flag
enabled
fileList.Append("QuickSend,");
Process.Start("c:\\CheapFTP.exe", "\"" +
fileList.ToString() + "\"");
break;
default:
MessageBox.Show("Shell Error");
break;
}
}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show("Error : " + e.ToString(),
"Error in CheapFTP installation. Please re-install.");
}
}
If i use my created menus everything works as planned, and so do all
the other menus i have installed, i.e. WinRar and NOD32 Antivirus. If i
select one file and use the standard OPEN menu it works correctly.
Only when i select multiple files and select OPEN, i notice that it
runs through the code for MY menu, i.e. the MessageBox "Shell Error"
will pop up as often as the number of files i have selected. It seems
that if one file is selected and it has an OPEN static command in the
registry "notepad.exe %1" it runs that, but if i have two selected does
it run a different command in the registry?
It is my understanding that if i select the OPEN menu it should not
even run through my
code at all. If I uninstall my menu, selecting multiple files+OPEN
works properly even with the WinRar context menus installed. The only
difference i can see is that WinRAR's is a .dll probably made in
unhandled c++ where mine is made in c# .NET.
ideas/suggestions? TIA,lushdog