[APPWIZ] Add support for creating internet shortcuts (#664)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Sun, 8 Jul 2018 14:40:14 +0000 (23:40 +0900)
committerHermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
Sun, 8 Jul 2018 14:40:14 +0000 (16:40 +0200)
CORE-8737

26 files changed:
dll/cpl/appwiz/CMakeLists.txt
dll/cpl/appwiz/appwiz.h
dll/cpl/appwiz/createlink.c
dll/cpl/appwiz/lang/bg-BG.rc
dll/cpl/appwiz/lang/cs-CZ.rc
dll/cpl/appwiz/lang/de-DE.rc
dll/cpl/appwiz/lang/el-GR.rc
dll/cpl/appwiz/lang/en-US.rc
dll/cpl/appwiz/lang/es-ES.rc
dll/cpl/appwiz/lang/et-EE.rc
dll/cpl/appwiz/lang/fr-FR.rc
dll/cpl/appwiz/lang/he-IL.rc
dll/cpl/appwiz/lang/it-IT.rc
dll/cpl/appwiz/lang/ja-JP.rc
dll/cpl/appwiz/lang/no-NO.rc
dll/cpl/appwiz/lang/pl-PL.rc
dll/cpl/appwiz/lang/pt-BR.rc
dll/cpl/appwiz/lang/ro-RO.rc
dll/cpl/appwiz/lang/ru-RU.rc
dll/cpl/appwiz/lang/sk-SK.rc
dll/cpl/appwiz/lang/sq-AL.rc
dll/cpl/appwiz/lang/tr-TR.rc
dll/cpl/appwiz/lang/uk-UA.rc
dll/cpl/appwiz/lang/zh-CN.rc
dll/cpl/appwiz/lang/zh-TW.rc
dll/cpl/appwiz/resource.h

index cf926cb..1a7e4a0 100644 (file)
@@ -24,6 +24,6 @@ add_library(appwiz SHARED
 set_module_type(appwiz cpl UNICODE)
 target_link_libraries(appwiz uuid wine)
 add_delay_importlibs(appwiz msi)
-add_importlibs(appwiz urlmon ole32 comctl32 advapi32 shell32 user32 msvcrt kernel32 ntdll)
+add_importlibs(appwiz urlmon ole32 comctl32 advapi32 shell32 shlwapi user32 msvcrt kernel32 ntdll)
 add_pch(appwiz appwiz.h SOURCE)
 add_cd_file(TARGET appwiz DESTINATION reactos/system32 FOR all)
index 632345b..fa38884 100644 (file)
@@ -17,6 +17,8 @@
 #include <winreg.h>
 #include <winnls.h>
 #include <shlobj.h>
+#include <intshcut.h>
+#include <shlwapi.h>
 
 #include <wine/debug.h>
 WINE_DEFAULT_DEBUG_CHANNEL(appwiz);
@@ -28,6 +30,8 @@ typedef struct
    WCHAR szTarget[MAX_PATH];
    WCHAR szWorkingDirectory[MAX_PATH];
    WCHAR szDescription[MAX_PATH];
+   WCHAR szOrigin[MAX_PATH];
+   WCHAR szOldFile[MAX_PATH];
    WCHAR szLinkName[MAX_PATH];
 } CREATE_LINK_CONTEXT, *PCREATE_LINK_CONTEXT;
 
index ba83643..4788cc8 100644 (file)
@@ -5,13 +5,13 @@
  * PROGRAMMER:      Gero Kuehn (reactos.filter@gkware.com)
  *                  Dmitry Chapyshev (lentind@yandex.ru)
  *                  Johannes Anderwald
+ *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  * UPDATE HISTORY:
  *      06-17-2004  Created
  */
 
 #include "appwiz.h"
-
-#include <tchar.h>
+#include <strsafe.h>
 
 BOOL
 IsShortcut(HKEY hKey)
@@ -79,70 +79,102 @@ CreateShortcut(PCREATE_LINK_CONTEXT pContext)
     LPWSTR lpExtension;
 
     /* get the extension */
-    lpExtension = wcsrchr(pContext->szTarget, '.');
+    lpExtension = PathFindExtensionW(pContext->szTarget);
 
     if (IsExtensionAShortcut(lpExtension))
     {
         hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_ALL, &IID_IShellLinkW, (void**)&pSourceShellLink);
 
-        if (hr != S_OK)
+        if (FAILED(hr))
             return FALSE;
 
-        hr = pSourceShellLink->lpVtbl->QueryInterface(pSourceShellLink, &IID_IPersistFile, (void**)&pPersistFile);
-        if (hr != S_OK)
+        hr = IUnknown_QueryInterface(pSourceShellLink, &IID_IPersistFile, (void**)&pPersistFile);
+        if (FAILED(hr))
         {
-            pSourceShellLink->lpVtbl->Release(pSourceShellLink);
+            IUnknown_Release(pSourceShellLink);
             return FALSE;
         }
 
         hr = pPersistFile->lpVtbl->Load(pPersistFile, (LPCOLESTR)pContext->szTarget, STGM_READ);
-        pPersistFile->lpVtbl->Release(pPersistFile);
+        IUnknown_Release(pPersistFile);
 
-        if (hr != S_OK)
+        if (FAILED(hr))
         {
-            pSourceShellLink->lpVtbl->Release(pSourceShellLink);
+            IUnknown_Release(pSourceShellLink);
             return FALSE;
         }
 
-        hr = pSourceShellLink->lpVtbl->GetPath(pSourceShellLink, Path, sizeof(Path) / sizeof(WCHAR), NULL, 0);
-        pSourceShellLink->lpVtbl->Release(pSourceShellLink);
+        hr = IShellLinkW_GetPath(pSourceShellLink, Path, _countof(Path), NULL, 0);
+        IUnknown_Release(pSourceShellLink);
 
-        if (hr != S_OK)
+        if (FAILED(hr))
         {
             return FALSE;
         }
     }
     else
     {
-        wcscpy(Path, pContext->szTarget);
+        StringCchCopyW(Path, _countof(Path), pContext->szTarget);
     }
 
     hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_ALL,
