创建程序菜单和快捷方式的代码

//  Windows Header Files:
#include  < windows.h >

//  C RunTime Header Files
#include  < stdlib.h >
#include 
< malloc.h >
#include 
< memory.h >
#include 
< tchar.h >


#include 
< atlbase.h >
#include 
< shlobj.h >

#ifndef LIB_H
#define  LIB_H

bool  CreateProgramGroup( const   char   *  szGroupName);
bool  CreateLink( const   char   *  szLinkName,  const   char   *  szProgPath,
                
bool  bDesktop,  const   char   *  szGroupName  /* = 0 */ );
#endif

#define  MAX_LOADSTRING 100

//  Global Variables:
HINSTANCE hInst;                                 //  current instance

bool  CreateProgramGroup( const   char   *  szGroupName)
{
    
static HKEY hkey;
    
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER,
        
"Software/MicroSoft/Windows/CurrentVersion/Explorer/Shell Folders",
        
0, KEY_READ | KEY_WRITE, &hkey))
    
{
        
return false;
    }

    
    
char szRootDir[MAX_PATH];
    DWORD dwSize 
= MAX_PATH;
    DWORD dwType 
= REG_SZ;
    
if(ERROR_SUCCESS != RegQueryValueEx(hkey, "Programs", NULL, &dwType, (PBYTE)&szRootDir, &dwSize))
    
{
        RegCloseKey(hkey);
        
return false;
    }

    RegCloseKey(hkey);
    
    
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;
    }

    
    HKEY hkey;
    
if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER,
        
"Software/MicroSoft/Windows/CurrentVersion/Explorer/Shell Folders"
        
0, KEY_READ | KEY_WRITE, &hkey))
    
{
        
return false;
    }

    
    
char szRootDir[MAX_PATH];
    DWORD dwSize 
= MAX_PATH;
    DWORD dwType 
= REG_SZ;
    
if(ERROR_SUCCESS != RegQueryValueEx(hkey,  bDesktop ? "Desktop" : "Programs", NULL, &dwType, (PBYTE)&szRootDir, &dwSize))
    
{
        RegCloseKey(hkey);
        
return false;
    }

    RegCloseKey(hkey);
    
    
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(
00, 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;
}


/**
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    
     CoInitialize(NULL);


     char szDemoExeDir[MAX_PATH];
     char szExeFileName[MAX_PATH];

     GetModuleFileName(NULL, szExeFileName, MAX_PATH);

     sprintf(szDemoExeDir, szExeFileName);
     char szUnInstallDir[MAX_PATH];
     sprintf(szUnInstallDir, szExeFileName);
     
     CreateProgramGroup("Demo程序组");
     CreateLink("Demo", szDemoExeDir, FALSE, "Demo程序组");
     CreateLink("Demo", szDemoExeDir, TRUE, NULL);
     CreateLink("卸载Demo", szUnInstallDir, FALSE, "Demo程序组");
     
     CoUninitialize();
    
    return 0;
}
*/


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值