创建桌面快捷方式放到启动与注册表启动方式

30 篇文章 2 订阅
9 篇文章 0 订阅

注册表启动:

头文件:

#include   <Registry.hpp> 

//开机启动 注册表方式
	TRegistry   *Reg=new   TRegistry;
	Reg-> RootKey=HKEY_LOCAL_MACHINE;
	if(Reg-> OpenKey( "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",true))
	{
	RegShell=Reg->ReadString("BsNavWF");
	if(RegShell=="")
	{
		  if(MessageBox(NULL, "是否将程序设定为开机自动运行 ", "确定 ",MB_YESNO)==IDYES)
			{
			Reg-> WriteString( "BsNavWF",Application->ExeName);
			Reg-> CloseKey();
			delete   Reg;
			}
	}
	}


创建桌面快捷方式放到启动

使用:CreateLnk(Application->ExeName, "XXXX");

void __fastcall TFrmMain::CreateLnk(String FilePath, String FileName) {
  LPMALLOC ShellMalloc;
  LPITEMIDLIST DesktopPidl;
  char DesktopDir[MAX_PATH];
  if (FAILED(SHGetMalloc(&ShellMalloc))) {
    return;
  }
//CSIDL_STARTUP 是指放到程序--启动中
  if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_STARTUP, &DesktopPidl))) {
    return;
  }
  if(!SHGetPathFromIDList(DesktopPidl, DesktopDir)) {
    ShellMalloc->Free(DesktopPidl);
    ShellMalloc->Release();
    return;
  }
  ShellMalloc->Free(DesktopPidl);
  ShellMalloc->Release();

  IShellLink* pLink;
  IPersistFile* pPersistFile;
  if (SUCCEEDED(CoInitialize(NULL))) {
    if (SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
      IID_IShellLink, (void **) &pLink))) {

	  pLink->SetPath(FilePath.c_str());
	  pLink->SetWorkingDirectory(ExtractFilePath(FilePath).c_str());//起始位置设定为exe当前目录
      pLink->SetShowCmd(SW_SHOW);
      if (SUCCEEDED(pLink->QueryInterface(IID_IPersistFile, (void **)&pPersistFile))) {
        WideString strShortCutLocation = DesktopDir;
		strShortCutLocation += "\\"+FileName+".lnk";
        pPersistFile->Save(strShortCutLocation.c_bstr(), TRUE);
		pPersistFile->Release();
      }
      pLink->Release();
    }
    CoUninitialize();
  }
}


//获取启动文件夹目录; 
                                /* 
                                    使用API函数SHGetSpecialFolder。shlobj.h里有SHGetSpecialFolder的原型声明。这个函数可以帮我们找到windows的Desktop目录、启动目录、我的文档目录等。 
                                    SHGetSpecialFolder需要三个参数。   第一个参数是HWND,它指定了 "所有者窗口 ":在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id,决定哪个目录是待查找目录,它的取值可能是: 

                                    CSIDL_BITBUCKET   回收站 
                                    CSIDL_CONTROLS   控制面板   
                                    CSIDL_DESKTOP   Windows   桌面desktop   
                                    CSIDL_DESKTOPDIRECTORY   desktop的目录   
                                    CSIDL_DRIVES   我的电脑 
                                    CSIDL_FONTS   字体目录   
                                    CSIDL_NETHOOD   网上邻居 
                                    CSIDL_NETWORK   网上邻居virtual   folder 
                                    CSIDL_PERSONAL   我的文档   
                                    CSIDL_PRINTERS   打印机 
                                    CSIDL_PROGRAMS   程序组 
                                    CSIDL_RECENT   大多数最近打开的文档列一 
                                    CSIDL_SENDTO   “发送到”菜单项 
                                    CSIDL_STARTMENU   任务条启动菜单项 
                                    CSIDL_STARTUP   启动目录 
                                    CSIDL_TEMPLATES   临时文档 
                                    最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。

                                */ 



利用COM接口 


DskCut.h 

#ifndef   _DESK_SHORTCUT_ 
#define   _DESK_SHORTCUT_ 

void   CreateDskShortCut(const   char   *file,const   char   *LinkName,const   char   *Description); 
//三个参数分别为快捷方式指向的文件名,快捷方式名,快捷方式的描述(当鼠标停在快捷方式图标上一段时间后出现) 
#endif 


DskCut.cpp 

#define   NO_WIN32_LEAN_AND_MEAN//一定要定义这个宏,否则#include   <shlobj.h> 会出错 
#include   <vcl.h>   //因为用到了WideString,所以必须包含这个文件。 
#include   <windows.h> 
#include   <shlobj.h> 


void   CreateDskShortCut(const   char   *file,const   char   *LinkName,const   char   *Description) 

IShellLink*   pLink; 
IPersistFile*   pPersistFile; 
LPMALLOC   ShellMalloc; 
LPITEMIDLIST   DesktopPidl; 
char   DesktopDir[MAX_PATH]; 
if(FAILED(SHGetMalloc(&ShellMalloc)))   return; 
if(FAILED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOPDIRECTORY,&DesktopPidl)))   return; 
if(!SHGetPathFromIDList(DesktopPidl,   DesktopDir))//获得桌面路径 

ShellMalloc-> Free(DesktopPidl); 
ShellMalloc-> Release(); 
return; 

ShellMalloc-> Free(DesktopPidl); 
ShellMalloc-> Release(); 
if(SUCCEEDED(CoInitialize(NULL))) 

if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink,   NULL, 
CLSCTX_INPROC_SERVER,IID_IShellLink,   (void   **)   &pLink)))//创建建立快捷方式的外壳扩展 

pLink-> SetPath(file);//这几句都是快捷方式的参数 
pLink-> SetDescription(Description); 
pLink-> SetShowCmd(SW_SHOW); 
if(SUCCEEDED(pLink-> QueryInterface(IID_IPersistFile,(void   **)&pPersistFile))) 

WideString   strShortCutLocation(DesktopDir);//快捷方式的名称 
strShortCutLocation   += "\\ "; 
strShortCutLocation   +=   LinkName; 
strShortCutLocation   += ".lnk "; 
pPersistFile-> Save(strShortCutLocation.c_bstr(),   TRUE);//保存 
pPersistFile-> Release();   } 
pLink-> Release(); 

CoUninitialize(); 

}   

最常用的使用方法 

CreateDskShortCut(Application-> ExeName.c_str(), "TEST ", "BCB_TEST "); 

  

-*-*-PATCH-*-*-2002-02-26 

用上述方法设置的快捷方式中的工作目录为空,这会导致一些问题。现修改如下。 

1、函数参数加一个 

void   CreateDskShortCut(const   char   *file,const   char   *WorkDir,const   char   *LinkName,const   char   *Description) 


2、 

pLink-> SetPath(file);//这几句都是快捷方式的参数 
pLink-> SetDescription(Description); 
pLink-> SetShowCmd(SW_SHOW); 

pLink-> SetWorkingDirectory(WorkDir);   


3、最常用的使用方法 

CreateDskShortCut(Application-> ExeName.c_str(),ExtractFilePath(Application-> ExeName).c_str(), "TEST ", "BCB_TEST "); 

-*-*-PATCH-*-*-2002-02-26 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值