注册表启动:
头文件:
#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