建立程式選單和快捷方式的程式碼

lin_zyang發表於2007-10-08
// 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;
}
*/

 

相關文章