-                   &IID_IShellLinkW, (void**)&pShellLink);
+                          &IID_IShellLinkW, (void**)&pShellLink);
 
     if (hr != S_OK)
         return FALSE;
 
-
     pShellLink->lpVtbl->SetPath(pShellLink, Path);
     pShellLink->lpVtbl->SetDescription(pShellLink, pContext->szDescription);
     pShellLink->lpVtbl->SetWorkingDirectory(pShellLink, pContext->szWorkingDirectory);
 
-    hr = pShellLink->lpVtbl->QueryInterface(pShellLink, &IID_IPersistFile, (void**)&pPersistFile);
+    hr = IUnknown_QueryInterface(pShellLink, &IID_IPersistFile, (void**)&pPersistFile);
     if (hr != S_OK)
     {
-        pShellLink->lpVtbl->Release(pShellLink);
+        IUnknown_Release(pShellLink);
         return FALSE;
     }
 
     hr = pPersistFile->lpVtbl->Save(pPersistFile, pContext->szLinkName, TRUE);
-    pPersistFile->lpVtbl->Release(pPersistFile);
-    pShellLink->lpVtbl->Release(pShellLink);
+    IUnknown_Release(pPersistFile);
+    IUnknown_Release(pShellLink);
     return (hr == S_OK);
 }
 
+BOOL
+CreateInternetShortcut(PCREATE_LINK_CONTEXT pContext)
+{
+    IUniformResourceLocatorW *pURL = NULL;
+    IPersistFile *pPersistFile = NULL;
+    HRESULT hr;
+    WCHAR szPath[MAX_PATH];
+    GetFullPathNameW(pContext->szLinkName, _countof(szPath), szPath, NULL);
+
+    hr = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_ALL,
+                          &IID_IUniformResourceLocatorW, (void **)&pURL);
+    if (FAILED(hr))
+        return FALSE;
+
+    hr = IUnknown_QueryInterface(pURL, &IID_IPersistFile, (void **)&pPersistFile);
+    if (FAILED(hr))
+    {
+        IUnknown_Release(pURL);
+        return FALSE;
+    }
+
+    pURL->lpVtbl->SetURL(pURL, pContext->szTarget, 0);
+
+    hr = pPersistFile->lpVtbl->Save(pPersistFile, szPath, TRUE);
+
+    IUnknown_Release(pPersistFile);
+    IUnknown_Release(pURL);
 
