⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shortcut.cpp

📁 This software performs code conversion of Chinese characters, including GB2312/GBK and BIG5. It a
💻 CPP
📖 第 1 页 / 共 3 页
字号:



// 僔儑乕僩僇僢僩偺撪梕傪庢摼偡傞乮UNICODE斉乯
// 堷偒悢偺偆偪 szShortcutPathW 埲奜偼 NULL 偱傕壜
// 僔儑乕僩僇僢僩柤偺奼挘巕 .lnk/.pif/.url 偼桳柍偳偪傜傕壜
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 0 埲奜傪曉偡
int WINAPI GetShortcutW ( const wchar_t *szShortcutPathW,
                          wchar_t *szDestinationPath,
                          wchar_t *szArguments,
                          wchar_t *szDirectory,
                          wchar_t *szDescription,
                          wchar_t *szIconPath,
                          int  *pnIconIndex,
                          int  *pnShowCommand,
                          unsigned short *pwHotKey,
                          ITEMIDLIST **ppItemIdList,
                          wchar_t *szSavedShortcutPath ) {

   // 堷偒悢専嵏
   if ( ! szShortcutPathW ) return 1 ;


   int nResult = 1 ;
   wchar_t *szTmp1 = NULL, *szTmp2 = NULL ;


   if ( 1 ) {

      // 僼傽僀儖懚嵼専嵏
      int IsLnkOrUrl = IS_LINK_UNKNOWN ;
      const wchar_t *szExtension = GetExtensionW ( szShortcutPathW ) ;
      if ( szExtension && GetFileAttributesW ( szShortcutPathW ) != (unsigned long) -1 ) {
         if ( ! wcsicmp ( szExtension, szExtensionLnkW + 1 ) ) IsLnkOrUrl = IS_LINK_FILESYSTEM ;
         if ( ! wcsicmp ( szExtension, szExtensionPifW + 1 ) ) IsLnkOrUrl = IS_LINK_FILESYSTEM ;
         if ( ! wcsicmp ( szExtension, szExtensionUrlW + 1 ) ) IsLnkOrUrl = IS_LINK_URL ;
      }
      if ( IsLnkOrUrl == IS_LINK_UNKNOWN ) {
         if ( ! ( szTmp1 = (wchar_t*) malloc ( ( wcslen ( szShortcutPathW ) + 0x10 ) * sizeof(wchar_t) ) ) ) { nResult = 3 ; goto CAUGHT_ERROR ; }
         if ( IsLnkOrUrl == IS_LINK_UNKNOWN ) {
            wcscpy ( szTmp1, szShortcutPathW ) ;
            wcscat ( szTmp1, szExtensionLnkW ) ;
            if ( GetFileAttributesW ( szTmp1 ) != (unsigned long) -1 ) IsLnkOrUrl = IS_LINK_FILESYSTEM ;
         }
         if ( IsLnkOrUrl == IS_LINK_UNKNOWN ) {
            wcscpy ( szTmp1, szShortcutPathW ) ;
            wcscat ( szTmp1, szExtensionPifW ) ;
            if ( GetFileAttributesW ( szTmp1 ) != (unsigned long) -1 ) IsLnkOrUrl = IS_LINK_FILESYSTEM ;
         }
         if ( IsLnkOrUrl == IS_LINK_UNKNOWN ) {
            wcscpy ( szTmp1, szShortcutPathW ) ;
            wcscat ( szTmp1, szExtensionUrlW ) ;
            if ( GetFileAttributesW ( szTmp1 ) != (unsigned long) -1 ) IsLnkOrUrl = IS_LINK_URL ;
         }
         if ( IsLnkOrUrl == IS_LINK_UNKNOWN ) { nResult = 2 ; goto CAUGHT_ERROR ; }
         szShortcutPathW = szTmp1 ;
      }


      // 僼傽僀儖柤傪僼儖僷僗柤偵
      if ( ! IsFullPathNameW ( szShortcutPathW ) ) {
         szShortcutPathW = szTmp2 = GetFullPathNameAllocW ( szShortcutPathW ) ;
         if ( ! szTmp2 ) { nResult = 3 ; goto CAUGHT_ERROR ; }
      }


      // URL 偺応崌
      if ( IsLnkOrUrl == IS_LINK_URL ) {

         IUniformResourceLocatorW *pIShellLink ;
         IPersistFile *pIPersistFile ;

         if ( SUCCEEDED ( CoInitialize ( NULL ) ) ) {
            if ( SUCCEEDED ( CoCreateInstance ( CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, IID_IUniformResourceLocatorW, (void**) & pIShellLink ) ) ) {
               if ( SUCCEEDED ( pIShellLink->QueryInterface ( IID_IPersistFile, (void**) & pIPersistFile ) ) ) {
                  if ( SUCCEEDED ( pIPersistFile->Load ( szShortcutPathW, STGM_READ ) ) ) {
                     nResult = 0 ;
                     if ( szDestinationPath ) GetUrlDestinationPathW ( pIShellLink, szDestinationPath ) ;
                     if ( szArguments ) *szArguments = 0 ;
                     if ( szDirectory ) *szDirectory = 0 ;
                     if ( szDescription ) *szDescription = 0 ;
                     if ( szIconPath ) *szIconPath = 0 ;
                     if ( pnShowCommand ) *pnShowCommand = 0 ;
                     if ( pwHotKey ) *pwHotKey = 0 ;
                     if ( ppItemIdList ) *ppItemIdList = NULL ;
                     if ( szSavedShortcutPath ) wcscpy ( szSavedShortcutPath, szShortcutPathW ) ;
                  }
               }
               pIShellLink->Release () ;
            }
            CoUninitialize () ;
         }
      }
      // 僼傽僀儖偺応崌
      else {

         IShellLinkW *pIShellLink ;
         IPersistFile *pIPersistFile ;
         WIN32_FIND_DATAW fData ;

         if ( SUCCEEDED ( CoInitialize ( NULL ) ) ) {
            if ( SUCCEEDED ( CoCreateInstance ( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**) & pIShellLink ) ) ) {
               if ( SUCCEEDED ( pIShellLink->QueryInterface ( IID_IPersistFile, (void**) & pIPersistFile ) ) ) {
                  if ( SUCCEEDED ( pIPersistFile->Load ( szShortcutPathW, STGM_READ ) ) ) {
                     nResult = 0 ;
                     int nIconIndexTmp = 0 ;
                     if ( szDestinationPath ) pIShellLink->GetPath ( szDestinationPath, MAX_PATH, & fData, SLGP_UNCPRIORITY ) ;
                     if ( szArguments ) pIShellLink->GetArguments ( szArguments, MAX_PATH ) ;
                     if ( szDirectory ) pIShellLink->GetWorkingDirectory ( szDirectory, MAX_PATH ) ;
                     if ( szDescription ) pIShellLink->GetDescription ( szDescription, MAX_PATH ) ;
                     if ( szIconPath ) pIShellLink->GetIconLocation ( szIconPath, MAX_PATH, & nIconIndexTmp ) ;
                     if ( pnIconIndex ) *pnIconIndex = nIconIndexTmp ;
                     if ( pnShowCommand ) pIShellLink->GetShowCmd ( pnShowCommand ) ;
                     if ( pwHotKey ) pIShellLink->GetHotkey ( pwHotKey ) ;
                     if ( ppItemIdList ) pIShellLink->GetIDList ( ppItemIdList ) ;
                     if ( szSavedShortcutPath ) wcscpy ( szSavedShortcutPath, szShortcutPathW ) ;
                  }
                  pIPersistFile->Release () ;
               }
               pIShellLink->Release () ;
            }
            CoUninitialize () ;
         }

         if ( szDestinationPath ) {
            wchar_t szDstTmp [ MAX_PATH ] ;
            if ( ! GetMsiShortcutW ( szShortcutPathW, szDstTmp, NULL, NULL, NULL ) ) wcscpy ( szDestinationPath, szDstTmp ) ;
         }
      }
   }

   CAUGHT_ERROR :

   free ( szTmp1 ) ;
   free ( szTmp2 ) ;

   return nResult ;
}



