陈敏的Blog

*博鸽(BlogDove)官方博客 *精彩原创:编程技巧之一分钟学会系列 *TOM-Skype 技术研究 *Super Bosskey 官方发布站点

用户操作
[即时聊天] [发私信] [加为好友]
陈敏ID:colinchan
90454次访问,排名1040好友5人,关注者10
继续努力
colinchan的文章
原创 73 篇
翻译 1 篇
转载 31 篇
评论 137 篇
陈敏的公告
衰与帅,原本只在一声之间:)

绿色新品,免费体验
陈敏给您推荐:

1. 博鸽-最好用的好友博客阅读器
立即下载最新V1.7版


2. TOM-Skype 想说就说


3.Super BossKey -最好用的通用老板键程序(New!)
Super BosKey V1.1(167KB)

最近评论
Felax:感谢楼主帮我解决的大问题啊
peng chan:能理解这么高深的思想,你很成熟!
jane_xu_gucas:我也发现了和lxhtzy类似的问题,链接的时候出问题了,我想问下,是不是工程的属性里需要改动什么呢
jane_xu_gucas:你好,这个方法好像只适用于对话框中的按钮设置,我想请问一下,如果是TOOLBAR中的按钮想换成位图的话,如何实现,谢谢
maguangzhi:和程序都不能真正穿透,真正穿透的程序见http://maguangzhi.bokee.com
文章分类
收藏
    相册
    大杂烩
    高三十班北京同学聚会
    WorkMate
    丁肇源-大名鼎鼎的SD
    于恩水-野马在线
    刘观宇
    孙全辉-健康饮食
    小贝 - 开源SOA掌门(RSS)
    崔仑-C/C++技术
    李玉鹏
    大学情谊
    万春-美丽与哀愁
    乐一帆-华工的好哥们
    何志芳-花旗,旗花
    何渊-Thinking In PKU
    卜道成-Piao在文广
    唐皓-争做申城第一
    孙弓-狂人穆里尼奥
    张朗-北京哥们
    戢冯-北大美女
    朱君颖-聪明的美女
    杨启CSDN-安全专家
    杨启MSN-忧郁型男
    林晔-余纯顺的粉丝
    欧阳为为-Miss 闲大爷
    汪洋-大海
    秦海迪-飘渺的蓝色理想
    苏青-南京PP
    金鹏-落霞与孤鹜齐飞
    陈希-哈韩帅男
    陈鹏-西塔男
    黄立波-朗讯郎
    其他好友
    周亮-律政俏佳人(RSS)
    张佳-才女+美女(RSS)
    张燕-爱情专家
    旬靓-清华哥们
    易小利-Red Spider Lily(RSS)
    曾一洲-是个男人,好哥们
    杨球武-文笔极诙谐的老同学
    王琛-冰火狂刀
    肖翔-大才子
    郭晋兵-北邮老大
    阙鸣-永远的缺牙齿
    陈云帆-坚守在武汉的老战士
    陈吉利-[心理学+贴PP]专区(RSS)
    黎雷-蛮可爱的女生
    友情链接
    IT狗仔队
    大学空间
    我的163相册
    永远的高三(十)班
    没人气的初三(一)班
    陈敏-QZone
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 一分钟学会创建开始菜单程序组和桌面快捷方式收藏

    新一篇: 博鸽-最好用的好友博客阅读器 | 旧一篇: 2007年中国邮政贺年(有奖)明信片开奖了~~

    Windows下的开始菜单程序组和桌面快捷方式对普通用户来讲可以说是整个系统的入口,因此一般的安装程序在运行时都会创建这两种链接。那么我们普通的绿色程序(我说的是那种没有依靠打包向导生成的程序)有没有机会创建呢,当然是有的。

    在VC下创建这两类链接有几个要点,第一是获取链接所在目录,比如桌面的目录通常是:C:\Documents and Settings\UserName\桌面。 程序组的目录通常是:C:\Documents and Settings\UserName\「开始」菜单\程序。

    获取的方法是访问特定的注册表项。

    第二个要点是使用COM接口写入lnk文件到上述目录,原理并不深奥,请直接看下面代码

    bool CreateProgramGroup(const char * szGroupName)
    {
     CRegKey cKey;
     if(ERROR_SUCCESS != cKey.Open(HKEY_CURRENT_USER,
      "Software\\MicroSoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"))
     {
      return false;
     }
     
     char szRootDir[MAX_PATH];
     DWORD dwSize = MAX_PATH;
     if(ERROR_SUCCESS != cKey.QueryValue(szRootDir, "Programs", &dwSize))
     {
      cKey.Close();
      return false;
     }
     cKey.Close();

     char szFullDir[MAX_PATH];
     sprintf(szFullDir, "%s\\%s", szRootDir, szGroupName);
     CreateDirectory(szFullDir, NULL);
     return true;
    }

     

    bool CreateLink(const char * szLinkName, const char * szProgPath,
        bool bDesktop, const char * szGroupName /* = 0 */)
    {
     CComPtr<IShellLink> spIShellLink;
     HRESULT hr = ::CoCreateInstance(CLSID_ShellLink, NULL, 1,
      IID_IShellLink, (LPVOID *)&spIShellLink);  
     if(FAILED(hr))
     {
      return false;
     }

     spIShellLink->SetPath(szProgPath);
     spIShellLink->SetShowCmd(SW_SHOWNORMAL);

     //获取程序所在目录,设置为工作目录
     char * szSep = strrchr(szProgPath, '\\');
     if(!szSep)
      return false;

     //获取程序目录
     char szProgFolder[MAX_PATH];
     memset(szProgFolder, 0, MAX_PATH);
     strncpy(szProgFolder, szProgPath, szSep - szProgPath + 1);
     spIShellLink->SetWorkingDirectory(szProgFolder);

     CComPtr<IPersistFile> spIPersistFile;
     hr = spIShellLink->QueryInterface(IID_IPersistFile, (void **)&spIPersistFile);
     if(FAILED(hr))
     {
      return false;
     }

     CRegKey cKey;
     if(ERROR_SUCCESS != cKey.Open(HKEY_CURRENT_USER,
      "Software\\MicroSoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"))
     {
      return false;
     }
     
     char szRootDir[MAX_PATH];
     DWORD dwSize = MAX_PATH;
     if(ERROR_SUCCESS != cKey.QueryValue(szRootDir, bDesktop ? "Desktop" : "Programs", &dwSize))
     {
      cKey.Close();
      return false;
     }
     cKey.Close();

     char szFullDir[MAX_PATH];
     if(szGroupName)
      sprintf(szFullDir, "%s\\%s\\%s.lnk", szRootDir, szGroupName, szLinkName);
     else
      sprintf(szFullDir, "%s\\%s.lnk", szRootDir, szLinkName);

     WCHAR wszFullDir[MAX_PATH];
     ::MultiByteToWideChar(0, 0, szFullDir, -1, wszFullDir, MAX_PATH);

     hr = spIPersistFile->Save(wszFullDir, FALSE);
     if(FAILED(hr))
     {
      return false;  
     }
       
     ::SHChangeNotify(SHCNE_ALLEVENTS, SHCNF_PATH|SHCNF_FLUSH, szFullDir, 0);  
     return true;
    }

     

    使用示例:

     CoInitialize(NULL);


     char szDemoExeDir[MAX_PATH];
     sprintf(szDemoExeDir, "c:\\program files\\demo\\demo.exe");
     char szUnInstallDir[MAX_PATH];
     sprintf(szUnInstallDir, "c:\\program files\\demo\\uninstall.exe");

     CreateLink("Demo", szDemoExeDir, TRUE);

     CreateProgramGroup("Demo程序组");
     CreateLink("Demo", szDemoExeDir, FALSE, "Demo程序组");
     CreateLink("卸载Demo", szUnInstallDir, FALSE, "Demo程序组");
     
     CoUninitialize();

     


    发表于 @ 2007年03月07日 18:19:00|评论(loading...)|编辑

    新一篇: 博鸽-最好用的好友博客阅读器 | 旧一篇: 2007年中国邮政贺年(有奖)明信片开奖了~~

    评论

    #JKHIO 发表于2008-07-07 17:40:35  IP: 220.195.228.*
    开始菜单里面,固定区和活动区应用程序,分别在哪个文件夹离存放?路径是什么?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 陈敏