+    return SUCCEEDED(hr);
+}
 
+BOOL IsInternetLocation(LPCWSTR pszLocation)
+{
+    return (PathIsURLW(pszLocation) || wcsstr(pszLocation, L"www.") == pszLocation);
+}
 
 INT_PTR
 CALLBACK
@@ -158,7 +190,6 @@ WelcomeDlgProc(HWND hwndDlg,
     WCHAR szDesc[100];
     BROWSEINFOW brws;
     LPITEMIDLIST pidllist;
-    IMalloc* malloc;
 
     switch(uMsg)
     {
@@ -196,15 +227,10 @@ WelcomeDlgProc(HWND hwndDlg,
                         break;
 
                     if (SHGetPathFromIDListW(pidllist, szPath))
-                        SendDlgItemMessage(hwndDlg, IDC_SHORTCUT_LOCATION, WM_SETTEXT, 0, (LPARAM)szPath);
+                        SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION, szPath);
 
                     /* Free memory, if possible */
-                    if (SUCCEEDED(SHGetMalloc(&malloc)))
-                    {
-                        IMalloc_Free(malloc, pidllist);
-                        IMalloc_Release(malloc);
-                    }
-
+                    CoTaskMemFree(pidllist);
                     break;
             }
             break;
@@ -212,47 +238,45 @@ WelcomeDlgProc(HWND hwndDlg,
             lppsn  = (LPPSHNOTIFY) lParam;
             if (lppsn->hdr.code == PSN_WIZNEXT)
             {
+                LPWSTR pch;
                 pContext = (PCREATE_LINK_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER);
-                SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_LOCATION, WM_GETTEXT, MAX_PATH, (LPARAM)pContext->szTarget);
-                ///
-                /// FIXME
-                /// it should also be possible to create a link to folders, shellobjects etc....
-                ///
-                if (GetFileAttributesW(pContext->szTarget) == INVALID_FILE_ATTRIBUTES)
+                GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION, pContext->szTarget, _countof(pContext->szTarget));
+                StrTrimW(pContext->szTarget, L" \t");
+
+                if (IsInternetLocation(pContext->szTarget))
                 {
-                    szDesc[0] = L'\0';
-                    szPath[0] = L'\0';
-                    if (LoadStringW(hApplet, IDS_CREATE_SHORTCUT, szDesc, 100) < 100 &&
-                        LoadStringW(hApplet, IDS_ERROR_NOT_FOUND, szPath, MAX_PATH) < MAX_PATH)
-                    {
-                        WCHAR szError[MAX_PATH + 100];
-                        swprintf(szError, szPath, pContext->szTarget);
-                        MessageBoxW(hwndDlg, szError, szDesc, MB_ICONERROR);
-                    }
+                    /* internet */
+                    WCHAR szName[128];
+                    LoadStringW(hApplet, IDS_NEW_INTERNET_SHORTCUT, szName, _countof(szName));
+                    StringCchCopyW(pContext->szDescription, _countof(pContext->szDescription), szName);
+
+                    pContext->szWorkingDirectory[0] = 0;
+                }
+                else if (GetFileAttributesW(pContext->szTarget) != INVALID_FILE_ATTRIBUTES)
+                {
+                    /* file */
                     SendDlgItemMessage(hwndDlg, IDC_SHORTCUT_LOCATION, EM_SETSEL, 0, -1);
                     SetFocus(GetDlgItem(hwndDlg, IDC_SHORTCUT_LOCATION));
                     SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
-                    return -1;
+
+                    /* set working directory */
+                    StringCchCopyW(pContext->szWorkingDirectory, _countof(pContext->szWorkingDirectory),
+                                   pContext->szTarget);
+                    PathRemoveBackslashW(pContext->szWorkingDirectory);
+                    pch = PathFindFileNameW(pContext->szWorkingDirectory);
+                    if (pch && *pch)
+                        *pch = 0;
+                    PathRemoveBackslashW(pContext->szWorkingDirectory);
                 }
                 else
                 {
-                    WCHAR * first, *last;
-                    wcscpy(pContext->szWorkingDirectory, pContext->szTarget);
-                    first = wcschr(pContext->szWorkingDirectory, L'\\');
-                    last = wcsrchr(pContext->szWorkingDirectory, L'\\');
-                    wcscpy(pContext->szDescription, &last[1]);
-
-                    if (first != last)
-                        last[0] = L'\0';
-                    else
-                        first[1] = L'\0';
-
-                    first = wcsrchr(pContext->szDescription, L'.');
-
-                    if(first)
-                        first[0] = L'\0';
+                    /* not found */
+                    WCHAR szError[MAX_PATH + 100];
+                    LoadStringW(hApplet, IDS_CREATE_SHORTCUT, szDesc, _countof(szDesc));
+                    LoadStringW(hApplet, IDS_ERROR_NOT_FOUND, szPath, _countof(szPath));
+                    StringCchPrintfW(szError, _countof(szError), szPath, pContext->szTarget);
+                    MessageBoxW(hwndDlg, szError, szDesc, MB_ICONERROR);
                 }
-
             }
             break;
     }
@@ -276,7 +300,7 @@ FinishDlgProc(HWND hwndDlg,
             ppsp = (LPPROPSHEETPAGEW)lParam;
             pContext = (PCREATE_LINK_CONTEXT) ppsp->lParam;
             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
-            SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_NAME, WM_SETTEXT, 0, (LPARAM)pContext->szDescription);
+            SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription);
             PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
             break;
         case WM_COMMAND:
@@ -299,16 +323,60 @@ FinishDlgProc(HWND hwndDlg,
             pContext = (PCREATE_LINK_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER);
             if (lppsn->hdr.code == PSN_WIZFINISH)
             {
-                SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_NAME, WM_GETTEXT, MAX_PATH, (LPARAM)pContext->szDescription);
-                wcscat(pContext->szLinkName, pContext->szDescription);
-                wcscat(pContext->szLinkName, L".lnk");
-                if (!CreateShortcut(pContext))
+                LPWSTR pch;
+                DWORD attrs;
+                GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription, MAX_PATH);
+                StrTrimW(pContext->szDescription, L" \t");
+
+                /* if old shortcut file exists, then delete it now */
+                attrs = GetFileAttributesW(pContext->szOldFile);
+                if (attrs != INVALID_FILE_ATTRIBUTES && !(attrs & FILE_ATTRIBUTE_DIRECTORY))
                 {
-                    MessageBox(hwndDlg, _T("Failed to create shortcut"), _T("Error"), MB_ICONERROR);
+                    DeleteFileW(pContext->szOldFile);
                 }
-            }
-
 
+                if (IsInternetLocation(pContext->szTarget))
+                {
+                    /* internet */
+                    StringCchCopyW(pContext->szLinkName, _countof(pContext->szLinkName),
+                                   pContext->szOrigin);
+                    PathAppendW(pContext->szLinkName, pContext->szDescription);
+
+                    /* change extension if any */
+                    pch = PathFindExtensionW(pContext->szLinkName);
+                    if (pch && *pch)
+                        *pch = 0;
+                    StringCchCatW(pContext->szLinkName, _countof(pContext->szLinkName), L".url");
+
+                    if (!CreateInternetShortcut(pContext))
+                    {
+                        WCHAR szMessage[128];
+                        LoadStringW(hApplet, IDS_CANTMAKEINETSHORTCUT, szMessage, _countof(szMessage));
+                        MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
+                    }
+                }
+                else
+                {
+                    /* file */
+                    StringCchCopyW(pContext->szLinkName, _countof(pContext->szLinkName),
+                                   pContext->szOrigin);
+                    PathAppendW(pContext->szLinkName, pContext->szDescription);
+
+                    /* change extension if any */
+                    pch = PathFindExtensionW(pContext->szLinkName);
+                    if (pch && *pch)
+                        *pch = 0;
+                    StringCchCatW(pContext->szLinkName, _countof(pContext->szLinkName), L".lnk");
+
+                    if (!CreateShortcut(pContext))
+                    {
+                        WCHAR szMessage[128];
+                        LoadStringW(hApplet, IDS_CANTMAKESHORTCUT, szMessage, _countof(szMessage));
+                        MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
+                    }
+                }
+            }
+            break;
     }
     return FALSE;
 }
@@ -329,6 +397,7 @@ ShowCreateShortcutWizard(HWND hwndCPl, LPWSTR szPath)
        /* no memory */
        return FALSE;
     }
+
     nLength = wcslen(szPath);
     if (!nLength)
     {
@@ -347,13 +416,18 @@ ShowCreateShortcutWizard(HWND hwndCPl, LPWSTR szPath)
         return FALSE;
     }
 
-    wcscpy(pContext->szLinkName, szPath);
-    if (pContext->szLinkName[nLength-1] != L'\\')
+    /* build the pContext->szOrigin and pContext->szOldFile */
+    StringCchCopyW(pContext->szOrigin, _countof(pContext->szOrigin), szPath);
+    pContext->szOldFile[0] = 0;
+    if (!(attrs & FILE_ATTRIBUTE_DIRECTORY))
     {
-        pContext->szLinkName[nLength] = L'\\';
-        pContext->szLinkName[nLength+1] = L'\0';
+        LPWSTR pch;
+        StringCchCopyW(pContext->szOldFile, _countof(pContext->szOldFile), szPath);
+        pch = PathFindFileNameW(pContext->szOrigin);
+        if (pch && *pch)
+            *pch = 0;
     }
-
+    PathAddBackslashW(pContext->szOrigin);
 
     /* Create the Welcome page */
     psp.dwSize = sizeof(PROPSHEETPAGE);
index aea61b4..f1a883b 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 8238fc3..3b60b30 100644 (file)
@@ -83,4 +83,7 @@ BEGIN
     IDS_DOWNLOADING "Stahování..."
     IDS_INSTALLING "Instalace..."
     IDS_INVALID_SHA "Stažený soubor má neplatný kontrolní součet. Instalace poškozeného souboru bude přerušena."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 26cc670..7dca52c 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Lade herunter..."
     IDS_INSTALLING "Installiere..."
     IDS_INVALID_SHA "Die heruntergeladene Datei hat eine unerwartete Prüfsumme. Abbruch der Installation aufgrund beschädigter Datei."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index bb799dc..d747592 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 1896cd9..e5d9516 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index ab63639..949de04 100644 (file)
@@ -84,4 +84,7 @@ BEGIN
     IDS_DOWNLOADING "Descargando..."
     IDS_INSTALLING "Instalando..."
     IDS_INVALID_SHA "La suma de verificación del archivo descargado no coincide. Se ha cancelado la instalación del archivo corrupto."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 926b579..6d41c1b 100644 (file)
@@ -85,4 +85,7 @@ BEGIN
     IDS_DOWNLOADING "Allalaadimine..."
     IDS_INSTALLING "Paigaldamine..."
     IDS_INVALID_SHA "Kontrollsumma ei kattu. Paigaldamine katkestatud korrupteerinud faili tõttu."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index cb23ebe..6c942ee 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Téléchargement..."
     IDS_INSTALLING "Installation..."
     IDS_INVALID_SHA "La somme de contrôle du fichier téléchargé est erronée. Abandon de l'installation du fichier corrompu."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 948ede8..145a093 100644 (file)