static int GetUrlDestinationPathW ( IUniformResourceLocatorW *pIShellLink, wchar_t *szPath ) {
   wchar_t *pTmp ;
   if ( SUCCEEDED ( pIShellLink->GetURL ( & pTmp ) ) ) {
      wcscpy ( szPath, pTmp ) ;
      ShFree ( pTmp ) ;
      return 0 ;
   }
   return 1 ;
}



////////////////////////////////////
//              MSI               //
////////////////////////////////////



// This function is not supported in Win95
#define MsiGetShortcutTargetA MsiGetShortcutTargetA_
#define MsiGetShortcutTargetW MsiGetShortcutTargetW_
#define MsiGetComponentPathA MsiGetComponentPathA_
#define MsiGetComponentPathW MsiGetComponentPathW_
typedef UINT ( WINAPI *MSIGETSHORTCUTTARGETA ) ( LPCSTR szShortcutPath, LPSTR szProductCode, LPSTR szFeatureId, LPSTR szComponentCode ) ;
typedef UINT ( WINAPI *MSIGETSHORTCUTTARGETW ) ( LPCWSTR szShortcutPath, LPWSTR szProductCode, LPWSTR szFeatureId, LPWSTR szComponentCode ) ;
typedef INT ( WINAPI *MSIGETCOMPONENTPATHA ) ( LPCSTR szProduct, LPCSTR szComponent, LPSTR lpPathBuf, DWORD *pcchBuf ) ;
typedef INT ( WINAPI *MSIGETCOMPONENTPATHW ) ( LPCWSTR szProduct, LPCWSTR szComponent, LPWSTR lpPathBuf, DWORD *pcchBuf ) ;
static HINSTANCE hMsi ;
static MSIGETSHORTCUTTARGETA MsiGetShortcutTargetA ;
static MSIGETSHORTCUTTARGETW MsiGetShortcutTargetW ;
static MSIGETCOMPONENTPATHA MsiGetComponentPathA ;
static MSIGETCOMPONENTPATHW MsiGetComponentPathW ;
static int FreeLibraryOnDetach ( void ) ;


#define INSTALLSTATE_LOCAL 3
#define MAX_FEATURE_CHARS  38



// MSI偱嶌惉偝傟偨僔儑乕僩僇僢僩傪庢摼偡傞乮ANSI斉乯
// szShortcutPath 埲奜偼 NULL 偱傕壜
// szProductCode, szFeatureId, szComponentCode 偺僒僀僘偼 MAX_FEATURE_CHARS + 1 埲忋傪
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 0 埲奜傪曉偡
static int GetMsiShortcutA ( const char *szShortcutPath, char *szDestinationPath, char *szProductCode, char *szFeatureId, char *szComponentCode ) {


   if ( ! hMsi && ( hMsi = LoadLibraryA ( "MSI.DLL" ) ) ) FreeLibraryOnDetach () ;
   if ( GETPROCADDRESS ( hMsi, MSIGETSHORTCUTTARGETA, MsiGetShortcutTargetA ) ) return 1 ;
   if ( GETPROCADDRESS ( hMsi, MSIGETCOMPONENTPATHA, MsiGetComponentPathA ) ) return 1 ;


   char szProductCodeTmp [ MAX_FEATURE_CHARS + 1 ] ;
   char szComponentCodeTmp [ MAX_FEATURE_CHARS + 1 ] ;

   if ( szDestinationPath ) *szDestinationPath = 0 ;
   if ( szProductCode ) *szProductCode = 0 ;
   if ( szFeatureId ) *szFeatureId = 0 ;
   if ( szComponentCode ) *szComponentCode = 0 ;

   if ( MsiGetShortcutTargetA ( szShortcutPath, szProductCodeTmp, szFeatureId, szComponentCodeTmp ) ) return 2 ;

   unsigned long nLength = MAX_PATH ;
   if ( MsiGetComponentPathA ( szProductCodeTmp, szComponentCodeTmp, szDestinationPath, & nLength ) != INSTALLSTATE_LOCAL ) return 3 ;

   if ( szProductCode ) strcpy ( szProductCode, szProductCodeTmp ) ;
   if ( szComponentCode ) strcpy ( szComponentCode, szComponentCodeTmp ) ;

   return 0 ;
}



// MSI偱嶌惉偝傟偨僔儑乕僩僇僢僩傪庢摼偡傞乮UNICODE斉乯
// szShortcutPath 埲奜偼 NULL 偱傕壜
// szProductCode, szFeatureId, szComponentCode 偺僒僀僘偼 MAX_FEATURE_CHARS + 1 埲忋傪
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 0 埲奜傪曉偡
static int GetMsiShortcutW ( const wchar_t *szShortcutPath, wchar_t *szDestinationPath, wchar_t *szProductCode, wchar_t *szFeatureId, wchar_t *szComponentCode ) {


   if ( ! hMsi && ( hMsi = LoadLibraryW ( L"MSI.DLL" ) ) ) FreeLibraryOnDetach () ;
   if ( GETPROCADDRESS ( hMsi, MSIGETSHORTCUTTARGETW, MsiGetShortcutTargetW ) ) return 1 ;
   if ( GETPROCADDRESS ( hMsi, MSIGETCOMPONENTPATHW, MsiGetComponentPathW ) ) return 1 ;


   wchar_t szProductCodeTmp [ MAX_FEATURE_CHARS + 1 ] ;
   wchar_t szComponentCodeTmp [ MAX_FEATURE_CHARS + 1 ] ;

   if ( szDestinationPath ) *szDestinationPath = 0 ;
   if ( szProductCode ) *szProductCode = 0 ;
   if ( szFeatureId ) *szFeatureId = 0 ;
   if ( szComponentCode ) *szComponentCode = 0 ;

   if ( MsiGetShortcutTargetW ( szShortcutPath, szProductCodeTmp, szFeatureId, szComponentCodeTmp ) ) return 2 ;

   unsigned long nLength = MAX_PATH ;
   if ( MsiGetComponentPathW ( szProductCodeTmp, szComponentCodeTmp, szDestinationPath, & nLength ) != INSTALLSTATE_LOCAL ) return 3 ;

   if ( szProductCode ) wcscpy ( szProductCode, szProductCodeTmp ) ;
   if ( szComponentCode ) wcscpy ( szComponentCode, szComponentCodeTmp ) ;

   return 0 ;
}



static void __cdecl ExitProc ( void ) {
   if ( hMsi ) FreeLibrary ( hMsi ) ;
   hMsi = NULL ;
}



static int FreeLibraryOnDetach ( void ) {
#ifdef _USRDLL
   return atexit ( ExitProc ) ;
#else
   return 0 ;
#endif
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -