Initial commit: Complete open-source Decal rebuild

All 5 phases of the open-source Decal rebuild:

Phase 1: 14 decompiled .NET projects (Interop.*, Adapter, FileService, DecalUtil)
Phase 2: 10 native DLLs rewritten as C# COM servers with matching GUIDs
  - DecalDat, DHS, SpellFilter, DecalInput, DecalNet, DecalFilters
  - Decal.Core, DecalControls, DecalRender, D3DService
Phase 3: C++ shims for Inject.DLL (D3D9 hooking) and LauncherHook.DLL
Phase 4: DenAgent WinForms tray application
Phase 5: WiX installer and build script

25 C# projects building with 0 errors.
Native C++ projects require VS 2022 + Windows SDK (x86).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
erik 2026-02-08 18:27:56 +01:00
commit d1442e3747
1382 changed files with 170725 additions and 0 deletions

View file

@ -0,0 +1,11 @@
Microsoft Visual Studio Solution File, Format Version 1.00
Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal 2", "Decal 2.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}"
EndProject
Global
GlobalSection(LocalDeployment) = postSolution
StartupProject = {00000000-0000-0000-0000-000000000000}
EndGlobalSection
GlobalSection(BuildOrder) = postSolution
0 = {3606BE98-3576-4296-9CF6-23746B25EA4E}
EndGlobalSection
EndGlobal

BIN
Installer/Attic/Decal 2.wip Normal file

Binary file not shown.

View file

@ -0,0 +1,6 @@
<Project Sdk="WixToolset.Sdk/5.0.0">
<PropertyGroup>
<OutputType>Package</OutputType>
<InstallerPlatform>x86</InstallerPlatform>
</PropertyGroup>
</Project>

View file

@ -0,0 +1,13 @@
Microsoft Visual Studio Solution File, Format Version 1.00
Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal", "DecalInstaller.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}"
EndProject
Global
GlobalSection(LocalDeployment) = postSolution
StartupProject = {00000000-0000-0000-0000-000000000000}
EndGlobalSection
GlobalSection(BuildOrder) = postSolution
0 = {3606BE98-3576-4296-9CF6-23746B25EA4E}
EndGlobalSection
GlobalSection(DeploymentRoot) = postSolution
EndGlobalSection
EndGlobal

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,13 @@
Microsoft Visual Studio Solution File, Format Version 1.00
Project("{73393D18-DAC4-11D1-88FC-0000F8064EBB}") = "Decal", "DecalInstallerVC7.wip", "{3606BE98-3576-4296-9CF6-23746B25EA4E}"
EndProject
Global
GlobalSection(LocalDeployment) = postSolution
StartupProject = {00000000-0000-0000-0000-000000000000}
EndGlobalSection
GlobalSection(BuildOrder) = postSolution
0 = {3606BE98-3576-4296-9CF6-23746B25EA4E}
EndGlobalSection
GlobalSection(DeploymentRoot) = postSolution
EndGlobalSection
EndGlobal

Binary file not shown.

161
Installer/Installer.nsi Normal file
View file

@ -0,0 +1,161 @@
; Script generated with the Venis Install Wizard
; Define your application name
!define APPNAME "Decal"
!define APPNAMEANDVERSION "Decal 2.6.1.0"
; Main Install settings
Name "${APPNAMEANDVERSION}"
InstallDir "$PROGRAMFILES\Decal"
InstallDirRegKey HKLM "Software\${APPNAME}" ""
OutFile "Decal2610.exe"
; Use compression
SetCompressor LZMA
; Modern interface settings
!include "MUI.nsh"
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; Set languages (first is default language)
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_RESERVEFILE_LANGDLL
Section "" DecalCoreSection
; Set Section properties
SetOverwrite on
; Set Section Files and Shortcuts
SetOutPath "$INSTDIR\"
File "Release\Switch-Active.bmp"
File "Release\Switch-Inactive.bmp"
File "Release\Switchbar Disabled.bmp"
File "Release\Switchbar Template.bmp"
File "Release\Tab-Active.bmp"
File "Release\Tab-Inactive.bmp"
File "Release\Decal.dll"
File "Release\DecalControls.dll"
File "Release\DecalDat.dll"
File "Release\DecalFilters.dll"
File "Release\DecalInput.dll"
File "Release\DecalNet.dll"
File "Release\DenAgent.exe"
File "Release\ForceLibrary.dll"
File "Release\Inject.dll"
File "Release\LobbyHook.dll"
File "Release\MapObject.bmp"
File "Release\PlainText.dll"
SetOutPath "$SYSDIR\"
File "Release\LobbyHook.dll"
RegDLL "$INSTDIR\Decal.dll"
RegDLL "$INSTDIR\Inject.dll"
RegDLL "$INSTDIR\DecalControls.dll"
RegDLL "$INSTDIR\DecalDat.dll"
RegDLL "$INSTDIR\DecalNet.dll"
RegDLL "$INSTDIR\DecalFilters.dll"
RegDLL "$INSTDIR\DecalInput.dll"
RegDLL "$INSTDIR\PlainText.dll"
SectionEnd
Section "Desktop Shortcut" DesktopSection
CreateShortCut "$DESKTOP\Decal Agent.lnk" "$INSTDIR\DenAgent.exe"
SectionEnd
Section "Start Menu Entry" SMSection
CreateDirectory "$SMPROGRAMS\Decal"
CreateShortCut "$SMPROGRAMS\Decal\Decal Agent.lnk" "$INSTDIR\DenAgent.exe"
CreateShortCut "$SMPROGRAMS\Decal\Uninstall.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section "Quick Launch Shortcut" QLSection
CreateShortCut "$QUICKLAUNCH\Decal Agent.lnk" "$INSTDIR\DenAgent.exe"
SectionEnd
Section -FinishSection
WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe"
WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd
; Modern install component descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${Section1} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
;Uninstall section
Section Uninstall
;Remove from registry...
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"
DeleteRegKey HKLM "SOFTWARE\${APPNAME}"
; Delete self
Delete "$INSTDIR\uninstall.exe"
; Delete Shortcuts
Delete "$DESKTOP\Decal.lnk"
Delete "$SMPROGRAMS\Decal\Decal.lnk"
Delete "$SMPROGRAMS\Decal\Uninstall.lnk"
; Unregister DLLS
UnRegDLL "$INSTDIR\Decal.dll"
UnRegDLL "$INSTDIR\Inject.dll"
UnRegDLL "$INSTDIR\DecalControls.dll"
UnRegDLL "$INSTDIR\DecalDat.dll"
UnRegDLL "$INSTDIR\DecalNet.dll"
UnRegDLL "$INSTDIR\DecalFilters.dll"
UnRegDLL "$INSTDIR\DecalInput.dll"
UnRegDLL "$INSTDIR\PlainText.dll"
; Clean up Decal
Delete "$INSTDIR\Decal.dll"
Delete "$INSTDIR\DecalControls.dll"
Delete "$INSTDIR\DecalDat.dll"
Delete "$INSTDIR\DecalFilters.dll"
Delete "$INSTDIR\DecalInput.dll"
Delete "$INSTDIR\DecalNet.dll"
Delete "$INSTDIR\DenAgent.exe"
Delete "$INSTDIR\ForceLibrary.dll"
Delete "$INSTDIR\Inject.dll"
Delete "$INSTDIR\LobbyHook.dll"
Delete "$INSTDIR\MapObject.bmp"
Delete "$INSTDIR\PlainText.dll"
Delete "$INSTDIR\Switch-Active.bmp"
Delete "$INSTDIR\Switch-Inactive.bmp"
Delete "$INSTDIR\Switchbar Disabled.bmp"
Delete "$INSTDIR\Switchbar Template.bmp"
Delete "$INSTDIR\Tab-Active.bmp"
Delete "$INSTDIR\Tab-Inactive.bmp"
; Remove remaining directories
RMDir "$SMPROGRAMS\Decal"
RMDir "$INSTDIR\"
SectionEnd
; eof

198
Installer/Package.wxs Normal file
View file

@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Decal Installer - WiX v4/5 MSI package
Installs all Decal components to Program Files\Decal\
Registers COM servers, creates registry entries, and sets up shortcuts.
-->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<Package
Name="Decal"
Version="2.9.9.0"
Manufacturer="Decal Open Source Project"
UpgradeCode="A1B2C3D4-E5F6-7890-ABCD-EF1234567890"
Scope="perMachine"
InstallerVersion="200">
<MajorUpgrade
DowngradeErrorMessage="A newer version of Decal is already installed."
AllowSameVersionUpgrades="yes" />
<MediaTemplate EmbedCab="yes" />
<!-- Installation directory structure -->
<StandardDirectory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="Decal" />
</StandardDirectory>
<!-- Start Menu -->
<StandardDirectory Id="ProgramMenuFolder">
<Directory Id="DecalMenuFolder" Name="Decal" />
</StandardDirectory>
<!-- Feature: Core (always installed) -->
<Feature Id="CoreFeature" Title="Decal Core" Level="1" Absent="disallow">
<ComponentGroupRef Id="ManagedAssemblies" />
<ComponentGroupRef Id="COMServers" />
<ComponentGroupRef Id="NativeDLLs" />
<ComponentGroupRef Id="Executables" />
<ComponentGroupRef Id="RegistryEntries" />
<ComponentGroupRef Id="Shortcuts" />
</Feature>
</Package>
<!-- ================================================================ -->
<!-- Component Groups -->
<!-- ================================================================ -->
<!-- Managed (.NET) Interop Assemblies -->
<Fragment>
<ComponentGroup Id="ManagedAssemblies" Directory="INSTALLFOLDER">
<!-- Interop assemblies (COM interface definitions) -->
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Core.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Inject.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Controls.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.D3DService.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.DHS.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Dat.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Filters.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Input.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Net.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.Render.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.Interop.SpellFilter.dll" />
</Component>
<!-- Adapter and FileService -->
<Component>
<File Source="$(var.BuildOutput)\Decal.Adapter.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.FileService.dll" />
</Component>
</ComponentGroup>
</Fragment>
<!-- COM Server DLLs (C# implementations of native DLLs) -->
<Fragment>
<ComponentGroup Id="COMServers" Directory="INSTALLFOLDER">
<Component>
<File Source="$(var.BuildOutput)\Decal.Core.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalDat.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DHS.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.SpellFilter.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalInput.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalNet.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalFilters.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalControls.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.DecalRender.dll" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\Decal.D3DService.dll" />
</Component>
</ComponentGroup>
</Fragment>
<!-- Native C++ DLLs -->
<Fragment>
<ComponentGroup Id="NativeDLLs" Directory="INSTALLFOLDER">
<Component>
<File Source="$(var.NativeOutput)\Inject.DLL" />
</Component>
<Component>
<File Source="$(var.NativeOutput)\LauncherHook.DLL" />
</Component>
</ComponentGroup>
</Fragment>
<!-- Executables -->
<Fragment>
<ComponentGroup Id="Executables" Directory="INSTALLFOLDER">
<Component>
<File Id="DenAgentEXE" Source="$(var.BuildOutput)\Decal.DenAgent.exe" Name="DenAgent.EXE" />
</Component>
<Component>
<File Source="$(var.BuildOutput)\DecalUtil.exe" />
</Component>
</ComponentGroup>
</Fragment>
<!-- Registry entries -->
<Fragment>
<ComponentGroup Id="RegistryEntries" Directory="INSTALLFOLDER">
<Component Id="DecalRegistryBase">
<RegistryKey Root="HKLM" Key="SOFTWARE\Decal">
<RegistryValue Name="Version" Type="string" Value="2.9.9.0" />
</RegistryKey>
<RegistryKey Root="HKLM" Key="SOFTWARE\Decal\Agent">
<RegistryValue Name="AgentPath" Type="string" Value="[INSTALLFOLDER]" />
</RegistryKey>
</Component>
<!-- Service registrations -->
<Component Id="DecalServices">
<RegistryKey Root="HKLM" Key="SOFTWARE\Decal\Services">
<!-- Services are registered by their CLSIDs -->
</RegistryKey>
</Component>
<!-- Plugin registrations -->
<Component Id="DecalPlugins">
<RegistryKey Root="HKLM" Key="SOFTWARE\Decal\Plugins">
<!-- Plugins register themselves at install time -->
</RegistryKey>
</Component>
</ComponentGroup>
</Fragment>
<!-- Shortcuts -->
<Fragment>
<ComponentGroup Id="Shortcuts" Directory="DecalMenuFolder">
<Component Id="DenAgentShortcut">
<Shortcut Id="DenAgentStartMenu"
Name="Decal Agent"
Target="[INSTALLFOLDER]DenAgent.EXE"
WorkingDirectory="INSTALLFOLDER" />
<RemoveFolder Id="RemoveDecalMenu" On="uninstall" />
<RegistryValue Root="HKCU" Key="SOFTWARE\Decal" Name="Installed" Type="integer" Value="1" KeyPath="yes" />
</Component>
</ComponentGroup>
</Fragment>
</Wix>

Binary file not shown.

View file

@ -0,0 +1,44 @@
@echo off
title Decal Installer
del %systemdrive%\DecalInstaller.log > nul 2>&1
echo.
echo.
echo.
echo.
echo.
echo.
echo Removing Decal 1.0.1.0
msiexec /x {4AFA7857-D10F-4A74-A504-9C10320A6DB9} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 1.0.2.0
msiexec /x {840FA8EC-CA4D-46BE-94E6-2C85F4E29EDD} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 1.0.2.2
msiexec /x {DBBE8C7F-F27D-48D7-BBC1-5BFA30485980} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 1.1.0.0
msiexec /x {DFB254B2-F9B4-42F1-8B16-C045B18C8DBE} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 2.0.0.0 RC1
msiexec /x {3CFF0D79-376D-4557-8376-A9B48E50F775} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 2.0.0.0 RC2
msiexec /x {701F72C7-421E-4DBE-B8C7-0A8B5258D539} /q /lem+! %systemdrive%\DecalInstaller.log
echo Removing Decal 2.0.0.0 RC3
msiexec /x {D6E309A7-290D-48E0-9992-0DAB18EA4CE4} /q /lem+! %systemdrive%\DecalInstaller.log
echo.
echo.
echo -------Previous Decal Versions Removed-------
echo.
echo.
echo Installing Decal 2.0.0.0 RC3
start msiexec /i Decal.msi /lem+! %systemdrive%\DecalInstaller.log

Binary file not shown.

View file

@ -0,0 +1,4 @@
[DEFAULT]
BASEURL=http://decaldev.sourceforge.net/
[InternetShortcut]
URL=http://decaldev.sourceforge.net/

BIN
Installer/Res/Decal.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

338
Installer/Res/Install.vbs Normal file
View file

@ -0,0 +1,338 @@
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Option Explicit
'FSO Constants
Private Const WindowsFolder = 0
Private Const SystemFolder = 1
Private Const TemporaryFolder = 2
'WindowsInstaller Constants
Private Const msiInstallStateUnknown = -1
Private Const msiInstallStateAbsent = 2
Private Const msiUILevelFull = 5
'Minimum versions
Private Const MIN_WSH_VERSION = "5.1"
Private Const MIN_WI_VERSION = "1.11.2405.0"
'Global Objects
Private WshShell, WI, FSO, AllProducts
'prevent premature errors if objects don't exist
On Error Resume Next
Set WshShell = WScript.CreateObject("WScript.Shell") 'needed for reg access and file execution
Set WI = CreateObject("WindowsInstaller.Installer") 'the MSI related functions need this object
Set FSO = CreateObject("Scripting.FileSystemObject") 'can never have too many of these around
Set AllProducts = CreateObject("Scripting.Dictionary") 'All of the product IDs that this should remove before installing
On Error GoTo 0
'Now make sure we got them all
'There is some error checking deeper in, but I've seen a lot of errors so I'm not removing any of it :)
If Not IsObject(WshShell) Then
MsgBox "Internal error creating Windows Scripting Host object (WshShell). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(FSO) Then
MsgBox "Internal error creating Windows Scripting Host object (FSO). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(AllProducts) Then
MsgBox "Internal error creating Windows Scripting Host object (Dictionary). Please make sure you have IE6+ installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
If Not IsObject(WI) Then
MsgBox "Internal error creating Windows Installer object. Please make sure you have Windows Installer installed", _
vbOKOnly, _
"Decal Installer Library"
WScript.Quit
End If
'YOU MUST EDIT THESE FOR YOUR PARTICULAR INSTALLER!!!!!!
'All of these -must- be specified
Private Const ThisProduct = "Decal" ' The name of your product, used it dialogs and such
Private Const ThisVersion = "2.6.0.1" ' The version of your product, used in dialogs and such
Private Const MSIFileName = "Decal.msi" ' The name of the MSI file that will be excuted
'Add all of your previous product IDs to the dictionary for removal by the installer
AllProducts.Add "1.0.1.0", "{4AFA7857-D10F-4A74-A504-9C10320A6DB9}"
AllProducts.Add "1.0.2.0", "{840FA8EC-CA4D-46BE-94E6-2C85F4E29EDD}"
AllProducts.Add "1.0.2.2", "{DBBE8C7F-F27D-48D7-BBC1-5BFA30485980}"
AllProducts.Add "1.1.0.0", "{DFB254B2-F9B4-42F1-8B16-C045B18C8DBE}"
AllProducts.Add "2.0.0.0 RC1", "{3CFF0D79-376D-4557-8376-A9B48E50F775}"
AllProducts.Add "2.0.0.0 RC2", "{701F72C7-421E-4DBE-B8C7-0A8B5258D539}"
AllProducts.Add "2.0.0.0 RC3 ", "{D6E309A7-290D-48E0-9992-0DAB18EA4CE4}"
AllProducts.Add "2.0.0.0 RC4", "{3C2F8BE2-2B35-402F-9BAE-F9FDCA9C22A9}"
AllProducts.Add "2.0.0.0", "{F7DC5688-E3A0-432B-A5DF-F7CB4B02DE03}"
AllProducts.Add "2.1.0.2", "{6C6B886C-66E0-41C9-AF1A-1B02372D5E77}"
AllProducts.Add "2.1.0.4", "{83CE1E0E-E441-4764-A3CC-DBF1A53C40F0}"
AllProducts.Add "2.1.0.5", "{B388C87C-F59D-457F-A839-B6F3A2642CE7}"
AllProducts.Add "2.2.0.0", "{9FB34BE5-A2A3-4509-8A21-133FC27387F7}"
AllProducts.Add "2.2.0.1", "{BE7BB776-FE47-41B7-AACE-1F958A7CE214}"
AllProducts.Add "2.2.2.0", "{92A0F954-9A9D-4FCC-B874-F0A8DBD8BF1B}"
AllProducts.Add "2.2.3.0", "{775AB855-075F-462B-A482-D555569E2C03}"
AllProducts.Add "2.2.4.0", "{0C844C18-2021-4660-AD25-7922653E1A16}"
AllProducts.Add "2.3.0.0", "{DE512CE7-2417-41E5-9C7F-5C091F171785}"
AllProducts.Add "2.3.1.0", "{660E1D69-140D-437E-9D23-9137DA6F0162}"
AllProducts.Add "2.3.1.1", "{A0ACDD8E-3730-4007-926A-55D7B1A5A7B7}"
AllProducts.Add "2.3.1.2", "{E6E77F45-0B35-4F92-9CD3-4B70A821158D}"
AllProducts.Add "2.3.1.3", "{92872CC7-2722-4534-81BE-E99B4D472A95}"
AllProducts.Add "2.3.1.4", "{8186889F-BF27-4F79-9D94-4DD7CB9956F2}"
AllProducts.Add "2.3.1.5", "{09A9F4AE-C043-43CF-85D1-6F14BCAAEB11}"
AllProducts.Add "2.3.1.6", "{A6749A61-B1E5-4FFB-BA4D-AE93E5443EC8}"
AllProducts.Add "2.3.1.7", "{C667B179-E270-4BE5-9C73-0533C1D2B758}"
AllProducts.Add "2.3.1.8", "{88947320-85FC-4327-908D-7801365AD4D9}"
AllProducts.Add "2.3.1.9", "{1CF52690-D209-47C7-97EF-F38D64463AD5}"
AllProducts.Add "2.4.0.0", "{4D7BE8B5-6B0A-4135-8C75-BE8E4BB2E351}"
AllProducts.Add "2.4.1.0", "{E6E9AB9D-812C-40D7-A57C-ED298B48557F}"
AllProducts.Add "2.4.1.2", "{09C6E670-D686-11D6-BFDA-009027B6A4F1}"
AllProducts.Add "2.4.1.3", "{E62F700A-E214-11D6-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.0 RC1", "{940240A5-39C7-496A-B2FB-21D87220FCFE}"
AllProducts.Add "2.5.0.0 RC2", "{F685D7CA-12EB-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.0 RC3", "{F15D5960-13C9-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.1 RC1", "{B5B0E8D6-FE22-467C-B09E-1AB5CC837942}"
AllProducts.Add "2.5.0.1", "{CE4276BF-04AE-41C9-B7C2-3DD65B4DAEDD}"
AllProducts.Add "2.5.0.2", "{F794642A-63D5-11D7-B2DA-009027B6A4F1}"
AllProducts.Add "2.5.0.4", "{29E8FB17-4C4E-4F5D-8C5D-F3826ECE2CF6}"
AllProducts.Add "2.5.0.5", "{35012CC1-DC9F-49C3-9593-2B246AE68D3A}"
AllProducts.Add "2.5.2.0 RC1", "{ED4744B7-3F12-453B-9908-D192E0F5477A}"
AllProducts.Add "2.5.2.0 RC2", "{3EA7A26F-9112-45D4-BDE0-9BE451D42A9F}"
AllProducts.Add "2.5.2.0 RC3", "{B04617E3-2AFF-4650-84AF-10BE73B22A15}"
AllProducts.Add "2.6.0.0 RC1", "{6E766A51-09A9-4571-B55A-EE2E4E74B8BC}"
AllProducts.Add "2.6.0.0 RC2", "{4C22590F-22B8-4413-B91D-0403B2F84979}"
AllProducts.Add "2.6.0.0 RC3", "{E86FBB39-9061-475A-B575-F8F9AC12DB74}"
AllProducts.Add "2.6.0.0 RC4", "{16673809-CA94-4E31-9E0B-B2FCA0CBDFAB}"
AllProducts.Add "2.6.0.0 RC5", "{67E0D07C-8A6A-4357-B44F-CCA1A513DFE7}"
AllProducts.Add "2.6.0.0", "{B0DC3DCD-44BD-47C7-AB9D-CC68FB63F4C3}"
AllProducts.Add "2.6.0.1", "{32767F66-7F62-4C0B-81F7-C42B4C7C0148}"
' These are optional
' The features they provide will be ignored if they are left as empty strings
Private Const PathRegValue = "HKLM\SOFTWARE\Decal\Agent\AgentPath" ' Path to a registry key containing the install location of your product
Private Const FavoriteName = "Decal Homepage" ' Name of the Favorite to add at the end of the install
Private Const FavoriteURL = "http://decaldev.sourceforge.net/" ' URL for the Favorite to point to
Private Const FavoriteIconFile = "Denagent.exe" ' File to get the icon for the favorite from (default IE icon if blank)
Private Const FavoriteIconID = "0" ' Icon ID to use from the above file (default IE icon if blank)
' END OF EDITABLE OPTIONS
Private Function IsVersionAgreeable(pActualVersion, pMinumumVersion)
Dim actual, expected, i
IsVersionAgreeable = True
'msgbox "pActualVersion: " & pActualVersion & vbCRLF & "pMinumumVersion: " & pMinumumVersion
actual = split (pActualVersion, ".")
expected = split (pMinumumVersion, ".")
For i = 0 To UBound(expected)
'msgbox cstr(i & " : " & actual(i) & " : " & expected(i))
If CInt(actual(i)) > CInt(expected(i)) Then
'msgbox("greater")
Exit For
ElseIf CInt(actual(i)) < CInt(expected(i)) Then
'msgbox("less")
IsVersionAgreeable = False
Exit For
End If
Next
End Function
Private Sub WSHVersionCheck()
'Function: Check the Windows Scripting Host version, give URL for updating if not good enough,
' then kill the script.
'Args: N/A
'Returns: N/A
'
'Requirements: WshShell = WScript.Shell
'
Dim actualVersion, rc
On Error Resume Next
actualVersion = WScript.Version
On Error GoTo 0
'Bail here if things are ok
If IsVersionAgreeable(actualVersion, MIN_WSH_VERSION) Then Exit Sub
'Didn't bail, so need to prompt for an upgrade
rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Scripting Host to use this installer." & _
String(2, vbCRLF) & _
"The newest version is available with Windows Scripting Host 5.6 which you can download at: " & _
String(2, vbCRLF) & _
"http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe" & _
String(2, vbCRLF) & _
"Would you like to go there now?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then WshShell.Run "http://download.microsoft.com/download/winscript56/Install/5.6/W9XNT4Me/EN-US/scr56en.exe"
WScript.Quit
End Sub
Private Sub WIVersionCheck()
'Function: Check the windows installer version, give URL for updating if not good enough,
' then kill the script.
'Args: N/A
'Returns: N/A
'
'Requirements: WI = WindowsInstaller.Installer
' WshShell = WScript.Shell
Dim actualVersion, rc, fileInSysFolder, fileInWinFolder, windowsVersion, strURL, strFailMsg
On Error Resume Next
actualVersion = WI.Version
On Error GoTo 0
'Bail here if things are ok
If IsVersionAgreeable(actualVersion, MIN_WI_VERSION) Then Exit Sub
'Didn't bail, so need to prompt for an upgrade
With FSO
fileInSysFolder = .BuildPath(.GetSpecialFolder(SystemFolder), "winver.exe")
fileInWinFolder = .BuildPath(.GetSpecialFolder(WindowsFolder), "winver.exe")
If .FileExists(fileInSysFolder) Then
windowsVersion = split(.GetFileVersion(fileInSysFolder),".")
ElseIf .FileExists(fileInWinFolder) Then
windowsVersion = split(.GetFileVersion(fileInWinFolder),".")
Else
rc = MsgBox("The Decal Installer was unable to determine your Windows version. Are you using Windows 2000 or Windows XP?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then
windowsVersion = split("5.0.0.0", ".")
ElseIf rc = vbNo Then
windowsVersion = split("4.0.0.0", ".")
Else
MsgBox "An unknown error occured in Windows Version detection. Please make sure you have Windows Installer properly installed and try again.", _
vbOKOnly, _
ThisProduct & " Installer"
WScript.Quit
End If
End If
End With 'With FSO
If CInt(windowsVersion(1)) < 5 Then
strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32831"
strFailMsg = "Windows 98/ME users can upgrade at: " & strURL
Else 'If work(0) < 5 Then
strURL = "http://www.microsoft.com/downloads/release.asp?releaseid=32832"
strFailMsg = "Windows 2000 users can upgrade at: " & strURL
End If 'If work(0) < 5 Then
rc = MsgBox ("The " & ThisProduct & " Installer has determined that you do not have a new enough version of Windows Installer to use this installer. " & _
String(2,vbCRLF) & _
strFailMsg & _
String(2,vbCRLF) & _
"Would you like to go there now?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If rc = vbYes Then
'open the browser and exit
WshShell.Run strURL
End If
WScript.Quit
End Sub
Private Sub WipeProduct(pProdID)
'Function: Check for the product ID. If it exists, silently and forcefully uninstall.
'
'Args: pProdID = a string of the MSI Product ID to be wiped
'Returns: N/A
'
'Requirements: WI = WindowsInstaller.Installer
Dim rc
rc = WI.ProductState(pProdID)
'FIXME
'something about this check is not as precise as it should be. Need to find info
'about different install states and find ways to handle them all
'TEMP FIX ONLY
On Error Resume Next
'END OF TEMP FIX
If rc <> msiInstallStateUnknown Then
'remove it
WI.ConfigureProduct pProdID, 0, msiInstallStateAbsent 'second param is ignored
End If
End Sub
' VERSION CHECKING
WSHVersionCheck
WIVersionCheck
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End of Decal Installer Library <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
'>>>>>>>>>>>>>>>>>>>>>>>>>>>START SCRIPT<<<<<<<<<<<<<<<<<<<<<<<<
'variables
Dim retval, strProductFolder, strProp, strUninstaller, strPathToFavIcon, TXT, i, ProductsToRemove
'make sure they really want to do this
retval = MsgBox("You are about to remove all old " & ThisProduct & " versions and install " & ThisProduct & " v" & ThisVersion & " ", _
vbOkCancel + vbQuestion, _
ThisProduct &" Installer")
If retval = vbCancel Then WScript.Quit
'Before starting, lookup and store the Decal path if it exists
On Error Resume Next 'will fail if not found, leaving an empty string
strDecalFolder = WshShell.RegRead(PathRegValue)
On Error GoTo 0
'>>>>>>>>>>>>>>>UNINSTALLING OLD VERSIONS<<<<<<<<<<<<<<<<<
'Remove MSIs by product code
ProductsToRemove = AllProducts.Items
For i = 0 To UBound(ProductsToRemove)
WipeProduct ProductsToRemove(i)
Next
'>>>>>>>>>>>>>>>>>>>>INSTALLING PDODUCT<<<<<<<<<<<<<<<<<<<<<<<<<<
'install .msi with remembered install path if it exists
strProp = "DISABLEADVTSHORTCUTS=True"
If Len(strProductFolder) > 0 Then strProp = strProp & " TARGETDIR=""" & strProductFolder & """"
WI.UILevel = msiUILevelFull
On Error Resume Next
WI.InstallProduct MSIFileName, strProp
On Error GoTo 0
If Err.Number <> 0 Then WScript.Quit
'The old command line:
'WshShell.Run "msiexec /i Decal.msi " & strProp
'Favorites icon?
If Len(FavoriteName) > 0 And Len(FavoriteURL) > 0 Then
strPathToFavIcon = FSO.BuildPath(WshShell.SpecialFolders("Favorites"), FavoriteName & ".url")
'is is there already?
If Not FSO.FileExists(strPathToFavIcon) Then
retval = MsgBox("Would you like a shortcut to the " & ThisProduct & " Homepage placed in your Favorites menu?", _
vbYesNo + vbQuestion, _
ThisProduct & " Installer")
If retval = vbYes Then
Set TXT = FSO.CreateTextFile(strPathToFavIcon)
TXT.WriteLine "[InternetShortcut]"
TXT.WriteLine "URL=" & FavoriteURL
On Error Resume Next
strProductFolder = WshShell.RegRead(PathRegValue)
On Error GoTo 0
If Len(FavoriteIconFile) > 0 And Len(FavoriteIconID) > 0 And Len(strProductFolder) > 0 Then
TXT.WriteLine "IconFile=" & FSO.BuildPath(strProductFolder, FavoriteIconFile)
TXT.WriteLine "IconIndex=" & FavoriteIconID
End If
TXT.Close
End If
End If
End If
MsgBox ThisProduct & " Installation Completed", _
vbOkOnly + vbInformation, _
ThisProduct & " Installer"

BIN
Installer/Res/decalbar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
Installer/Res/gdiplus.dll Normal file

Binary file not shown.

78
Installer/Res/howto.txt Normal file
View file

@ -0,0 +1,78 @@
How to make a new Decal installer:
Update from CVS (or make sure you have the version of the code you want to release)
Update readme.rtf to reflect the current state of Decal
Open the provided VSI project files (DecalInstaller.sln and DecalInstaller.wip)
Change the Product Name, Product Code, Version, Version string in the registry, and whatever else needs to be changed in the installer (but NOT the filename)
Build a new installer
Open Install.vbs
Add a new uninstall entry for the current Product code using the others as an example (AllProducts.Add "<version>", "<GUID>")
Change the ThisVersion constant to reflect the new version number
Save and Close Install.vbs and VSI
Open EnZip 3.00 ( freeware: http://www.cpam.freeserve.co.uk/ )
Choose File, New Archive... (or hit Ctrl-N)
Give a filename such as "Decal_2000.zip" for Decal 2.0.0.0
Add Decal.msi and Install.vbs to the files, using maximum compression (available on the Options tab)
Choose Tools, Create Self-Extractor... (or hit Shift-X)
Click Next to customize the extractor
Click Next to NOT have a message box
Click Next to have it extract to the TEMP folder
Change the Tile Caption to "Decal Installer" and Click Next
Type "Install.vbs" in the Command box, leave the Parameters box empty, then hit Next
Click the Change Icon... button and select the Decal.ico from the source/Installer/Res folder
Select the first icon and Click Ok, then Click Next
Uncheck Display Run Command Checkbox
Check Unzip Automaticly
Make sure Default to overwrite files without prompting is selected
Click Next, then Click Yes to bypass the warning
Verify your options in the displayed listbox and then hit Create (this may look like it's not doing anything, but it is)
When it completes, hit Test Self-Extracting ZIP file now
If everything went ok, it should display a command prompt window while previous Decal versions are uninstalled, then close and start the Decal installer MSI
Click Close, then close EnZip
VERIFY!!!!!!!!
Make sure there is only ONE add/remove entry for Decal
Make sure there is only ONE Decal group in the Start Menu
Make sure there is only ONE Decal icon on the Desktop
Make sure ALL the file versions are correct
Load up Decal and make sure it runs properly (to verify things such as registry values)
Attempt to delete all of the shortcuts, then open IE. If the installer starts and repairs the shortcuts something is wrong.
Test the FavIcon creation
Generally kick it around and attempt to break it
COMMIT!!!!
Commit your new changes with a tag (so that the installer can be rebuilt in it's current state at any time)
If this is a release version (not BETA), create a branch for bugfixes
Upload the binary to SourceForge (see sf.net instructions)
Test the download and verify you get the same file you uploaded
Change the homepage of decaldev.sf.net to point to the new download

132
Installer/Res/readme.rtf Normal file
View file

@ -0,0 +1,132 @@
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f37\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Georgia;}
{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}
{\f43\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
{\f58\fmodern\fcharset238\fprq1 Courier New CE;}{\f59\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f61\fmodern\fcharset161\fprq1 Courier New Greek;}{\f62\fmodern\fcharset162\fprq1 Courier New Tur;}{\f63\fmodern\fcharset177\fprq1 Courier New (Hebrew);}
{\f64\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f65\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f66\fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f408\froman\fcharset238\fprq2 Georgia CE;}{\f409\froman\fcharset204\fprq2 Georgia Cyr;}
{\f411\froman\fcharset161\fprq2 Georgia Greek;}{\f412\froman\fcharset162\fprq2 Georgia Tur;}{\f415\froman\fcharset186\fprq2 Georgia Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;
\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;
\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{\*\cs15 \additive \ul\cf2 \sbasedon10 \styrsid13959554 Hyperlink;}}{\*\listtable
{\list\listtemplateid409371626\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}}{\listname ;}\listid-2}{\list\listtemplateid1512880686\listsimple{\listlevel
\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid190145115}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255
\levelnfcn255\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid204221188}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255
\leveljc0\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid399254398}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0
\leveljcn0\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid462045303}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0
\levelfollow0\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid543324763}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid561211173}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid583338098}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid590091954}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid771126764}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid855463441}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1214316582}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1300184623}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1403941801}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1538081160}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1551961698}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1734812107}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1813057095}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid1889994174}{\list\listtemplateid1512880686\listsimple{\listlevel\levelnfc255\levelnfcn255\leveljc0\leveljcn0\levelfollow0
\levelstartat0\levelold\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 }{\listname ;}\listid2028016505}}{\*\listoverridetable{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23
\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-283\li283\lin283 }}\ls1}{\listoverride\listid543324763\listoverridecount0\ls2}
{\listoverride\listid2028016505\listoverridecount0\ls3}{\listoverride\listid190145115\listoverridecount0\ls4}{\listoverride\listid1403941801\listoverridecount0\ls5}{\listoverride\listid1889994174\listoverridecount0\ls6}{\listoverride\listid204221188
\listoverridecount0\ls7}{\listoverride\listid583338098\listoverridecount0\ls8}{\listoverride\listid561211173\listoverridecount0\ls9}{\listoverride\listid1214316582\listoverridecount0\ls10}{\listoverride\listid771126764\listoverridecount0\ls11}
{\listoverride\listid462045303\listoverridecount0\ls12}{\listoverride\listid1538081160\listoverridecount0\ls13}{\listoverride\listid590091954\listoverridecount0\ls14}{\listoverride\listid1734812107\listoverridecount0\ls15}{\listoverride\listid1300184623
\listoverridecount0\ls16}{\listoverride\listid855463441\listoverridecount0\ls17}{\listoverride\listid399254398\listoverridecount0\ls18}{\listoverride\listid1551961698\listoverridecount0\ls19}{\listoverride\listid1813057095\listoverridecount0\ls20}}
{\*\rsidtbl \rsid1721752\rsid1909948\rsid11889854\rsid13959554}{\*\generator Microsoft Word 10.0.2627;}{\info{\title Decal README}{\author Adam Wright}{\operator Jeffrey Dodge}{\creatim\yr2002\mo10\dy3\hr3\min43}{\revtim\yr2003\mo6\dy23\hr3\min4}
{\version4}{\edmins9}{\nofpages2}{\nofwords407}{\nofchars2321}{\*\company The Anarchs}{\nofcharsws2723}{\vern16437}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind4\viewscale100\nolnhtadjtbl\rsidroot13959554 \fet0\sectd \linex0\headery709\footery709\colsx709\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}\pard\plain \qc \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\b\f37\fs28\cf1\insrsid13959554 Decal README
\par }{\f2\fs20\cf1\insrsid13959554
\par }{\fs20\cf1\insrsid11889854 This is the 2}{\fs20\cf1\super\insrsid11889854\charrsid11889854 nd}{\fs20\cf1\insrsid11889854 release candidate of Decal version 2.5.2.0}{\fs20\cf1\insrsid13959554 .
\par
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\fs22\cf1\insrsid11889854 This is Decal 2.5.2.0 Release Candidate 2 -- a }{\fs22\cf1\insrsid13959554 supported release. We hope that our release}{\fs22\cf1\insrsid11889854 candidates}{
\fs22\cf1\insrsid13959554 are bug free, but if you run into problems, please report them at }{\field{\*\fldinst {\fs22\cf1\insrsid13959554 HYPERLINK "http://forums.acdev.org/phpBB2/viewforum.php" }{\fs22\cf1\insrsid1909948\charrsid1721752 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000002d00000068007400740070003a002f002f0066006f00720075006d0073002e00610063006400650076002e006f00720067002f007000680070004200420032002f00760069006500770066006f00720075006d002e007000680070000000e0c9ea79f9bace11
8c8200aa004ba90b5a00000068007400740070003a002f002f0066006f00720075006d0073002e00610063006400650076002e006f00720067002f007000680070004200420032002f00760069006500770066006f00720075006d002e00700068007000000000}}}{\fldrslt {
\cs15\fs22\ul\cf2\insrsid13959554\charrsid1721752 http://forums.acdev.org/phpBB2/viewforum.php}}}{\fs22\cf1\insrsid13959554 .
\par This way we can keep track of what the current issues are and work to fix them for the }{\fs22\cf1\insrsid11889854 final release of Decal 2.5.2.0.}{\fs22\cf1\insrsid13959554
\par
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0\pararsid11889854 {\b\fs22\cf1\insrsid11889854 Changes since Release 2.5.2.0 RC1
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854
{\fs22\cf1\insrsid11889854 Fixed DenAgent inject dependency. Inject.dll may now reside anywhere on your system.}{\b\fs22\cf1\insrsid11889854\charrsid11889854
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854
{\fs22\cf1\insrsid11889854 Fixed several DenAgent crashes.}{\b\fs22\cf1\insrsid11889854\charrsid11889854
\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0\pararsid11889854 {\fs22\cf1\insrsid11889854
\par }{\b\fs22\cf1\insrsid11889854 Changes since Beta 2.5.0.5
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854
{\fs22\cf1\insrsid11889854 Lots of bugfixes}{\b\fs22\cf1\insrsid11889854\charrsid11889854
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854
{\fs22\cf1\insrsid11889854 The identify queue no longer fights with the client over whether or not the id panel is closed or open.}{\b\fs22\cf1\insrsid11889854\charrsid11889854
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid11889854 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid11889854
{\fs22\cf1\insrsid11889854 Manually identifying an item sends it to the top of the identify queue \endash you should notice that it is far easier to identify items manually now if a plugin is requesting several items to be identified.}{
\b\fs22\cf1\insrsid11889854
\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\fs22\cf1\insrsid11889854
\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554 Changes since Release 2.5.0.1 RC1
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554
{\fs22\cf1\insrsid13959554 Far too many to list \endash most signifigant is the id queue}{\b\fs22\cf1\insrsid13959554
\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.5.0.1 RC1
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554
{\fs22\cf1\insrsid13959554 Install now enters correct version into the registry}{\b\fs22\cf1\insrsid13959554
\par }\pard \ql \li0\ri0\nowidctlpar{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.5.0.0 RC3
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554
{\fs22\cf1\insrsid13959554 .Net plugins will now show their version in the agent, rather than the version of the .Net COM proxy.}{\b\fs22\cf1\insrsid13959554
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-283\li283\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}\faauto\ls1\rin0\lin283\itap0\pararsid13959554
{\fs22\cf1\insrsid13959554 ACHooks slightly cleaned up, should now behave as it did in 2.5.0.0 RC1.}{\b\fs22\cf1\insrsid13959554
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\rin0\lin0\itap0 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.5.0.0 RC1
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls2\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls2\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
CharStats will no longer crash if you switch characters too quickly
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls3\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls3\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
IPluginSink fix \endash if Decal never accepted your command line input, it should now
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls4\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls4\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
Much ACHooks cleanup and many fixes as well as new hooks for developers to use
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.4.1.4
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls5\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls5\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554 ?
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.4.1.3
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls6\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls6\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
CharStats fixes (enchantments should be far more reliable now)
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls7\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls7\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
Changes to the way controls track focus events
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls8\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls8\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
DenAgent no longer deletes XML files if there were problems updating
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls9\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls9\rin0\lin360\itap0\pararsid13959554 {\fs22\cf1\insrsid13959554
Add 'mask' option for vectors to handle animation packet
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.4.1.2
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls10\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls10\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 Compiled in VC6 (works on windows 9x again)
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls11\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls11\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 CharacterStats fixes
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls12\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls12\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 WorldFilter fixes
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554
\par Changes since Release 2.4.1.0
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls13\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls13\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks: QueryMemLoc added to the IDL (it should have always been there).
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls14\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls14\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks->QueryMemLoc now returns NULL if there is a client and memlocs.xml version mismatch.
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls15\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls15\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks is created by the Decal object rather than IPluginSite. As a result Services can obtain a reference to it now.
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls16\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls16\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks: SendTellEx Hook
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls17\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls17\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 DecalNet: Uses client hooks for a quicker and more stable parsing method. If the memory locations are not there, it falls back to the previous parser.
\par }\pard \ql \li0\ri0\nowidctlpar\faauto\ilvl12\rin0\lin0\itap0\pararsid13959554 {\b\fs22\cf1\insrsid13959554
\par
\par Changes since Release 2.4
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls18\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls18\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks: Added hook for SetAutoRun
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls19\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls19\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 ACHooks: Added hood for SendTell
\par {\pntext\pard\plain\f3\fs22\cf1\insrsid13959554 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ql \fi-360\li360\ri0\nowidctlpar{\*\pn \pnlvlbody\ilvl0\ls20\pnrnot0\pnf3 {\pntxtb \'b7}}\faauto\ls20\rin0\lin360\itap0\pararsid13959554 {
\fs22\cf1\insrsid13959554 WorldFilter: Now uses DestroyedObject hook, this should result in less lag and better memory usage
\par }}