@@ -79,4 +79,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 4cb79f9..f7b388c 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Scaricando..."
     IDS_INSTALLING "Installando..."
     IDS_INVALID_SHA "Checksum imprevisto del file scaricato. Interruzione installazione del file danneggiato."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index f63d532..c70ab86 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "ダウンロード中..."
     IDS_INSTALLING "インストール中..."
     IDS_INVALID_SHA "ダウンロードしたファイルのチェックサムが合致しません。壊れたファイルのインストールを中止しています。"
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 2cb892a..2629569 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 4f2cba6..faf2be5 100644 (file)
@@ -87,4 +87,7 @@ BEGIN
     IDS_DOWNLOADING "Ściąganie..."
     IDS_INSTALLING "Instalowanie..."
     IDS_INVALID_SHA "Nieoczekiwana suma kontrolna ściągniętego pliku. Przerwanie instalacji uszkodzonego pliku."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 26309f7..cbfebd0 100644 (file)
@@ -80,4 +80,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 0df84c5..20464ba 100644 (file)
@@ -84,4 +84,7 @@ BEGIN
     IDS_DOWNLOADING "În curs de descărcare…"
     IDS_INSTALLING "În curs de instalare…"
     IDS_INVALID_SHA "Suma de control a fișierului descărcat nu corespunde. Deoarece fișierul a fost corupt, instalarea trebuie abandonată."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 00dc080..aae79bc 100644 (file)
@@ -78,4 +78,7 @@ BEGIN
     IDS_DOWNLOADING "Загрузка..."
     IDS_INSTALLING "Установка..."
     IDS_INVALID_SHA "Ошибка контрольной суммы загруженного файла. Прерывание установки поврежденного файла."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index c20ab5f..5fb25dd 100644 (file)
@@ -82,4 +82,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 6517d0b..4bdac02 100644 (file)
@@ -82,4 +82,7 @@ BEGIN
     IDS_DOWNLOADING "Shkarkim..."
     IDS_INSTALLING "Instalim..."
     IDS_INVALID_SHA "Kontroll i papritur ne shkarkimin e skedarit. Duke lënë instalimin e dokumentave të korruptuar."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 35c170a..8c9f657 100644 (file)
@@ -80,4 +80,7 @@ BEGIN
     IDS_DOWNLOADING "İndiriliyor..."
     IDS_INSTALLING "Kuruluyor..."
     IDS_INVALID_SHA "İndirilen kütüğün sağlama toplamı beklenmeyen. Bozuk kütüğün kurulumu iptal ediliyor."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 4c276fd..94d1d23 100644 (file)
@@ -86,4 +86,7 @@ BEGIN
     IDS_DOWNLOADING "Downloading..."
     IDS_INSTALLING "Installing..."
     IDS_INVALID_SHA "Unexpected checksum of downloaded file. Aborting installation of corrupted file."
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 9a07ba1..4be6c8b 100644 (file)
@@ -87,4 +87,7 @@ BEGIN
     IDS_DOWNLOADING "正在下载..."
     IDS_INSTALLING "正在安装..."
     IDS_INVALID_SHA "下载的文件校验和错误。中止安装已损坏的文件。"
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 083365a..b123d0f 100644 (file)
@@ -85,4 +85,7 @@ BEGIN
     IDS_DOWNLOADING "下載中..."
     IDS_INSTALLING "安裝中..."
     IDS_INVALID_SHA "意外的下載了的檔案的校驗和。中止安裝已損壞的檔案。"
+    IDS_NEW_INTERNET_SHORTCUT "New Internet Shortcut"
+    IDS_CANTMAKEINETSHORTCUT "Failed to create internet shortcut."
+    IDS_CANTMAKESHORTCUT "Failed to create shortcut."
 END
index 2f721ad..3df2999 100644 (file)
@@ -22,6 +22,9 @@
 #define IDS_CPLSYSTEMDESCRIPTION       2001
 #define IDS_CREATE_SHORTCUT         2021
 #define IDS_ERROR_NOT_FOUND         2022
+#define IDS_NEW_INTERNET_SHORTCUT   2023
+#define IDS_CANTMAKEINETSHORTCUT    2024
+#define IDS_CANTMAKESHORTCUT        2025
 
 #define IDS_DOWNLOADING        14
 #define IDS_INSTALLING         15