要完成这个功能,主要分两大块东西要实现 ,一是创建外壳菜单,二是ftp上传功能,正好这两方面可百度到完美的代码,需要做的就是整合到一起。
1、右击时插入自定义的菜单:
function Tmyshell.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
idCmdLast, uFlags: UINT): HResult;
var
appreg ,dbreg: HBITMAP;
begin
Result := E_FAIL;
if ((uFlags and CMF_DEFAULTONLY) = CMF_DEFAULTONLY) then
begin
Result :=MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0 );
exit;
end;
if not Initialized then
begin
Result :=MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0 ); //等于直接赋零
exit;
end;
try
insertmenu(menu,indexmenu,1200,0,nil);
//先下后上
insertmenu(menu,indexmenu,MF_STRING OR MF_BYPOSITION,idCmdFirst+1,'上传到数据库');
insertmenu(menu,indexmenu,MF_STRING OR MF_BYPOSITION,idCmdFirst+0,'上传到应用');
insertmenu(menu,indexmenu,1200,0,nil);
//
dbReg := LoadImage(HInstance, MakeIntResource(102),IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
SetMenuItemBitmaps(Menu, idCmdFirst+1, MF_BYCOMMAND, dbReg, dbReg);
appReg := LoadImage(HInstance, MakeIntResource(101),IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS);
SetMenuItemBitmaps(Menu, idCmdFirst, MF_BYCOMMAND, appReg, appReg);
except
Result := E_FAIL;//因为返回值可能改变,所以需要再次赋FAIL
exit;
end;
此处用函数代替了VC中的宏,相当于MAKE_HRESULT(0, 0, 2+1 );
Result :=MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 3 );
end;
2、点击自定义的菜单后执行的动作:
function Tmyshell.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
var
I: Integer;
begin
Result := E_FAIL;
//OleInitialize(nil);
if hiword(integer(lpici.lpVerb))<>0 then exit;
Result := S_OK;
case loword(integer(lpici.lpVerb)) of
i: begin 创建idftp对象,并上传 end;
m: begin 创建idftp对象,并上传 end;
当然,目录文件名的获取都是在 SEInitialize函数中完成,网上任何一往篇shell编程的文章都有谈到。
关于图标的生成,就是准备14X14的256色位图资源文件
101 BITMAP "app.bmp"
102 BITMAP "db.bmp"
编译过后就会生成相关的资源文件。基本上没有难点,需要做的就是你来整合一下,最终效果如图示: