mirror of
https://github.com/reactos/reactos.git
synced 2025-05-16 15:50:24 +00:00
[RAPPS]
- remove the custom parser, add caching, accelerators and lazy loading support and more (patch by Ismael Ferreras Morezuelas) - modifications by me: - don't rely on an undocumented behavior when calling GetPrivateProfileStringW and check the return value instead (should get fixed in kernel32 too) - modify the packaging scripts so the resulting CAB file contains UTF16 encoded files and remove the re-encoding hack from the patch (this is backwards compatible as the previous parser implementation was UTF16 aware) CORE-9060 svn path=/trunk/; revision=66814
This commit is contained in:
parent
631b0ae9a1
commit
c7046c39bc
31 changed files with 508 additions and 1044 deletions
|
@ -7,7 +7,6 @@ list(APPEND SOURCE
|
|||
listview.c
|
||||
loaddlg.c
|
||||
misc.c
|
||||
parser.c
|
||||
richedit.c
|
||||
settingsdlg.c
|
||||
splitter.c
|
||||
|
|
|
@ -1 +1,10 @@
|
|||
..\..\..\output-MinGW-i386\host-tools\tools\cabman\cabman.exe -M mszip -S rappmgr.cab rapps\*.txt
|
||||
@echo off
|
||||
|
||||
mkdir rapps\utf16
|
||||
|
||||
for %%f in (rapps\*.txt) do (
|
||||
..\..\..\output-MinGW-i386\host-tools\tools\utf16le.exe "rapps\%%~nf.txt" "rapps\utf16\%%~nf.txt"
|
||||
)
|
||||
|
||||
..\..\..\output-MinGW-i386\host-tools\tools\cabman\cabman.exe -M mszip -S rappmgr.cab rapps\utf16\*.txt
|
||||
rmdir /s /q rapps\utf16
|
||||
|
|
|
@ -1 +1,9 @@
|
|||
../../../output-MinGW-i386/host-tools/tools/cabman/cabman -M mszip -S rappmgr.cab rapps/*.txt
|
||||
#/bin/sh
|
||||
cd rapps
|
||||
mkdir utf16
|
||||
for i in $(find -type f); do
|
||||
../../../../output-MinGW-i386/host-tools/tools/utf16le.exe $i utf16/$i
|
||||
done
|
||||
cd ..
|
||||
../../../output-MinGW-i386/host-tools/tools/cabman/cabman -M mszip -S rappmgr.cab rapps/utf16/*.txt
|
||||
rm -r rapps/uft16
|
|
@ -3,11 +3,32 @@
|
|||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/rapps/available.c
|
||||
* PURPOSE: Functions for working with availabled applications
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
|
||||
*/
|
||||
|
||||
#include <ndk/rtlfuncs.h>
|
||||
#include "rapps.h"
|
||||
|
||||
#define ADD_TEXT(a, b, c, d) \
|
||||
if (b[0] != '\0') \
|
||||
{ \
|
||||
LoadStringW(hInst, a, szText, _countof(szText)); \
|
||||
InsertRichEditText(szText, c); \
|
||||
InsertRichEditText(b, d); \
|
||||
} \
|
||||
|
||||
#define GET_STRING1(a, b) \
|
||||
if (!ParserGetString(a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
continue;
|
||||
|
||||
#define GET_STRING2(a, b) \
|
||||
if (!ParserGetString(a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
b[0] = '\0';
|
||||
|
||||
LIST_ENTRY CachedEntriesHead = {0};
|
||||
PLIST_ENTRY pCachedEntry = NULL;
|
||||
|
||||
BOOL
|
||||
ShowAvailableAppInfo(INT Index)
|
||||
{
|
||||
|
@ -20,19 +41,11 @@ ShowAvailableAppInfo(INT Index)
|
|||
|
||||
InsertRichEditText(L"\n", 0);
|
||||
|
||||
#define ADD_TEXT(a, b, c, d) \
|
||||
if (b[0] != '\0') \
|
||||
{ \
|
||||
LoadStringW(hInst, a, szText, sizeof(szText) / sizeof(WCHAR)); \
|
||||
InsertRichEditText(szText, c); \
|
||||
InsertRichEditText(b, d); \
|
||||
} \
|
||||
|
||||
ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
|
||||
ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_VERSION, Info->szVersion, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_LICENSE, Info->szLicense, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_SIZE, Info->szSize, CFE_BOLD, 0);
|
||||
ADD_TEXT(IDS_AINFO_URLSITE, Info->szUrlSite, CFE_BOLD, CFE_LINK);
|
||||
ADD_TEXT(IDS_AINFO_DESCRIPTION, Info->szDesc, CFE_BOLD, 0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -49,7 +62,7 @@ DeleteCurrentAppsDB(VOID)
|
|||
HRESULT hr;
|
||||
BOOL result = TRUE;
|
||||
|
||||
if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
|
@ -61,6 +74,7 @@ DeleteCurrentAppsDB(VOID)
|
|||
result = result && DeleteFileW(szCabPath);
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
|
@ -71,6 +85,7 @@ DeleteCurrentAppsDB(VOID)
|
|||
return FALSE;
|
||||
|
||||
hFind = FindFirstFileW(szSearchPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
return result;
|
||||
|
||||
|
@ -82,6 +97,7 @@ DeleteCurrentAppsDB(VOID)
|
|||
if (FAILED(hr))
|
||||
continue;
|
||||
result = result && DeleteFileW(szTmp);
|
||||
|
||||
} while (FindNextFileW(hFind, &FindFileData) != 0);
|
||||
|
||||
FindClose(hFind);
|
||||
|
@ -102,7 +118,7 @@ UpdateAppsDB(VOID)
|
|||
|
||||
DownloadApplicationsDB(APPLICATION_DATABASE_URL);
|
||||
|
||||
if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
if (FAILED(StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
|
@ -132,13 +148,18 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
|
|||
WIN32_FIND_DATAW FindFileData;
|
||||
WCHAR szPath[MAX_PATH];
|
||||
WCHAR szAppsPath[MAX_PATH];
|
||||
WCHAR szSectionLocale[MAX_PATH] = L"Section.";
|
||||
WCHAR szCabPath[MAX_PATH];
|
||||
WCHAR szLocale[4 + 1];
|
||||
APPLICATION_INFO Info;
|
||||
PAPPLICATION_INFO Info;
|
||||
HRESULT hr;
|
||||
|
||||
if (!GetStorageDirectory(szPath, sizeof(szPath) / sizeof(szPath[0])))
|
||||
/* initialize the cached list if hasn't been yet */
|
||||
if (pCachedEntry == NULL)
|
||||
{
|
||||
InitializeListHead(&CachedEntriesHead);
|
||||
pCachedEntry = &CachedEntriesHead;
|
||||
}
|
||||
|
||||
if (!GetStorageDirectory(szPath, _countof(szPath)))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbPrintfW(szCabPath, sizeof(szCabPath),
|
||||
|
@ -148,9 +169,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
|
|||
return FALSE;
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"\\rapps\\");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hr = StringCbCopyW(szAppsPath, sizeof(szAppsPath), szPath);
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
|
@ -161,10 +185,12 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
|
|||
}
|
||||
|
||||
hr = StringCbCatW(szPath, sizeof(szPath), L"*.txt");
|
||||
|
||||
if (FAILED(hr))
|
||||
return FALSE;
|
||||
|
||||
hFind = FindFirstFileW(szPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (GetFileAttributesW(szCabPath) == INVALID_FILE_ATTRIBUTES)
|
||||
|
@ -172,61 +198,84 @@ EnumAvailableApplications(INT EnumType, AVAILENUMPROC lpEnumProc)
|
|||
|
||||
ExtractFilesFromCab(szCabPath, szAppsPath);
|
||||
hFind = FindFirstFileW(szPath, &FindFileData);
|
||||
|
||||
if (hFind == INVALID_HANDLE_VALUE)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
|
||||
szLocale, sizeof(szLocale) / sizeof(WCHAR)))
|
||||
{
|
||||
FindClose(hFind);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hr = StringCbCatW(szSectionLocale, sizeof(szSectionLocale), szLocale);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
FindClose(hFind);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define GET_STRING1(a, b) \
|
||||
if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
continue;
|
||||
|
||||
#define GET_STRING2(a, b) \
|
||||
if (!ParserGetString(szSectionLocale, a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
if (!ParserGetString(L"Section", a, b, MAX_PATH, FindFileData.cFileName)) \
|
||||
b[0] = '\0';
|
||||
|
||||
do
|
||||
{
|
||||
Info.Category = ParserGetInt(szSectionLocale, L"Category", FindFileData.cFileName);
|
||||
if (Info.Category == -1)
|
||||
/* loop for all the cached entries */
|
||||
for (pCachedEntry = CachedEntriesHead.Flink; pCachedEntry != &CachedEntriesHead; pCachedEntry = pCachedEntry->Flink)
|
||||
{
|
||||
Info.Category = ParserGetInt(L"Section", L"Category", FindFileData.cFileName);
|
||||
if (Info.Category == -1)
|
||||
continue;
|
||||
Info = CONTAINING_RECORD(pCachedEntry, APPLICATION_INFO, List);
|
||||
|
||||
/* do we already have this entry in cache? */
|
||||
if(_wcsicmp(FindFileData.cFileName, Info->cFileName) == 0)
|
||||
{
|
||||
/* is it current enough, or the file has been modified since our last time here? */
|
||||
if (CompareFileTime(&FindFileData.ftLastWriteTime, &Info->ftCacheStamp) == 1)
|
||||
{
|
||||
/* recreate our cache, this is the slow path */
|
||||
RemoveEntryList(&Info->List);
|
||||
HeapFree(GetProcessHeap(), 0, Info);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* speedy path, compare directly, we already have the data */
|
||||
goto skip_if_cached;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (EnumType != Info.Category && EnumType != ENUM_ALL_AVAILABLE) continue;
|
||||
/* create a new entry */
|
||||
Info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(APPLICATION_INFO));
|
||||
|
||||
GET_STRING1(L"Name", Info.szName);
|
||||
GET_STRING1(L"URLDownload", Info.szUrlDownload);
|
||||
if(!Info)
|
||||
break;
|
||||
|
||||
GET_STRING2(L"RegName", Info.szRegName);
|
||||
GET_STRING2(L"Version", Info.szVersion);
|
||||
GET_STRING2(L"License", Info.szLicense);
|
||||
GET_STRING2(L"Description", Info.szDesc);
|
||||
GET_STRING2(L"Size", Info.szSize);
|
||||
GET_STRING2(L"URLSite", Info.szUrlSite);
|
||||
GET_STRING2(L"CDPath", Info.szCDPath);
|
||||
Info->Category = ParserGetInt(L"Category", FindFileData.cFileName);
|
||||
|
||||
/* copy the cache-related fields for the next time */
|
||||
RtlCopyMemory(&Info->cFileName, &FindFileData.cFileName, MAX_PATH);
|
||||
RtlCopyMemory(&Info->ftCacheStamp, &FindFileData.ftLastWriteTime, sizeof(FILETIME));
|
||||
|
||||
/* add our cached entry to the cached list */
|
||||
InsertTailList(&CachedEntriesHead, &Info->List);
|
||||
|
||||
skip_if_cached:
|
||||
|
||||
if (Info->Category == -1)
|
||||
continue;
|
||||
|
||||
if (EnumType != Info->Category && EnumType != ENUM_ALL_AVAILABLE)
|
||||
continue;
|
||||
|
||||
/* if our cache hit was only partial, we need to parse
|
||||
and lazily fill the rest of fields only when needed */
|
||||
|
||||
if (Info->szUrlDownload[0] == 0)
|
||||
{
|
||||
GET_STRING1(L"Name", Info->szName);
|
||||
GET_STRING1(L"URLDownload", Info->szUrlDownload);
|
||||
|
||||
GET_STRING2(L"RegName", Info->szRegName);
|
||||
GET_STRING2(L"Version", Info->szVersion);
|
||||
GET_STRING2(L"License", Info->szLicense);
|
||||
GET_STRING2(L"Description", Info->szDesc);
|
||||
GET_STRING2(L"Size", Info->szSize);
|
||||
GET_STRING2(L"URLSite", Info->szUrlSite);
|
||||
GET_STRING2(L"CDPath", Info->szCDPath);
|
||||
}
|
||||
|
||||
if (!lpEnumProc(Info))
|
||||
break;
|
||||
|
||||
if (!lpEnumProc(&Info)) break;
|
||||
} while (FindNextFileW(hFind, &FindFileData) != 0);
|
||||
|
||||
FindClose(hFind);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
|
@ -14,19 +14,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Приложения"
|
||||
BEGIN
|
||||
MENUITEM "&Слагане", ID_INSTALL
|
||||
MENUITEM "&Махане", ID_UNINSTALL
|
||||
MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Промяна", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "О&пресняване", ID_REFRESH
|
||||
MENUITEM "О&пресняване\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Помощ"
|
||||
BEGIN
|
||||
MENUITEM "Помощ", ID_HELP, GRAYED
|
||||
MENUITEM "Помощ\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "За", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Слагане", ID_INSTALL
|
||||
MENUITEM "&Махане", ID_UNINSTALL
|
||||
MENUITEM "&Слагане\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Махане\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Промяна", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Пре&махване от регистъра", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "О&пресняване", ID_REFRESH
|
||||
MENUITEM "О&пресняване\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -15,19 +15,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programy"
|
||||
BEGIN
|
||||
MENUITEM "&Instalovat", ID_INSTALL
|
||||
MENUITEM "&Odinstalovat", ID_UNINSTALL
|
||||
MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Změnit", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Odstranit z ®istru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ob&novit", ID_REFRESH
|
||||
MENUITEM "Ob&novit\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aktualizovat databázi", ID_RESETDB
|
||||
MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Nápověda"
|
||||
BEGIN
|
||||
MENUITEM "Nápověda", ID_HELP, GRAYED
|
||||
MENUITEM "Nápověda\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "O programu...", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instalovat", ID_INSTALL
|
||||
MENUITEM "&Odinstalovat", ID_UNINSTALL
|
||||
MENUITEM "&Instalovat\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Odinstalovat\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Změnit", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Odstranit z ®istru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ob&novit", ID_REFRESH
|
||||
MENUITEM "Ob&novit\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aktualizovat databázi", ID_RESETDB
|
||||
MENUITEM "&Aktualizovat databázi\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programme"
|
||||
BEGIN
|
||||
MENUITEM "&Installieren", ID_INSTALL
|
||||
MENUITEM "&Deinstallieren", ID_UNINSTALL
|
||||
MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Ändern", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aktualisieren", ID_REFRESH
|
||||
MENUITEM "&Aktualisieren\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Da&tenbank aktualisieren", ID_RESETDB
|
||||
MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Hilfe"
|
||||
BEGIN
|
||||
MENUITEM "Hilfe", ID_HELP, GRAYED
|
||||
MENUITEM "Hilfe\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Über", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Installieren", ID_INSTALL
|
||||
MENUITEM "&Deinstallieren", ID_UNINSTALL
|
||||
MENUITEM "&Installieren\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Deinstallieren\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Ändern", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Aus &Registry entfernen", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aktualisieren", ID_REFRESH
|
||||
MENUITEM "&Aktualisieren\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Da&tenbank aktualisieren", ID_RESETDB
|
||||
MENUITEM "Da&tenbank aktualisieren\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programs"
|
||||
BEGIN
|
||||
MENUITEM "&Install", ID_INSTALL
|
||||
MENUITEM "&Uninstall", ID_UNINSTALL
|
||||
MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modify", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remove from Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Refresh", ID_REFRESH
|
||||
MENUITEM "&Refresh\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Help"
|
||||
BEGIN
|
||||
MENUITEM "Help", ID_HELP, GRAYED
|
||||
MENUITEM "Help\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "About", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Install", ID_INSTALL
|
||||
MENUITEM "&Uninstall", ID_UNINSTALL
|
||||
MENUITEM "&Install\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modify", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remove from Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Refresh", ID_REFRESH
|
||||
MENUITEM "&Refresh\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -13,19 +13,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programas"
|
||||
BEGIN
|
||||
MENUITEM "&Instalar", ID_INSTALL
|
||||
MENUITEM "&Desinstalar", ID_UNINSTALL
|
||||
MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
|
||||
MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
|
||||
MENUITEM "&Modificar", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Eliminar del Registro", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Recargar", ID_REFRESH
|
||||
MENUITEM "&Recargar\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Actualizar el listado desde Internet", ID_RESETDB
|
||||
MENUITEM "&Actualizar el listado desde Internet\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Ayuda"
|
||||
BEGIN
|
||||
MENUITEM "Ayuda", ID_HELP, GRAYED
|
||||
MENUITEM "Ayuda\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Acerca de", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -43,19 +43,19 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instalar", ID_INSTALL
|
||||
MENUITEM "&Desinstalar", ID_UNINSTALL
|
||||
MENUITEM "&Instalar\tCtrl+Intro", ID_INSTALL
|
||||
MENUITEM "&Desinstalar\tCtrl+Supr", ID_UNINSTALL
|
||||
MENUITEM "&Modificar", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Eliminar del Registro", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Recargar", ID_REFRESH
|
||||
MENUITEM "&Recargar\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Actualizar listado desde Internet", ID_RESETDB
|
||||
MENUITEM "&Actualizar listado desde Internet\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
IDD_SETTINGS_DIALOG DIALOGEX 0, 0, 250, 215
|
||||
IDD_SETTINGS_DIALOG DIALOGEX 0, 0, 250, 200
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Ajustes"
|
||||
FONT 8, "MS Shell Dlg"
|
||||
|
@ -69,16 +69,16 @@ BEGIN
|
|||
EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL
|
||||
PUSHBUTTON "&Seleccionar", IDC_CHOOSE, 187, 85, 50, 14
|
||||
AUTOCHECKBOX "&Borrar el instalador del programa tras su instalación", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12
|
||||
GROUPBOX "Proxy", -1, 4, 116, 240, 76
|
||||
CONTROL "System proxy settings", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 130, 210, 10
|
||||
CONTROL "Direct (No proxy)", IDC_NO_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 145, 210, 10
|
||||
CONTROL "Proxy", IDC_USE_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 160, 74, 10
|
||||
EDITTEXT IDC_PROXY_SERVER, 90, 160, 147, 12, ES_AUTOHSCROLL | WS_DISABLED
|
||||
LTEXT "No proxy for", -1, 27, 175, 64, 10
|
||||
EDITTEXT IDC_NO_PROXY_FOR, 90, 175, 147, 12, ES_AUTOHSCROLL | WS_DISABLED
|
||||
PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 195, 60, 14
|
||||
PUSHBUTTON "Aceptar", IDOK, 116, 195, 60, 14
|
||||
PUSHBUTTON "Cancelar", IDCANCEL, 181, 195, 60, 14
|
||||
GROUPBOX "Proxy", -1, 4, 116, 240, 61
|
||||
CONTROL "Utilizar el proxy del sistema", IDC_PROXY_DEFAULT, "Button", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 128, 218, 10
|
||||
CONTROL "Conexión directa (sin nada)", IDC_NO_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 141, 218, 10
|
||||
CONTROL "Proxy:", IDC_USE_PROXY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 15, 154, 35, 10
|
||||
EDITTEXT IDC_PROXY_SERVER, 51, 153, 70, 14, ES_AUTOHSCROLL
|
||||
LTEXT "Sin proxy para:", -1, 125, 154, 50, 8, SS_RIGHT
|
||||
EDITTEXT IDC_NO_PROXY_FOR, 177, 153, 61, 14, ES_AUTOHSCROLL
|
||||
PUSHBUTTON "Por defecto", IDC_DEFAULT_SETTINGS, 8, 180, 60, 14
|
||||
PUSHBUTTON "Aceptar", IDOK, 116, 180, 60, 14
|
||||
PUSHBUTTON "Cancelar", IDCANCEL, 181, 180, 60, 14
|
||||
END
|
||||
|
||||
IDD_INSTALL_DIALOG DIALOGEX 0, 0, 216, 97
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programmes"
|
||||
BEGIN
|
||||
MENUITEM "&Installer", ID_INSTALL
|
||||
MENUITEM "&Désinstaller", ID_UNINSTALL
|
||||
MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifier", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Supprimer du registre", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Rafraîchir", ID_REFRESH
|
||||
MENUITEM "&Rafraîchir\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Me&ttre à jour la base", ID_RESETDB
|
||||
MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Aide"
|
||||
BEGIN
|
||||
MENUITEM "Aide", ID_HELP, GRAYED
|
||||
MENUITEM "Aide\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "À propos", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Installer", ID_INSTALL
|
||||
MENUITEM "&Désinstaller", ID_UNINSTALL
|
||||
MENUITEM "&Installer\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Désinstaller\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifier", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Supprimer du registre", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Rafraîchir", ID_REFRESH
|
||||
MENUITEM "&Rafraîchir\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Me&ttre à jour la base", ID_RESETDB
|
||||
MENUITEM "Me&ttre à jour la base\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -12,19 +12,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&תכניות"
|
||||
BEGIN
|
||||
MENUITEM "התקנה", ID_INSTALL
|
||||
MENUITEM "הסרה", ID_UNINSTALL
|
||||
MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "שינוי", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "הסרה מהרשום", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "רענון", ID_REFRESH
|
||||
MENUITEM "רענון\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "עזרה"
|
||||
BEGIN
|
||||
MENUITEM "עזרה", ID_HELP, GRAYED
|
||||
MENUITEM "עזרה\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "אודות", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "התקנה", ID_INSTALL
|
||||
MENUITEM "הסרה", ID_UNINSTALL
|
||||
MENUITEM "התקנה\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "הסרה\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "שינוי", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "הסרה מהרשום", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "רענן", ID_REFRESH
|
||||
MENUITEM "רענן\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programmi"
|
||||
BEGIN
|
||||
MENUITEM "&Installa", ID_INSTALL
|
||||
MENUITEM "&Disinstalla", ID_UNINSTALL
|
||||
MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifica", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remuovi da Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aggiorna", ID_REFRESH
|
||||
MENUITEM "&Aggiorna\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
END
|
||||
POPUP "?"
|
||||
BEGIN
|
||||
MENUITEM "Guida", ID_HELP, GRAYED
|
||||
MENUITEM "Guida\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Informazioni", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Installa", ID_INSTALL
|
||||
MENUITEM "&Disinstalla", ID_UNINSTALL
|
||||
MENUITEM "&Installa\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Disinstalla\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifica", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Rimuovi da Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Aggiorna", ID_REFRESH
|
||||
MENUITEM "&Aggiorna\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "プログラム(&P)"
|
||||
BEGIN
|
||||
MENUITEM "インストール(&I)", ID_INSTALL
|
||||
MENUITEM "アンインストール(&U)", ID_UNINSTALL
|
||||
MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "変更(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "レジストリから削除(&R)", ID_REGREMOVE
|
||||
MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新(&R)", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "アップデート データベース(&T)", ID_RESETDB
|
||||
MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "ヘルプ"
|
||||
BEGIN
|
||||
MENUITEM "ヘルプ", ID_HELP, GRAYED
|
||||
MENUITEM "ヘルプ\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "バージョン情報", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "インストール(&I)", ID_INSTALL
|
||||
MENUITEM "アンインストール(&U)", ID_UNINSTALL
|
||||
MENUITEM "インストール(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "アンインストール(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "変更(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "レジストリから削除(&R)", ID_REGREMOVE
|
||||
MENUITEM "レジストリから削除(&R)\tF5", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新(&R)", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "アップデート データベース(&T)", ID_RESETDB
|
||||
MENUITEM "アップデート データベース(&T)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programmer"
|
||||
BEGIN
|
||||
MENUITEM "&Installere", ID_INSTALL
|
||||
MENUITEM "&Avinstallere", ID_UNINSTALL
|
||||
MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Endre", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remove from Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Oppdatere", ID_REFRESH
|
||||
MENUITEM "&Oppdatere\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Hjelp"
|
||||
BEGIN
|
||||
MENUITEM "Hjelp", ID_HELP, GRAYED
|
||||
MENUITEM "Hjelp\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Om", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -32,7 +32,7 @@ BEGIN
|
|||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Åpne lenke i en nettleser", ID_OPEN_LINK
|
||||
MENUITEM "&Kopier lenke til utklipptavlen", ID_COPY_LINK
|
||||
MENUITEM "&Kopier lenke til utklipptavlen", ID_COPY_LINK
|
||||
END
|
||||
END
|
||||
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Installere", ID_INSTALL
|
||||
MENUITEM "&Avinstallere", ID_UNINSTALL
|
||||
MENUITEM "&Installere\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Avinstallere\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Endre", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remove from Registry", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Oppdater", ID_REFRESH
|
||||
MENUITEM "&Oppdater\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -18,19 +18,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programy"
|
||||
BEGIN
|
||||
MENUITEM "&Instaluj", ID_INSTALL
|
||||
MENUITEM "&Odinstaluj", ID_UNINSTALL
|
||||
MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modyfikuj", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Usuń z rejestru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "O&dśwież", ID_REFRESH
|
||||
MENUITEM "O&dśwież\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB
|
||||
MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Pomoc"
|
||||
BEGIN
|
||||
MENUITEM "Pomoc", ID_HELP, GRAYED
|
||||
MENUITEM "Pomoc\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "O programie", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instaluj", ID_INSTALL
|
||||
MENUITEM "&Odinstaluj", ID_UNINSTALL
|
||||
MENUITEM "&Instaluj\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Odinstaluj\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modyfikuj", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Usuń z rejestru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Odśwież", ID_REFRESH
|
||||
MENUITEM "&Odśwież\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ak&tualizuj bazę programów", ID_RESETDB
|
||||
MENUITEM "Ak&tualizuj bazę programów\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -12,19 +12,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programas"
|
||||
BEGIN
|
||||
MENUITEM "I&nstalar", ID_INSTALL
|
||||
MENUITEM "&Desinstalar", ID_UNINSTALL
|
||||
MENUITEM "I&nstalar\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modificar", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remover do Registro", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "A&tualizar", ID_REFRESH
|
||||
MENUITEM "A&tualizar\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Aj&uda"
|
||||
BEGIN
|
||||
MENUITEM "Aj&uda", ID_HELP, GRAYED
|
||||
MENUITEM "Aj&uda\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "&Sobre", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instalar", ID_INSTALL
|
||||
MENUITEM "&Desinstalar", ID_UNINSTALL
|
||||
MENUITEM "&Instalar\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Desinstalar\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modificar", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Remover do Registro", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Atualizar", ID_REFRESH
|
||||
MENUITEM "&Atualizar\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -16,19 +16,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programe"
|
||||
BEGIN
|
||||
MENUITEM "&Instalează", ID_INSTALL
|
||||
MENUITEM "&Dezinstalează", ID_UNINSTALL
|
||||
MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifică", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Elimină din registru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Împ&rospătează", ID_REFRESH
|
||||
MENUITEM "Împ&rospătează\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Actualizează baza de date", ID_RESETDB
|
||||
MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Aj&utor"
|
||||
BEGIN
|
||||
MENUITEM "&Manual…", ID_HELP, GRAYED
|
||||
MENUITEM "&Manual…\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "&Despre…", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -46,15 +46,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instalează", ID_INSTALL
|
||||
MENUITEM "&Dezinstalează", ID_UNINSTALL
|
||||
MENUITEM "&Instalează\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Dezinstalează\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifică", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Elimină din registru", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Împ&rospătează", ID_REFRESH
|
||||
MENUITEM "Împ&rospătează\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Actualizează baza de date", ID_RESETDB
|
||||
MENUITEM "&Actualizează baza de date\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -10,19 +10,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Программы"
|
||||
BEGIN
|
||||
MENUITEM "У&становить", ID_INSTALL
|
||||
MENUITEM "&Удалить", ID_UNINSTALL
|
||||
MENUITEM "У&становить\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Изменить", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "У&далить из реестра", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Обновить", ID_REFRESH
|
||||
MENUITEM "&Обновить\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Обновить &базу данных", ID_RESETDB
|
||||
MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Справка"
|
||||
BEGIN
|
||||
MENUITEM "Содержание", ID_HELP, GRAYED
|
||||
MENUITEM "Содержание\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "О программе", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -40,15 +40,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Установить", ID_INSTALL
|
||||
MENUITEM "&Удалить", ID_UNINSTALL
|
||||
MENUITEM "&Установить\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Удалить\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Изменить", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "У&далить из реестра", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Обновить", ID_REFRESH
|
||||
MENUITEM "&Обновить\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Обновить &базу данных", ID_RESETDB
|
||||
MENUITEM "Обновить &базу данных\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -15,19 +15,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programy"
|
||||
BEGIN
|
||||
MENUITEM "&Inštalovať", ID_INSTALL
|
||||
MENUITEM "O&dinštalovať", ID_UNINSTALL
|
||||
MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Zmeniť", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Obnoviť", ID_REFRESH
|
||||
MENUITEM "&Obnoviť\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Pomocník"
|
||||
BEGIN
|
||||
MENUITEM "Pomocník", ID_HELP, GRAYED
|
||||
MENUITEM "Pomocník\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Čo je ...", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -45,15 +45,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Inštalovať", ID_INSTALL
|
||||
MENUITEM "O&dinštalovať", ID_UNINSTALL
|
||||
MENUITEM "&Inštalovať\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "O&dinštalovať\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Zmeniť", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Odst&rániť z Registrov", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Obnoviť", ID_REFRESH
|
||||
MENUITEM "&Obnoviť\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -14,19 +14,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Programe"
|
||||
BEGIN
|
||||
MENUITEM "&Instalo", ID_INSTALL
|
||||
MENUITEM "&Uninstall", ID_UNINSTALL
|
||||
MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifiko", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Rifresko", ID_REFRESH
|
||||
MENUITEM "&Rifresko\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Ndihmë"
|
||||
BEGIN
|
||||
MENUITEM "Ndihmë", ID_HELP, GRAYED
|
||||
MENUITEM "Ndihmë\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Rreth", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -44,15 +44,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Instalo", ID_INSTALL
|
||||
MENUITEM "&Uninstall", ID_UNINSTALL
|
||||
MENUITEM "&Instalo\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Uninstall\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Modifiko", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Hiq nga Regjistri", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Rifresko", ID_REFRESH
|
||||
MENUITEM "&Rifresko\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -17,19 +17,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Program"
|
||||
BEGIN
|
||||
MENUITEM "&Installera", ID_INSTALL
|
||||
MENUITEM "&Avinstallera", ID_UNINSTALL
|
||||
MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Ändra", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Ta bort från Registret", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Uppdatera", ID_REFRESH
|
||||
MENUITEM "&Uppdatera\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "Hjälp"
|
||||
BEGIN
|
||||
MENUITEM "Hjälp", ID_HELP, GRAYED
|
||||
MENUITEM "Hjälp\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Om...", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -47,15 +47,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Installera", ID_INSTALL
|
||||
MENUITEM "&Avinstallera", ID_UNINSTALL
|
||||
MENUITEM "&Installera\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "&Avinstallera\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Ändra", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Ta bort från Registret", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Uppdatera", ID_REFRESH
|
||||
MENUITEM "&Uppdatera\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -12,19 +12,19 @@ BEGIN
|
|||
END
|
||||
POPUP "Y&azılım"
|
||||
BEGIN
|
||||
MENUITEM "&Kur", ID_INSTALL
|
||||
MENUITEM "K&aldır", ID_UNINSTALL
|
||||
MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Değiştir", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Yenile", ID_REFRESH
|
||||
MENUITEM "&Yenile\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ya&zılım Veri Tabanını Yenile", ID_RESETDB
|
||||
MENUITEM "Ya&zılım Veri Tabanını Yenile\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "&Yardım"
|
||||
BEGIN
|
||||
MENUITEM "&Yardım", ID_HELP, GRAYED
|
||||
MENUITEM "&Yardım\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "&Üzerine...", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Kur", ID_INSTALL
|
||||
MENUITEM "K&aldır", ID_UNINSTALL
|
||||
MENUITEM "&Kur\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "K&aldır\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Değiştir", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Girişi Değer Defteri'nden Kaldır", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Yenile", ID_REFRESH
|
||||
MENUITEM "&Yenile\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Ya&zılım Veri Tabanını Yenile", ID_RESETDB
|
||||
MENUITEM "Ya&zılım Veri Tabanını Yenile\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -18,19 +18,19 @@ BEGIN
|
|||
END
|
||||
POPUP "&Програми"
|
||||
BEGIN
|
||||
MENUITEM "&Встановити", ID_INSTALL
|
||||
MENUITEM "Вид&алити", ID_UNINSTALL
|
||||
MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "Вид&алити\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Змінити", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Вида&лити з реєстру", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Оновити", ID_REFRESH
|
||||
MENUITEM "&Оновити\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "&Довідка"
|
||||
BEGIN
|
||||
MENUITEM "Дов&ідка", ID_HELP, GRAYED
|
||||
MENUITEM "Дов&ідка\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "Про про&граму...", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -48,15 +48,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "&Встановити", ID_INSTALL
|
||||
MENUITEM "В&идалити", ID_UNINSTALL
|
||||
MENUITEM "&Встановити\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "В&идалити\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "&Змінити", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Вид&алити з реєстру", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Оновити", ID_REFRESH
|
||||
MENUITEM "&Оновити\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Update Da&tabase", ID_RESETDB
|
||||
MENUITEM "Update Da&tabase\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -12,19 +12,19 @@ BEGIN
|
|||
END
|
||||
POPUP "程序(&P)"
|
||||
BEGIN
|
||||
MENUITEM "安装(&I)", ID_INSTALL
|
||||
MENUITEM "卸载(&U)", ID_UNINSTALL
|
||||
MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "修改(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "从注册表删除(&E)", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "刷新(&R)", ID_REFRESH
|
||||
MENUITEM "刷新(&R)\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新数据库(&A)", ID_RESETDB
|
||||
MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "帮助"
|
||||
BEGIN
|
||||
MENUITEM "帮助内容", ID_HELP, GRAYED
|
||||
MENUITEM "帮助内容\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "关于", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "安装(&I)", ID_INSTALL
|
||||
MENUITEM "卸载(&U)", ID_UNINSTALL
|
||||
MENUITEM "安装(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "卸载(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "修改(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "从注册表删除(&E)", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "刷新(&R)", ID_REFRESH
|
||||
MENUITEM "刷新(&R)\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新数据库(&A)", ID_RESETDB
|
||||
MENUITEM "更新数据库(&A)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -12,19 +12,19 @@ BEGIN
|
|||
END
|
||||
POPUP "程式(&P)"
|
||||
BEGIN
|
||||
MENUITEM "安裝(&I)", ID_INSTALL
|
||||
MENUITEM "解除安裝(&U)", ID_UNINSTALL
|
||||
MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "修改(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "重新整理(&R)", ID_REFRESH
|
||||
MENUITEM "重新整理(&R)\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新資料庫(&A)", ID_RESETDB
|
||||
MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
POPUP "幫助"
|
||||
BEGIN
|
||||
MENUITEM "幫助內容", ID_HELP, GRAYED
|
||||
MENUITEM "幫助內容\tF1", ID_HELP, GRAYED
|
||||
MENUITEM "關於", ID_ABOUT
|
||||
END
|
||||
END
|
||||
|
@ -42,15 +42,15 @@ IDR_APPLICATIONMENU MENU
|
|||
BEGIN
|
||||
POPUP "popup"
|
||||
BEGIN
|
||||
MENUITEM "安裝(&I)", ID_INSTALL
|
||||
MENUITEM "解除安裝(&U)", ID_UNINSTALL
|
||||
MENUITEM "安裝(&I)\tCtrl+Enter", ID_INSTALL
|
||||
MENUITEM "解除安裝(&U)\tCtrl+Del", ID_UNINSTALL
|
||||
MENUITEM "修改(&M)", ID_MODIFY
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "從登錄檔刪除(&E)", ID_REGREMOVE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "重新整理(&R)", ID_REFRESH
|
||||
MENUITEM "重新整理(&R)\tF5", ID_REFRESH
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "更新資料庫(&A)", ID_RESETDB
|
||||
MENUITEM "更新資料庫(&A)\tCtrl+F5", ID_RESETDB
|
||||
END
|
||||
END
|
||||
|
||||
|
|
|
@ -3,9 +3,11 @@
|
|||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/rapps/misc.c
|
||||
* PURPOSE: Misc functions
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
|
||||
*/
|
||||
|
||||
#include <ndk/rtlfuncs.h>
|
||||
#include "rapps.h"
|
||||
|
||||
/* SESSION Operation */
|
||||
|
@ -13,6 +15,9 @@
|
|||
#define EXTRACT_EXTRACTFILES 0x00000002
|
||||
|
||||
static HANDLE hLog = NULL;
|
||||
WCHAR szCachedINISectionLocale[MAX_PATH] = L"Section.";
|
||||
WCHAR szCachedINISectionLocaleNeutral[MAX_PATH] = {0};
|
||||
BYTE bCachedSectionStatus = FALSE;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
@ -168,6 +173,7 @@ ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
|
|||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STATE;
|
||||
GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii);
|
||||
|
||||
if (!(mii.fState & MFS_GRAYED))
|
||||
SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
|
||||
|
||||
|
@ -392,3 +398,117 @@ WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg)
|
|||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
LPWSTR GetINIFullPath(LPCWSTR lpFileName)
|
||||
{
|
||||
WCHAR szDir[MAX_PATH];
|
||||
static WCHAR szBuffer[MAX_PATH];
|
||||
|
||||
GetStorageDirectory(szDir, _countof(szDir));
|
||||
StringCbPrintfW(szBuffer, sizeof(szBuffer), L"%ls\\rapps\\%ls", szDir, lpFileName);
|
||||
|
||||
return szBuffer;
|
||||
}
|
||||
|
||||
|
||||
UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName)
|
||||
{
|
||||
PWSTR lpFullFileName = GetINIFullPath(lpFileName);
|
||||
LPSTR lpRequiredBuf = HeapAlloc(GetProcessHeap(), 0, nSize);
|
||||
DWORD dwResult;
|
||||
|
||||
if (!lpRequiredBuf)
|
||||
return FALSE;
|
||||
|
||||
/* we don't have cached section strings for the current system language, create them */
|
||||
if(bCachedSectionStatus == FALSE)
|
||||
{
|
||||
WCHAR szLocale[4 + 1];
|
||||
DWORD len;
|
||||
|
||||
/* find out what is the current system lang code (e.g. "0a") and append it to SectionLocale */
|
||||
GetLocaleInfoW(GetUserDefaultLCID(), LOCALE_ILANGUAGE,
|
||||
szLocale, _countof(szLocale));
|
||||
|
||||
StringCbCatW(szCachedINISectionLocale, sizeof(szCachedINISectionLocale), szLocale);
|
||||
|
||||
/* copy the locale-dependent string into the buffer of the future neutral one */
|
||||
StringCbCopyW(szCachedINISectionLocaleNeutral,
|
||||
sizeof(szCachedINISectionLocale),
|
||||
szCachedINISectionLocale);
|
||||
|
||||
/* turn "Section.0c0a" into "Section.0a", keeping just the neutral lang part */
|
||||
len = wcslen(szCachedINISectionLocale);
|
||||
|
||||
memmove((szCachedINISectionLocaleNeutral + len) - 4,
|
||||
(szCachedINISectionLocaleNeutral + len) - 2,
|
||||
(2 * sizeof(WCHAR)) + sizeof(UNICODE_NULL));
|
||||
|
||||
/* finally, mark us as cache-friendly for the next time */
|
||||
bCachedSectionStatus = TRUE;
|
||||
}
|
||||
|
||||
/* 1st - find localized strings (e.g. "Section.0c0a") */
|
||||
dwResult = GetPrivateProfileStringW(szCachedINISectionLocale,
|
||||
lpKeyName,
|
||||
NULL,
|
||||
lpReturnedString,
|
||||
nSize,
|
||||
lpFullFileName);
|
||||
|
||||
if (dwResult != 0)
|
||||
goto skip;
|
||||
|
||||
/* 2nd - if they weren't present check for neutral sub-langs/ generic translations (e.g. "Section.0a") */
|
||||
dwResult = GetPrivateProfileStringW(szCachedINISectionLocaleNeutral,
|
||||
lpKeyName,
|
||||
NULL,
|
||||
lpReturnedString,
|
||||
nSize,
|
||||
lpFullFileName);
|
||||
|
||||
if (dwResult != 0)
|
||||
goto skip;
|
||||
|
||||
/* 3rd - if they weren't present fallback to standard english strings (just "Section") */
|
||||
dwResult = GetPrivateProfileStringW(L"Section",
|
||||
lpKeyName,
|
||||
NULL,
|
||||
lpReturnedString,
|
||||
nSize,
|
||||
lpFullFileName);
|
||||
|
||||
if (dwResult == 0)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, lpRequiredBuf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
skip:
|
||||
|
||||
/* get rid of the dynamically allocated ANSI buffer */
|
||||
HeapFree(GetProcessHeap(), 0, lpRequiredBuf);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName)
|
||||
{
|
||||
WCHAR Buffer[30];
|
||||
UNICODE_STRING BufferW;
|
||||
ULONG Result;
|
||||
|
||||
/* grab the text version of our entry */
|
||||
if (!ParserGetString(lpKeyName, Buffer, _countof(Buffer), lpFileName))
|
||||
return FALSE;
|
||||
|
||||
if (!Buffer[0])
|
||||
return FALSE;
|
||||
|
||||
/* convert it to an actual integer */
|
||||
RtlInitUnicodeString(&BufferW, Buffer);
|
||||
RtlUnicodeStringToInteger(&BufferW, 0, &Result);
|
||||
|
||||
return Result;
|
||||
}
|
|
@ -1,750 +0,0 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Applications Manager
|
||||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/rapps/parser.c
|
||||
* PURPOSE: Parser functions
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
*/
|
||||
|
||||
#include "rapps.h"
|
||||
|
||||
typedef LONG NTSTATUS;
|
||||
|
||||
typedef struct _UNICODE_STRING {
|
||||
USHORT Length;
|
||||
USHORT MaximumLength;
|
||||
PWSTR Buffer;
|
||||
} UNICODE_STRING, *PUNICODE_STRING;
|
||||
|
||||
void WINAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR);
|
||||
NTSTATUS WINAPI RtlUnicodeStringToInteger(const UNICODE_STRING*,ULONG,ULONG*);
|
||||
BOOLEAN WINAPI RtlIsTextUnicode(LPCVOID,INT,INT*);
|
||||
|
||||
static const char bom_utf8[] = {0xEF,0xBB,0xBF};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
ENCODING_UTF8 = 1,
|
||||
ENCODING_UTF16LE,
|
||||
ENCODING_UTF16BE
|
||||
} ENCODING;
|
||||
|
||||
typedef struct tagSECTIONKEY
|
||||
{
|
||||
WCHAR *value;
|
||||
struct tagSECTIONKEY *next;
|
||||
WCHAR name[1];
|
||||
} SECTIONKEY;
|
||||
|
||||
typedef struct tagSECTION
|
||||
{
|
||||
struct tagSECTIONKEY *key;
|
||||
struct tagSECTION *next;
|
||||
WCHAR name[1];
|
||||
} SECTION;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
BOOL changed;
|
||||
SECTION *section;
|
||||
WCHAR *filename;
|
||||
ENCODING encoding;
|
||||
} ITEMS;
|
||||
|
||||
|
||||
#define N_CACHED_ITEMS 10
|
||||
static ITEMS *ItemsArray[N_CACHED_ITEMS] = {NULL};
|
||||
#define CurProfile (ItemsArray[0])
|
||||
#define IS_ENTRY_COMMENT(str) ((str)[0] == ';')
|
||||
#define ParserIsSpace(c) (iswspace(c) || c == 0x1a)
|
||||
|
||||
|
||||
static
|
||||
WCHAR*
|
||||
memchrW(const WCHAR *ptr, WCHAR ch, size_t n)
|
||||
{
|
||||
const WCHAR *end;
|
||||
for (end = ptr + n; ptr < end; ptr++)
|
||||
if (*ptr == ch)
|
||||
return (WCHAR *)(ULONG_PTR)ptr;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static
|
||||
WCHAR
|
||||
*memrchrW(const WCHAR *ptr, WCHAR ch, size_t n)
|
||||
{
|
||||
const WCHAR *end;
|
||||
WCHAR *ret = NULL;
|
||||
for (end = ptr + n; ptr < end; ptr++)
|
||||
if (*ptr == ch)
|
||||
ret = (WCHAR *)(ULONG_PTR)ptr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserCopyEntry(LPWSTR buffer, LPCWSTR value, int len, BOOL strip_quote)
|
||||
{
|
||||
WCHAR quote = '\0';
|
||||
|
||||
if (!buffer) return;
|
||||
|
||||
if (strip_quote && ((*value == '\'') || (*value == '\"')))
|
||||
{
|
||||
if (value[1] && (value[wcslen(value)-1] == *value))
|
||||
quote = *value++;
|
||||
}
|
||||
|
||||
lstrcpynW(buffer, value, len);
|
||||
if (quote && (len >= (int)wcslen(value))) buffer[wcslen(buffer)-1] = '\0';
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserByteSwapShortBuffer(WCHAR * buffer, int len)
|
||||
{
|
||||
int i;
|
||||
USHORT * shortbuffer = buffer;
|
||||
for (i = 0; i < len; i++)
|
||||
shortbuffer[i] = (shortbuffer[i] >> 8) | (shortbuffer[i] << 8);
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserWriteMarker(HANDLE hFile, ENCODING encoding)
|
||||
{
|
||||
DWORD dwBytesWritten;
|
||||
WCHAR bom;
|
||||
|
||||
switch (encoding)
|
||||
{
|
||||
case ENCODING_UTF8:
|
||||
WriteFile(hFile, bom_utf8, sizeof(bom_utf8), &dwBytesWritten, NULL);
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16LE:
|
||||
bom = 0xFEFF;
|
||||
WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16BE:
|
||||
bom = 0xFFFE;
|
||||
WriteFile(hFile, &bom, sizeof(bom), &dwBytesWritten, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserWriteLine(HANDLE hFile, WCHAR * szLine, int len, ENCODING encoding)
|
||||
{
|
||||
char * write_buffer;
|
||||
int write_buffer_len;
|
||||
DWORD dwBytesWritten;
|
||||
|
||||
switch (encoding)
|
||||
{
|
||||
case ENCODING_UTF8:
|
||||
write_buffer_len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, NULL, 0, NULL, NULL);
|
||||
write_buffer = HeapAlloc(GetProcessHeap(), 0, write_buffer_len);
|
||||
if (!write_buffer) return;
|
||||
len = WideCharToMultiByte(CP_UTF8, 0, szLine, len, write_buffer, write_buffer_len, NULL, NULL);
|
||||
WriteFile(hFile, write_buffer, len, &dwBytesWritten, NULL);
|
||||
HeapFree(GetProcessHeap(), 0, write_buffer);
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16LE:
|
||||
WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16BE:
|
||||
ParserByteSwapShortBuffer(szLine, len);
|
||||
WriteFile(hFile, szLine, len * sizeof(WCHAR), &dwBytesWritten, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserSave(HANDLE hFile, const SECTION *section, ENCODING encoding)
|
||||
{
|
||||
SECTIONKEY *key;
|
||||
WCHAR *buffer, *p;
|
||||
|
||||
ParserWriteMarker(hFile, encoding);
|
||||
|
||||
for ( ; section; section = section->next)
|
||||
{
|
||||
size_t len = 0;
|
||||
size_t remaining;
|
||||
|
||||
if (section->name[0]) len += wcslen(section->name) + 4;
|
||||
|
||||
for (key = section->key; key; key = key->next)
|
||||
{
|
||||
len += wcslen(key->name) + 2;
|
||||
if (key->value) len += wcslen(key->value) + 1;
|
||||
}
|
||||
|
||||
buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
||||
if (!buffer) return;
|
||||
|
||||
p = buffer;
|
||||
remaining = len;
|
||||
if (section->name[0])
|
||||
{
|
||||
StringCchPrintfExW(p, remaining, &p, &remaining, 0,
|
||||
L"[%ls]\r\n",
|
||||
section->name);
|
||||
}
|
||||
|
||||
for (key = section->key; key; key = key->next)
|
||||
{
|
||||
if (key->value)
|
||||
{
|
||||
StringCchPrintfExW(p, remaining, &p, &remaining, 0,
|
||||
L"%ls=%ls\r\n",
|
||||
key->name, key->value);
|
||||
}
|
||||
else
|
||||
{
|
||||
StringCchPrintfExW(p, remaining, &p, &remaining, 0,
|
||||
L"%ls\r\n",
|
||||
key->name);
|
||||
}
|
||||
}
|
||||
ParserWriteLine(hFile, buffer, len, encoding);
|
||||
HeapFree(GetProcessHeap(), 0, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserFree(SECTION *section)
|
||||
{
|
||||
SECTION *next_section;
|
||||
SECTIONKEY *key, *next_key;
|
||||
|
||||
for ( ; section; section = next_section)
|
||||
{
|
||||
for (key = section->key; key; key = next_key)
|
||||
{
|
||||
next_key = key->next;
|
||||
HeapFree(GetProcessHeap(), 0, key->value);
|
||||
HeapFree(GetProcessHeap(), 0, key);
|
||||
}
|
||||
next_section = section->next;
|
||||
HeapFree(GetProcessHeap(), 0, section);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
ENCODING
|
||||
ParserDetectTextEncoding(const void * buffer, int * len)
|
||||
{
|
||||
INT flags = IS_TEXT_UNICODE_SIGNATURE |
|
||||
IS_TEXT_UNICODE_REVERSE_SIGNATURE |
|
||||
IS_TEXT_UNICODE_ODD_LENGTH;
|
||||
|
||||
if (*len >= sizeof(bom_utf8) && !memcmp(buffer, bom_utf8, sizeof(bom_utf8)))
|
||||
{
|
||||
*len = sizeof(bom_utf8);
|
||||
return ENCODING_UTF8;
|
||||
}
|
||||
|
||||
RtlIsTextUnicode((void *)buffer, *len, &flags);
|
||||
|
||||
if (flags & IS_TEXT_UNICODE_SIGNATURE)
|
||||
{
|
||||
*len = sizeof(WCHAR);
|
||||
return ENCODING_UTF16LE;
|
||||
}
|
||||
|
||||
if (flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE)
|
||||
{
|
||||
*len = sizeof(WCHAR);
|
||||
return ENCODING_UTF16BE;
|
||||
}
|
||||
|
||||
*len = 0;
|
||||
|
||||
return ENCODING_UTF8;
|
||||
}
|
||||
|
||||
static
|
||||
SECTION
|
||||
*ParserLoad(HANDLE hFile, ENCODING * pEncoding)
|
||||
{
|
||||
void *buffer_base, *pBuffer;
|
||||
WCHAR * szFile;
|
||||
const WCHAR *szLineStart, *szLineEnd;
|
||||
const WCHAR *szValueStart, *szEnd, *next_line;
|
||||
int line = 0, len;
|
||||
SECTION *section, *first_section;
|
||||
SECTION **next_section;
|
||||
SECTIONKEY *key, *prev_key, **next_key;
|
||||
DWORD dwFileSize;
|
||||
|
||||
dwFileSize = GetFileSize(hFile, NULL);
|
||||
if (dwFileSize == INVALID_FILE_SIZE || dwFileSize == 0)
|
||||
return NULL;
|
||||
|
||||
buffer_base = HeapAlloc(GetProcessHeap(), 0 , dwFileSize);
|
||||
if (!buffer_base)
|
||||
return NULL;
|
||||
|
||||
if (!ReadFile(hFile, buffer_base, dwFileSize, &dwFileSize, NULL))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, buffer_base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
len = dwFileSize;
|
||||
*pEncoding = ParserDetectTextEncoding(buffer_base, &len);
|
||||
|
||||
pBuffer = (char *)buffer_base + len;
|
||||
dwFileSize -= len;
|
||||
|
||||
switch (*pEncoding)
|
||||
{
|
||||
case ENCODING_UTF8:
|
||||
len = MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, NULL, 0);
|
||||
szFile = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
||||
if (!szFile)
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, buffer_base);
|
||||
return NULL;
|
||||
}
|
||||
MultiByteToWideChar(CP_UTF8, 0, pBuffer, dwFileSize, szFile, len);
|
||||
szEnd = szFile + len;
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16LE:
|
||||
szFile = pBuffer;
|
||||
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
|
||||
break;
|
||||
|
||||
case ENCODING_UTF16BE:
|
||||
szFile = pBuffer;
|
||||
szEnd = (WCHAR *)((char *)pBuffer + dwFileSize);
|
||||
ParserByteSwapShortBuffer(szFile, dwFileSize / sizeof(WCHAR));
|
||||
break;
|
||||
|
||||
default:
|
||||
HeapFree(GetProcessHeap(), 0, buffer_base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
first_section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section));
|
||||
if (first_section == NULL)
|
||||
{
|
||||
if (szFile != pBuffer)
|
||||
HeapFree(GetProcessHeap(), 0, szFile);
|
||||
HeapFree(GetProcessHeap(), 0, buffer_base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
first_section->name[0] = 0;
|
||||
first_section->key = NULL;
|
||||
first_section->next = NULL;
|
||||
next_section = &first_section->next;
|
||||
next_key = &first_section->key;
|
||||
prev_key = NULL;
|
||||
next_line = szFile;
|
||||
|
||||
while (next_line < szEnd)
|
||||
{
|
||||
szLineStart = next_line;
|
||||
next_line = memchrW(szLineStart, '\n', szEnd - szLineStart);
|
||||
if (!next_line) next_line = memchrW(szLineStart, '\r', szEnd - szLineStart);
|
||||
if (!next_line) next_line = szEnd;
|
||||
else next_line++;
|
||||
szLineEnd = next_line;
|
||||
|
||||
line++;
|
||||
|
||||
while (szLineStart < szLineEnd && ParserIsSpace(*szLineStart)) szLineStart++;
|
||||
while ((szLineEnd > szLineStart) && ParserIsSpace(szLineEnd[-1])) szLineEnd--;
|
||||
|
||||
if (szLineStart >= szLineEnd)
|
||||
continue;
|
||||
|
||||
if (*szLineStart == '[')
|
||||
{
|
||||
const WCHAR * szSectionEnd;
|
||||
if ((szSectionEnd = memrchrW(szLineStart, ']', szLineEnd - szLineStart)))
|
||||
{
|
||||
szLineStart++;
|
||||
len = (int)(szSectionEnd - szLineStart);
|
||||
if (!(section = HeapAlloc(GetProcessHeap(), 0, sizeof(*section) + len * sizeof(WCHAR))))
|
||||
break;
|
||||
memcpy(section->name, szLineStart, len * sizeof(WCHAR));
|
||||
section->name[len] = '\0';
|
||||
section->key = NULL;
|
||||
section->next = NULL;
|
||||
*next_section = section;
|
||||
next_section = §ion->next;
|
||||
next_key = §ion->key;
|
||||
prev_key = NULL;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
len = szLineEnd - szLineStart;
|
||||
if ((szValueStart = memchrW(szLineStart, '=', szLineEnd - szLineStart)) != NULL)
|
||||
{
|
||||
const WCHAR *szNameEnd = szValueStart;
|
||||
while ((szNameEnd > szLineStart) && ParserIsSpace(szNameEnd[-1])) szNameEnd--;
|
||||
len = szNameEnd - szLineStart;
|
||||
szValueStart++;
|
||||
while (szValueStart < szLineEnd && ParserIsSpace(*szValueStart)) szValueStart++;
|
||||
}
|
||||
|
||||
if (len || !prev_key || *prev_key->name)
|
||||
{
|
||||
if (!(key = HeapAlloc(GetProcessHeap(), 0, sizeof(*key) + len * sizeof(WCHAR)))) break;
|
||||
memcpy(key->name, szLineStart, len * sizeof(WCHAR));
|
||||
key->name[len] = '\0';
|
||||
if (szValueStart)
|
||||
{
|
||||
len = (int)(szLineEnd - szValueStart);
|
||||
key->value = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
|
||||
memcpy(key->value, szValueStart, len * sizeof(WCHAR));
|
||||
key->value[len] = '\0';
|
||||
}
|
||||
else key->value = NULL;
|
||||
|
||||
key->next = NULL;
|
||||
*next_key = key;
|
||||
next_key = &key->next;
|
||||
prev_key = key;
|
||||
}
|
||||
}
|
||||
|
||||
if (szFile != pBuffer)
|
||||
HeapFree(GetProcessHeap(), 0, szFile);
|
||||
HeapFree(GetProcessHeap(), 0, buffer_base);
|
||||
|
||||
return first_section;
|
||||
}
|
||||
|
||||
static
|
||||
SECTIONKEY
|
||||
*ParserFind(SECTION **section, LPCWSTR section_name, LPCWSTR key_name, BOOL create, BOOL create_always)
|
||||
{
|
||||
LPCWSTR p;
|
||||
DWORD cch;
|
||||
int seclen, keylen;
|
||||
|
||||
while (ParserIsSpace(*section_name)) section_name++;
|
||||
if (*section_name)
|
||||
p = section_name + wcslen(section_name) - 1;
|
||||
else
|
||||
p = section_name;
|
||||
|
||||
while ((p > section_name) && ParserIsSpace(*p)) p--;
|
||||
seclen = p - section_name + 1;
|
||||
|
||||
while (ParserIsSpace(*key_name)) key_name++;
|
||||
if (*key_name)
|
||||
p = key_name + wcslen(key_name) - 1;
|
||||
else
|
||||
p = key_name;
|
||||
|
||||
while ((p > key_name) && ParserIsSpace(*p)) p--;
|
||||
keylen = p - key_name + 1;
|
||||
|
||||
while (*section)
|
||||
{
|
||||
if (((*section)->name[0])
|
||||
&& (!(_wcsnicmp((*section)->name, section_name, seclen)))
|
||||
&& (((*section)->name)[seclen] == '\0'))
|
||||
{
|
||||
SECTIONKEY **key = &(*section)->key;
|
||||
|
||||
while (*key)
|
||||
{
|
||||
if(!create_always)
|
||||
{
|
||||
if ((!(_wcsnicmp((*key)->name, key_name, keylen)))
|
||||
&& (((*key)->name)[keylen] == '\0'))
|
||||
return *key;
|
||||
}
|
||||
key = &(*key)->next;
|
||||
}
|
||||
if (!create)
|
||||
return NULL;
|
||||
cch = wcslen(key_name) + 1;
|
||||
if (!(*key = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(SECTIONKEY, name) + cch * sizeof(WCHAR))))
|
||||
return NULL;
|
||||
StringCchCopyW((*key)->name, cch, key_name);
|
||||
(*key)->value = NULL;
|
||||
(*key)->next = NULL;
|
||||
return *key;
|
||||
}
|
||||
section = &(*section)->next;
|
||||
}
|
||||
if (!create) return NULL;
|
||||
cch = wcslen(section_name) + 1;
|
||||
*section = HeapAlloc(GetProcessHeap(), 0, FIELD_OFFSET(SECTION, name) + cch * sizeof(WCHAR));
|
||||
if (*section == NULL) return NULL;
|
||||
StringCchCopyW((*section)->name, cch, section_name);
|
||||
(*section)->next = NULL;
|
||||
cch = wcslen(key_name) + 1;
|
||||
if (!((*section)->key = HeapAlloc(GetProcessHeap(), 0,
|
||||
FIELD_OFFSET(SECTIONKEY, name) + cch * sizeof(WCHAR))))
|
||||
{
|
||||
HeapFree(GetProcessHeap(), 0, *section);
|
||||
return NULL;
|
||||
}
|
||||
StringCchCopyW((*section)->key->name, cch, key_name);
|
||||
(*section)->key->value = NULL;
|
||||
(*section)->key->next = NULL;
|
||||
return (*section)->key;
|
||||
}
|
||||
|
||||
static
|
||||
BOOL
|
||||
ParserFlushFile(void)
|
||||
{
|
||||
HANDLE hFile = NULL;
|
||||
|
||||
if (!CurProfile) return FALSE;
|
||||
|
||||
if (!CurProfile->changed) return TRUE;
|
||||
|
||||
hFile = CreateFileW(CurProfile->filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
|
||||
|
||||
ParserSave(hFile, CurProfile->section, CurProfile->encoding);
|
||||
|
||||
CloseHandle(hFile);
|
||||
CurProfile->changed = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static
|
||||
void
|
||||
ParserReleaseFile(void)
|
||||
{
|
||||
ParserFlushFile();
|
||||
ParserFree(CurProfile->section);
|
||||
HeapFree(GetProcessHeap(), 0, CurProfile->filename);
|
||||
CurProfile->changed = FALSE;
|
||||
CurProfile->section = NULL;
|
||||
CurProfile->filename = NULL;
|
||||
CurProfile->encoding = ENCODING_UTF8;
|
||||
}
|
||||
|
||||
static
|
||||
BOOL
|
||||
ParserOpen(LPCWSTR filename, BOOL write_access)
|
||||
{
|
||||
WCHAR szDir[MAX_PATH];
|
||||
WCHAR buffer[MAX_PATH];
|
||||
DWORD cch;
|
||||
HANDLE hFile = INVALID_HANDLE_VALUE;
|
||||
int i, j;
|
||||
ITEMS *tempProfile;
|
||||
|
||||
if (!CurProfile)
|
||||
for (i = 0; i < N_CACHED_ITEMS; i++)
|
||||
{
|
||||
ItemsArray[i] = HeapAlloc(GetProcessHeap(), 0, sizeof(ITEMS));
|
||||
if (ItemsArray[i] == NULL) break;
|
||||
ItemsArray[i]->changed = FALSE;
|
||||
ItemsArray[i]->section = NULL;
|
||||
ItemsArray[i]->filename = NULL;
|
||||
ItemsArray[i]->encoding = ENCODING_UTF8;
|
||||
}
|
||||
|
||||
if (!GetStorageDirectory(szDir, sizeof(szDir) / sizeof(szDir[0])))
|
||||
return FALSE;
|
||||
|
||||
if (FAILED(StringCbPrintfW(buffer, sizeof(buffer),
|
||||
L"%ls\\rapps\\%ls",
|
||||
szDir, filename)))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hFile = CreateFileW(buffer, GENERIC_READ | (write_access ? GENERIC_WRITE : 0),
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_FILE_NOT_FOUND))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
for (i = 0; i < N_CACHED_ITEMS; i++)
|
||||
{
|
||||
if ((ItemsArray[i]->filename && !wcscmp(buffer, ItemsArray[i]->filename)))
|
||||
{
|
||||
if (i)
|
||||
{
|
||||
ParserFlushFile();
|
||||
tempProfile = ItemsArray[i];
|
||||
for (j = i; j > 0; j--)
|
||||
ItemsArray[j] = ItemsArray[j - 1];
|
||||
CurProfile = tempProfile;
|
||||
}
|
||||
if (hFile != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
ParserFlushFile();
|
||||
|
||||
if (i == N_CACHED_ITEMS)
|
||||
{
|
||||
tempProfile = ItemsArray[N_CACHED_ITEMS - 1];
|
||||
for (i = N_CACHED_ITEMS - 1; i > 0; i--)
|
||||
ItemsArray[i] = ItemsArray[i - 1];
|
||||
CurProfile = tempProfile;
|
||||
}
|
||||
|
||||
if (CurProfile->filename) ParserReleaseFile();
|
||||
|
||||
cch = wcslen(buffer) + 1;
|
||||
CurProfile->filename = HeapAlloc(GetProcessHeap(), 0, cch * sizeof(WCHAR));
|
||||
if (CurProfile->filename == NULL)
|
||||
{
|
||||
if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
StringCchCopyW(CurProfile->filename, cch, buffer);
|
||||
|
||||
if (hFile != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CurProfile->section = ParserLoad(hFile, &CurProfile->encoding);
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static
|
||||
INT
|
||||
ParserGetSection(SECTION *section, LPCWSTR section_name, LPWSTR buffer, UINT len, BOOL return_values)
|
||||
{
|
||||
SECTIONKEY *key;
|
||||
|
||||
if (!buffer)
|
||||
return 0;
|
||||
|
||||
while (section)
|
||||
{
|
||||
if (section->name[0] && !_wcsicmp(section->name, section_name))
|
||||
{
|
||||
UINT oldlen = len;
|
||||
for (key = section->key; key; key = key->next)
|
||||
{
|
||||
if (len <= 2) break;
|
||||
if (!*key->name) continue; /* Skip empty lines */
|
||||
if (IS_ENTRY_COMMENT(key->name)) continue; /* Skip comments */
|
||||
if (!return_values && !key->value) continue; /* Skip lines w.o. '=' */
|
||||
|
||||
ParserCopyEntry(buffer, key->name, len - 1, 0);
|
||||
len -= wcslen(buffer) + 1;
|
||||
buffer += wcslen(buffer) + 1;
|
||||
|
||||
if (len < 2) break;
|
||||
if (return_values && key->value)
|
||||
{
|
||||
buffer[-1] = '=';
|
||||
ParserCopyEntry(buffer, key->value, len - 1, 0);
|
||||
len -= wcslen(buffer) + 1;
|
||||
buffer += wcslen(buffer) + 1;
|
||||
}
|
||||
}
|
||||
*buffer = '\0';
|
||||
if (len <= 1)
|
||||
{
|
||||
buffer[-1] = '\0';
|
||||
return oldlen - 2;
|
||||
}
|
||||
return oldlen - len;
|
||||
}
|
||||
section = section->next;
|
||||
}
|
||||
buffer[0] = buffer[1] = '\0';
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
INT
|
||||
ParserInternalGetString(LPCWSTR section, LPCWSTR key_name, LPWSTR buffer, UINT len)
|
||||
{
|
||||
SECTIONKEY *key = NULL;
|
||||
static const WCHAR empty_strW[] = { 0 };
|
||||
|
||||
if (!buffer || !len) return 0;
|
||||
|
||||
if (key_name)
|
||||
{
|
||||
if (!key_name[0])
|
||||
{
|
||||
ParserCopyEntry(buffer, empty_strW, len, TRUE);
|
||||
return wcslen(buffer);
|
||||
}
|
||||
key = ParserFind(&CurProfile->section, section, key_name, FALSE, FALSE);
|
||||
ParserCopyEntry(buffer, (key && key->value) ? key->value : empty_strW,
|
||||
len, TRUE);
|
||||
return wcslen(buffer);
|
||||
}
|
||||
|
||||
if (section && section[0])
|
||||
{
|
||||
INT ret = ParserGetSection(CurProfile->section, section, buffer, len, FALSE);
|
||||
if (!buffer[0])
|
||||
{
|
||||
ParserCopyEntry(buffer, empty_strW, len, TRUE);
|
||||
ret = wcslen(buffer);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
buffer[0] = '\0';
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT
|
||||
ParserGetString(LPCWSTR Section, LPCWSTR ValueName, LPWSTR Buffer, UINT Len, LPCWSTR FileName)
|
||||
{
|
||||
if (Section == NULL) return 0;
|
||||
|
||||
if (ParserOpen(FileName, FALSE))
|
||||
return ParserInternalGetString(Section, ValueName, Buffer, Len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
UINT
|
||||
ParserGetInt(LPCWSTR Section, LPCWSTR ValueName, LPCWSTR FileName)
|
||||
{
|
||||
WCHAR Buffer[30];
|
||||
UNICODE_STRING BufferW;
|
||||
ULONG Result;
|
||||
|
||||
if (!ParserGetString(Section,
|
||||
ValueName,
|
||||
Buffer,
|
||||
sizeof(Buffer) / sizeof(WCHAR),
|
||||
FileName))
|
||||
return -1;
|
||||
|
||||
if (!Buffer[0]) return -1;
|
||||
|
||||
RtlInitUnicodeString(&BufferW, Buffer);
|
||||
RtlUnicodeStringToInteger(&BufferW, 0, &Result);
|
||||
return Result;
|
||||
}
|
|
@ -81,6 +81,14 @@ typedef struct
|
|||
WCHAR szUrlDownload[MAX_PATH];
|
||||
WCHAR szCDPath[MAX_PATH];
|
||||
|
||||
/* caching mechanism related entries */
|
||||
WCHAR cFileName[MAX_PATH];
|
||||
FILETIME ftCacheStamp;
|
||||
LIST_ENTRY List;
|
||||
|
||||
/* optional integrity checks */
|
||||
BYTE MD5Checksum[16];
|
||||
|
||||
} APPLICATION_INFO, *PAPPLICATION_INFO;
|
||||
|
||||
typedef struct
|
||||
|
@ -166,9 +174,8 @@ VOID InitLogs(VOID);
|
|||
VOID FreeLogs(VOID);
|
||||
BOOL WriteLogMessage(WORD wType, DWORD dwEventID, LPWSTR lpMsg);
|
||||
|
||||
/* parser.c */
|
||||
INT ParserGetString(LPCWSTR section, LPCWSTR entry, LPWSTR buffer, UINT len, LPCWSTR filename);
|
||||
UINT ParserGetInt(LPCWSTR section, LPCWSTR entry, LPCWSTR filename);
|
||||
UINT ParserGetString(LPCWSTR lpKeyName, LPWSTR lpReturnedString, UINT nSize, LPCWSTR lpFileName);
|
||||
UINT ParserGetInt(LPCWSTR lpKeyName, LPCWSTR lpFileName);
|
||||
|
||||
/* richedit.c */
|
||||
extern HWND hRichEdit;
|
||||
|
|
|
@ -39,6 +39,16 @@ IDI_CAT_SCIENCE ICON "res/cats/science.ico"
|
|||
IDI_CAT_TOOLS ICON "res/cats/tools.ico"
|
||||
IDI_CAT_VIDEO ICON "res/cats/video.ico"
|
||||
|
||||
/* Accelerators -- key bindings */
|
||||
HOTKEYS ACCELERATORS
|
||||
{
|
||||
VK_F1, ID_HELP, VIRTKEY
|
||||
VK_F5, ID_REFRESH, VIRTKEY
|
||||
VK_F5, ID_RESETDB, CONTROL, VIRTKEY
|
||||
VK_DELETE, ID_UNINSTALL, CONTROL, VIRTKEY
|
||||
VK_RETURN, ID_INSTALL, CONTROL, VIRTKEY
|
||||
}
|
||||
|
||||
#include <reactos/manifest_exe.rc>
|
||||
|
||||
#include <rappsmsg.rc>
|
||||
|
|
|
@ -152,6 +152,9 @@
|
|||
#define IDS_CAT_TOOLS 713
|
||||
#define IDS_CAT_VIDEO 714
|
||||
|
||||
/* Accelerators */
|
||||
#define HOTKEYS 715
|
||||
|
||||
/* Other */
|
||||
#ifndef IDC_STATIC
|
||||
#define IDC_STATIC -1
|
||||
|
|
|
@ -3,12 +3,12 @@
|
|||
* LICENSE: GPL - See COPYING in the top level directory
|
||||
* FILE: base/applications/rapps/winmain.c
|
||||
* PURPOSE: Main program
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
|
||||
* Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
|
||||
*/
|
||||
|
||||
#include "rapps.h"
|
||||
|
||||
#include <shellapi.h>
|
||||
#include "rapps.h"
|
||||
|
||||
#define SEARCH_TIMER_ID 'SR'
|
||||
|
||||
|
@ -49,7 +49,7 @@ FillDefaultSettings(PSETTINGS_INFO pSettingsInfo)
|
|||
|
||||
pSettingsInfo->Proxy = 0;
|
||||
StringCbCopyW(pSettingsInfo->szProxyServer, sizeof(pSettingsInfo->szProxyServer), L"");
|
||||
StringCbCopyW(pSettingsInfo->szNoProxyFor, sizeof(pSettingsInfo->szNoProxyFor), L"");
|
||||
StringCbCopyW(pSettingsInfo->szNoProxyFor, sizeof(pSettingsInfo->szNoProxyFor), L"");
|
||||
}
|
||||
|
||||
static BOOL
|
||||
|
@ -138,6 +138,7 @@ EnumInstalledAppProc(INT ItemIndex, LPWSTR lpName, PINSTALLED_INFO Info)
|
|||
/* Get version info */
|
||||
GetApplicationString(ItemInfo->hSubKey, L"DisplayVersion", szText);
|
||||
ListView_SetItemText(hListView, Index, 1, szText);
|
||||
|
||||
/* Get comments */
|
||||
GetApplicationString(ItemInfo->hSubKey, L"Comments", szText);
|
||||
ListView_SetItemText(hListView, Index, 2, szText);
|
||||
|
@ -164,7 +165,6 @@ BOOL
|
|||
CALLBACK
|
||||
EnumAvailableAppProc(PAPPLICATION_INFO Info)
|
||||
{
|
||||
PAPPLICATION_INFO ItemInfo;
|
||||
INT Index;
|
||||
|
||||
if (!SearchPatternMatch(Info->szName, szSearchPattern) &&
|
||||
|
@ -175,16 +175,12 @@ EnumAvailableAppProc(PAPPLICATION_INFO Info)
|
|||
|
||||
/* Only add a ListView entry if...
|
||||
- no RegName was supplied (so we cannot determine whether the application is installed or not) or
|
||||
- a RegName was supplied and the application is not installed
|
||||
- a RegName was supplied and the application is not installed
|
||||
*/
|
||||
if (!*Info->szRegName || (!IsInstalledApplication(Info->szRegName, FALSE) && !IsInstalledApplication(Info->szRegName, TRUE)))
|
||||
{
|
||||
ItemInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO));
|
||||
if (!ItemInfo) return FALSE;
|
||||
Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)Info);
|
||||
|
||||
RtlCopyMemory(ItemInfo, Info, sizeof(APPLICATION_INFO));
|
||||
|
||||
Index = ListViewAddItem(Info->Category, 0, Info->szName, (LPARAM)ItemInfo);
|
||||
ListView_SetItemText(hListView, Index, 1, Info->szVersion);
|
||||
ListView_SetItemText(hListView, Index, 2, Info->szDesc);
|
||||
}
|
||||
|
@ -245,13 +241,17 @@ UpdateApplicationsList(INT EnumType)
|
|||
|
||||
SelectedEnumType = EnumType;
|
||||
|
||||
LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2));
|
||||
StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
|
||||
szBuffer2,
|
||||
ListView_GetItemCount(hListView));
|
||||
SetStatusBarText(szBuffer1);
|
||||
|
||||
SetWelcomeText();
|
||||
|
||||
/* set automatic column width for program names if the list is not empty */
|
||||
if (ListView_GetItemCount(hListView) > 0)
|
||||
ListView_SetColumnWidth(hListView, 0, LVSCW_AUTOSIZE);
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -260,13 +260,13 @@ InitApplicationsList(VOID)
|
|||
WCHAR szText[MAX_STR_LEN];
|
||||
|
||||
/* Add columns to ListView */
|
||||
LoadStringW(hInst, IDS_APP_NAME, szText, sizeof(szText) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APP_NAME, szText, _countof(szText));
|
||||
ListViewAddColumn(0, szText, 200, LVCFMT_LEFT);
|
||||
|
||||
LoadStringW(hInst, IDS_APP_INST_VERSION, szText, sizeof(szText) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APP_INST_VERSION, szText, _countof(szText));
|
||||
ListViewAddColumn(1, szText, 90, LVCFMT_RIGHT);
|
||||
|
||||
LoadStringW(hInst, IDS_APP_DESCRIPTION, szText, sizeof(szText) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APP_DESCRIPTION, szText, _countof(szText));
|
||||
ListViewAddColumn(3, szText, 250, LVCFMT_LEFT);
|
||||
|
||||
UpdateApplicationsList(ENUM_ALL_COMPONENTS);
|
||||
|
@ -289,7 +289,7 @@ AddCategory(HTREEITEM hRootItem, UINT TextIndex, UINT IconIndex)
|
|||
Index = ImageList_AddIcon(hImageTreeView, hIcon);
|
||||
DestroyIcon(hIcon);
|
||||
|
||||
LoadStringW(hInst, TextIndex, szText, sizeof(szText) / sizeof(TCHAR));
|
||||
LoadStringW(hInst, TextIndex, szText, _countof(szText));
|
||||
|
||||
return TreeViewAddItem(hRootItem, szText, Index, Index, TextIndex);
|
||||
}
|
||||
|
@ -352,7 +352,7 @@ InitControls(HWND hwnd)
|
|||
|
||||
InitCategoriesList();
|
||||
|
||||
LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, sizeof(szBuffer2) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APPS_COUNT, szBuffer2, _countof(szBuffer2));
|
||||
StringCbPrintfW(szBuffer1, sizeof(szBuffer1),
|
||||
szBuffer2,
|
||||
ListView_GetItemCount(hListView));
|
||||
|
@ -385,7 +385,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
WCHAR szWndText[MAX_STR_LEN];
|
||||
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
|
||||
GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
|
||||
if (wcscmp(szBuf, szWndText) == 0)
|
||||
{
|
||||
|
@ -400,7 +400,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
GetWindowTextW(hSearchBar, szBuf, MAX_STR_LEN);
|
||||
if (wcslen(szBuf) < 1)
|
||||
{
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
|
||||
SearchEnabled = FALSE;
|
||||
SetWindowTextW(hSearchBar, szBuf);
|
||||
}
|
||||
|
@ -417,7 +417,7 @@ MainWndOnCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|||
break;
|
||||
}
|
||||
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, sizeof(szBuf) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_SEARCH_TEXT, szBuf, _countof(szBuf));
|
||||
GetWindowTextW(hSearchBar, szWndText, MAX_STR_LEN);
|
||||
if (wcscmp(szBuf, szWndText) != 0)
|
||||
{
|
||||
|
@ -607,12 +607,12 @@ BOOL IsSelectedNodeInstalled(void)
|
|||
LRESULT CALLBACK
|
||||
MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
||||
switch (Msg)
|
||||
{
|
||||
case WM_CREATE:
|
||||
if (!InitControls(hwnd))
|
||||
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
|
@ -801,7 +801,8 @@ MainWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
|||
{
|
||||
if (data->hwndFrom == hListView && ((LPNMLISTVIEW)lParam)->iItem != -1)
|
||||
{
|
||||
SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0); //Won't do anything if the program is already installed
|
||||
/* this won't do anything if the program is already installed */
|
||||
SendMessage(hwnd, WM_COMMAND, ID_INSTALL, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -902,6 +903,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
|
|||
WCHAR szWindowClass[] = L"ROSAPPMGR";
|
||||
WCHAR szWindowName[MAX_STR_LEN];
|
||||
HANDLE hMutex = NULL;
|
||||
HACCEL KeyBrd;
|
||||
MSG Msg;
|
||||
|
||||
switch (GetUserDefaultUILanguage())
|
||||
|
@ -949,7 +951,7 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
|
|||
|
||||
if (RegisterClassExW(&WndClass) == (ATOM)0) goto Exit;
|
||||
|
||||
LoadStringW(hInst, IDS_APPTITLE, szWindowName, sizeof(szWindowName) / sizeof(WCHAR));
|
||||
LoadStringW(hInst, IDS_APPTITLE, szWindowName, _countof(szWindowName));
|
||||
|
||||
hMainWnd = CreateWindowExW(WS_EX_WINDOWEDGE,
|
||||
szWindowClass,
|
||||
|
@ -973,15 +975,22 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nSh
|
|||
if (SettingsInfo.bUpdateAtStart)
|
||||
UpdateAppsDB();
|
||||
|
||||
/* Load the menu hotkeys */
|
||||
KeyBrd = LoadAccelerators(NULL, MAKEINTRESOURCE(HOTKEYS));
|
||||
|
||||
/* Message Loop */
|
||||
while (GetMessage(&Msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
if (!TranslateAccelerator(hMainWnd, KeyBrd, &Msg))
|
||||
{
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
if (hMutex) CloseHandle(hMutex);
|
||||
if (hMutex)
|
||||
CloseHandle(hMutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue