422 lines
17 KiB
ObjectPascal
422 lines
17 KiB
ObjectPascal
{******************************************************************************}
|
|
{* *}
|
|
{* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved. *}
|
|
{* *}
|
|
{* Files: dsetup.h *}
|
|
{* Content: DirectXSetup, error codes and flags *}
|
|
{* *}
|
|
{* DirectX 9.0 Delphi / FreePascal adaptation by Alexey Barkovoy *}
|
|
{* E-Mail: directx@clootie.ru *}
|
|
{* *}
|
|
{* Latest version can be downloaded from: *}
|
|
{* http://www.clootie.ru *}
|
|
{* http://sourceforge.net/projects/delphi-dx9sdk *}
|
|
{* *}
|
|
{*----------------------------------------------------------------------------*}
|
|
{* $Id: DirectSetup.pas,v 1.1 2005/10/10 21:11:07 clootie Exp $ }
|
|
{******************************************************************************}
|
|
{ }
|
|
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
|
|
{ }
|
|
{ The contents of this file are used with permission, subject to the Mozilla }
|
|
{ Public License Version 1.1 (the "License"); you may not use this file except }
|
|
{ in compliance with the License. You may obtain a copy of the License at }
|
|
{ http://www.mozilla.org/MPL/MPL-1.1.html }
|
|
{ }
|
|
{ Software distributed under the License is distributed on an "AS IS" basis, }
|
|
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
|
|
{ the specific language governing rights and limitations under the License. }
|
|
{ }
|
|
{ Alternatively, the contents of this file may be used under the terms of the }
|
|
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
|
|
{ provisions of the LGPL License are applicable instead of those above. }
|
|
{ If you wish to allow use of your version of this file only under the terms }
|
|
{ of the LGPL License and not to allow others to use your version of this file }
|
|
{ under the MPL, indicate your decision by deleting the provisions above and }
|
|
{ replace them with the notice and other provisions required by the LGPL }
|
|
{ License. If you do not delete the provisions above, a recipient may use }
|
|
{ your version of this file under either the MPL or the LGPL License. }
|
|
{ }
|
|
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
|
|
{ }
|
|
{******************************************************************************}
|
|
|
|
{$I DirectX.inc}
|
|
|
|
unit DirectSetup;
|
|
|
|
interface
|
|
|
|
(*$HPPEMIT '#include "dsetup.h"' *)
|
|
|
|
uses
|
|
Windows;
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Global level dynamic loading support
|
|
{$IFDEF DYNAMIC_LINK_ALL}
|
|
{$DEFINE DIRECTSETUP_DYNAMIC_LINK}
|
|
{$ENDIF}
|
|
{$IFDEF DYNAMIC_LINK_EXPLICIT_ALL}
|
|
{$DEFINE DIRECTSETUP_DYNAMIC_LINK_EXPLICIT}
|
|
{$ENDIF}
|
|
|
|
// Remove "dots" below to force some kind of dynamic linking
|
|
{.$DEFINE DIRECTSETUP_DYNAMIC_LINK}
|
|
{.$DEFINE DIRECTSETUP_DYNAMIC_LINK_EXPLICIT}
|
|
|
|
|
|
const
|
|
// FOURCC_VERS = mmioFOURCC('v','e','r','s')
|
|
FOURCC_VERS = Byte('v') or (Byte('e') shl 8) or (Byte('r') shl 16) or (Byte('s') shl 24);
|
|
{$EXTERNALSYM FOURCC_VERS}
|
|
|
|
// DSETUP Error Codes, must remain compatible with previous setup.
|
|
DSETUPERR_SUCCESS_RESTART = 1;
|
|
{$EXTERNALSYM DSETUPERR_SUCCESS_RESTART}
|
|
DSETUPERR_SUCCESS = 0;
|
|
{$EXTERNALSYM DSETUPERR_SUCCESS}
|
|
DSETUPERR_BADWINDOWSVERSION = -1;
|
|
{$EXTERNALSYM DSETUPERR_BADWINDOWSVERSION}
|
|
DSETUPERR_SOURCEFILENOTFOUND = -2;
|
|
{$EXTERNALSYM DSETUPERR_SOURCEFILENOTFOUND}
|
|
DSETUPERR_NOCOPY = -5;
|
|
{$EXTERNALSYM DSETUPERR_NOCOPY}
|
|
DSETUPERR_OUTOFDISKSPACE = -6;
|
|
{$EXTERNALSYM DSETUPERR_OUTOFDISKSPACE}
|
|
DSETUPERR_CANTFINDINF = -7;
|
|
{$EXTERNALSYM DSETUPERR_CANTFINDINF}
|
|
DSETUPERR_CANTFINDDIR = -8;
|
|
{$EXTERNALSYM DSETUPERR_CANTFINDDIR}
|
|
DSETUPERR_INTERNAL = -9;
|
|
{$EXTERNALSYM DSETUPERR_INTERNAL}
|
|
DSETUPERR_UNKNOWNOS = -11;
|
|
{$EXTERNALSYM DSETUPERR_UNKNOWNOS}
|
|
DSETUPERR_NEWERVERSION = -14;
|
|
{$EXTERNALSYM DSETUPERR_NEWERVERSION}
|
|
DSETUPERR_NOTADMIN = -15;
|
|
{$EXTERNALSYM DSETUPERR_NOTADMIN}
|
|
DSETUPERR_UNSUPPORTEDPROCESSOR = -16;
|
|
{$EXTERNALSYM DSETUPERR_UNSUPPORTEDPROCESSOR}
|
|
DSETUPERR_MISSINGCAB_MANAGEDDX = -17;
|
|
{$EXTERNALSYM DSETUPERR_MISSINGCAB_MANAGEDDX}
|
|
DSETUPERR_NODOTNETFRAMEWORKINSTALLED = -18;
|
|
{$EXTERNALSYM DSETUPERR_NODOTNETFRAMEWORKINSTALLED}
|
|
DSETUPERR_CABDOWNLOADFAIL = -19;
|
|
{$EXTERNALSYM DSETUPERR_CABDOWNLOADFAIL}
|
|
DSETUPERR_DXCOMPONENTFILEINUSE = -20;
|
|
{$EXTERNALSYM DSETUPERR_DXCOMPONENTFILEINUSE}
|
|
DSETUPERR_UNTRUSTEDCABINETFILE = -21;
|
|
{$EXTERNALSYM DSETUPERR_UNTRUSTEDCABINETFILE}
|
|
|
|
// DSETUP flags. DirectX 5.0 apps should use these flags only.
|
|
DSETUP_DDRAWDRV = $00000008; (* install DirectDraw Drivers *)
|
|
{$EXTERNALSYM DSETUP_DDRAWDRV}
|
|
DSETUP_DSOUNDDRV = $00000010; (* install DirectSound Drivers *)
|
|
{$EXTERNALSYM DSETUP_DSOUNDDRV}
|
|
DSETUP_DXCORE = $00010000; (* install DirectX runtime *)
|
|
{$EXTERNALSYM DSETUP_DXCORE}
|
|
DSETUP_DIRECTX = (DSETUP_DXCORE or DSETUP_DDRAWDRV or DSETUP_DSOUNDDRV);
|
|
{$EXTERNALSYM DSETUP_DIRECTX}
|
|
DSETUP_MANAGEDDX = $00004000; (* OBSOLETE. install managed DirectX *)
|
|
{$EXTERNALSYM DSETUP_MANAGEDDX}
|
|
DSETUP_TESTINSTALL = $00020000; (* just test install, don't do anything *)
|
|
{$EXTERNALSYM DSETUP_TESTINSTALL}
|
|
|
|
// These OBSOLETE flags are here for compatibility with pre-DX5 apps only.
|
|
// They are present to allow DX3 apps to be recompiled with DX5 and still work.
|
|
// DO NOT USE THEM for DX5. They will go away in future DX releases.
|
|
DSETUP_DDRAW = $00000001; (* OBSOLETE. install DirectDraw *)
|
|
{$EXTERNALSYM DSETUP_DDRAW}
|
|
DSETUP_DSOUND = $00000002; (* OBSOLETE. install DirectSound *)
|
|
{$EXTERNALSYM DSETUP_DSOUND}
|
|
DSETUP_DPLAY = $00000004; (* OBSOLETE. install DirectPlay *)
|
|
{$EXTERNALSYM DSETUP_DPLAY}
|
|
DSETUP_DPLAYSP = $00000020; (* OBSOLETE. install DirectPlay Providers *)
|
|
{$EXTERNALSYM DSETUP_DPLAYSP}
|
|
DSETUP_DVIDEO = $00000040; (* OBSOLETE. install DirectVideo *)
|
|
{$EXTERNALSYM DSETUP_DVIDEO}
|
|
DSETUP_D3D = $00000200; (* OBSOLETE. install Direct3D *)
|
|
{$EXTERNALSYM DSETUP_D3D}
|
|
DSETUP_DINPUT = $00000800; (* OBSOLETE. install DirectInput *)
|
|
{$EXTERNALSYM DSETUP_DINPUT}
|
|
DSETUP_DIRECTXSETUP = $00001000; (* OBSOLETE. install DirectXSetup DLL's *)
|
|
{$EXTERNALSYM DSETUP_DIRECTXSETUP}
|
|
DSETUP_NOUI = $00002000; (* OBSOLETE. install DirectX with NO UI *)
|
|
{$EXTERNALSYM DSETUP_NOUI}
|
|
DSETUP_PROMPTFORDRIVERS = $10000000; (* OBSOLETE. prompt when replacing display/audio drivers *)
|
|
{$EXTERNALSYM DSETUP_PROMPTFORDRIVERS}
|
|
DSETUP_RESTOREDRIVERS = $20000000; (* OBSOLETE. restore display/audio drivers *)
|
|
{$EXTERNALSYM DSETUP_RESTOREDRIVERS}
|
|
|
|
|
|
//******************************************************************
|
|
// DirectX Setup Callback mechanism
|
|
//******************************************************************
|
|
|
|
// DSETUP Message Info Codes, passed to callback as Reason parameter.
|
|
DSETUP_CB_MSG_NOMESSAGE = 0;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_NOMESSAGE}
|
|
DSETUP_CB_MSG_INTERNAL_ERROR = 10;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_INTERNAL_ERROR}
|
|
DSETUP_CB_MSG_BEGIN_INSTALL = 13;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_BEGIN_INSTALL}
|
|
DSETUP_CB_MSG_BEGIN_INSTALL_RUNTIME = 14;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_BEGIN_INSTALL_RUNTIME}
|
|
DSETUP_CB_MSG_PROGRESS = 18;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_PROGRESS}
|
|
DSETUP_CB_MSG_WARNING_DISABLED_COMPONENT = 19;
|
|
{$EXTERNALSYM DSETUP_CB_MSG_WARNING_DISABLED_COMPONENT}
|
|
|
|
|
|
type
|
|
PDSetupCBProgress = ^TDSetupCBProgress;
|
|
_DSETUP_CB_PROGRESS = record
|
|
dwPhase: DWORD;
|
|
dwInPhaseMaximum: DWORD;
|
|
dwInPhaseProgress: DWORD;
|
|
dwOverallMaximum: DWORD;
|
|
dwOverallProgress: DWORD;
|
|
end;
|
|
{$EXTERNALSYM _DSETUP_CB_PROGRESS}
|
|
DSETUP_CB_PROGRESS = _DSETUP_CB_PROGRESS;
|
|
{$EXTERNALSYM DSETUP_CB_PROGRESS}
|
|
TDSetupCBProgress = _DSETUP_CB_PROGRESS;
|
|
|
|
|
|
_DSETUP_CB_PROGRESS_PHASE = (
|
|
DSETUP_INITIALIZING,
|
|
DSETUP_EXTRACTING,
|
|
DSETUP_COPYING,
|
|
DSETUP_FINALIZING
|
|
);
|
|
{$EXTERNALSYM _DSETUP_CB_PROGRESS_PHASE}
|
|
TDSetupCBProgressPhase = _DSETUP_CB_PROGRESS_PHASE;
|
|
|
|
|
|
//
|
|
// Data Structures
|
|
//
|
|
|
|
PDirectXRegisterAppA = ^TDirectXRegisterAppA;
|
|
_DIRECTXREGISTERAPPA = record
|
|
dwSize: DWORD;
|
|
dwFlags: DWORD;
|
|
lpszApplicationName: PAnsiChar;
|
|
lpGUID: PGUID;
|
|
lpszFilename: PAnsiChar;
|
|
lpszCommandLine: PAnsiChar;
|
|
lpszPath: PAnsiChar;
|
|
lpszCurrentDirectory: PAnsiChar;
|
|
end;
|
|
{$EXTERNALSYM _DIRECTXREGISTERAPPA}
|
|
DIRECTXREGISTERAPPA = _DIRECTXREGISTERAPPA;
|
|
{$EXTERNALSYM DIRECTXREGISTERAPPA}
|
|
TDirectXRegisterAppA = _DIRECTXREGISTERAPPA;
|
|
|
|
PDirectXRegisterApp2A = ^TDirectXRegisterApp2A;
|
|
_DIRECTXREGISTERAPP2A = record
|
|
dwSize: DWORD;
|
|
dwFlags: DWORD;
|
|
lpszApplicationName: PAnsiChar;
|
|
lpGUID: PGUID;
|
|
lpszFilename: PAnsiChar;
|
|
lpszCommandLine: PAnsiChar;
|
|
lpszPath: PAnsiChar;
|
|
lpszCurrentDirectory: PAnsiChar;
|
|
lpszLauncherName: PAnsiChar;
|
|
end;
|
|
{$EXTERNALSYM _DIRECTXREGISTERAPP2A}
|
|
DIRECTXREGISTERAPP2A = _DIRECTXREGISTERAPP2A;
|
|
{$EXTERNALSYM DIRECTXREGISTERAPP2A}
|
|
TDirectXRegisterApp2A = _DIRECTXREGISTERAPP2A;
|
|
|
|
PDirectXRegisterAppW = ^TDirectXRegisterAppW;
|
|
_DIRECTXREGISTERAPPW = record
|
|
dwSize: DWORD;
|
|
dwFlags: DWORD;
|
|
lpszApplicationName: PWideChar;
|
|
lpGUID: PGUID;
|
|
lpszFilename: PWideChar;
|
|
lpszCommandLine: PWideChar;
|
|
lpszPath: PWideChar;
|
|
lpszCurrentDirectory: PWideChar;
|
|
end;
|
|
{$EXTERNALSYM _DIRECTXREGISTERAPPW}
|
|
DIRECTXREGISTERAPPW = _DIRECTXREGISTERAPPW;
|
|
{$EXTERNALSYM DIRECTXREGISTERAPPW}
|
|
TDirectXRegisterAppW = _DIRECTXREGISTERAPPW;
|
|
|
|
PDirectXRegisterApp2W = ^TDirectXRegisterApp2W;
|
|
_DIRECTXREGISTERAPP2W = record
|
|
dwSize: DWORD;
|
|
dwFlags: DWORD;
|
|
lpszApplicationName: PWideChar;
|
|
lpGUID: PGUID;
|
|
lpszFilename: PWideChar;
|
|
lpszCommandLine: PWideChar;
|
|
lpszPath: PWideChar;
|
|
lpszCurrentDirectory: PWideChar;
|
|
lpszLauncherName: PWideChar;
|
|
end;
|
|
{$EXTERNALSYM _DIRECTXREGISTERAPP2W}
|
|
DIRECTXREGISTERAPP2W = _DIRECTXREGISTERAPP2W;
|
|
{$EXTERNALSYM DIRECTXREGISTERAPP2W}
|
|
TDirectXRegisterApp2W = _DIRECTXREGISTERAPP2W;
|
|
|
|
|
|
PDirectXRegisterApp = ^TDirectXRegisterApp;
|
|
PDirectXRegisterApp2 = ^TDirectXRegisterApp2;
|
|
{$IFDEF UNICODE}
|
|
TDirectXRegisterApp = TDirectXRegisterAppW;
|
|
TDirectXRegisterApp2 = TDirectXRegisterAppW2;
|
|
{$ELSE}
|
|
TDirectXRegisterApp = TDirectXRegisterAppA;
|
|
TDirectXRegisterApp2 = TDirectXRegisterApp2A;
|
|
{$ENDIF}
|
|
|
|
|
|
//
|
|
// API
|
|
//
|
|
|
|
var
|
|
DirectXSetupW: function (hWnd: HWND; lpszRootPath: PWideChar; dwFlags: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetupW}
|
|
DirectXSetupA: function (hWnd: HWND; lpszRootPath: PAnsiChar; dwFlags: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetupA}
|
|
DirectXSetup: function (hWnd: HWND; lpszRootPath: PChar; dwFlags: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetup}
|
|
|
|
DirectXRegisterApplicationW: function (hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppW): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXRegisterApplicationW}
|
|
DirectXRegisterApplicationA: function (hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppA): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXRegisterApplicationA}
|
|
DirectXRegisterApplication: function (hWnd: HWND; const lpDXRegApp: TDirectXRegisterApp): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXRegisterApplication}
|
|
|
|
DirectXUnRegisterApplication: function (hWnd: HWND; const lpGUID: TGUID): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXUnRegisterApplication}
|
|
|
|
type
|
|
TDSetupCallback = function (Reason: DWORD; MsgType: DWORD; (* Same as flags to MessageBox *)
|
|
szMessage: PChar; szName: PChar; pInfo: Pointer): DWORD; stdcall;
|
|
{$EXTERNALSYM TDSetupCallback}
|
|
|
|
var
|
|
DirectXSetupSetCallback: function (Callback: TDSetupCallback): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetupSetCallback}
|
|
DirectXSetupGetVersion: function (out lpdwVersion, lpdwMinorVersion: DWORD): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetupGetVersion}
|
|
DirectXSetupShowEULA: function(hWndParent: HWND): Integer; stdcall;
|
|
{$EXTERNALSYM DirectXSetupShowEULA}
|
|
|
|
DirectXSetupGetEULAA: function(lpszEULA: PAnsiChar; cchEULA: LongWord; LangID: Word): LongWord; stdcall;
|
|
{$EXTERNALSYM DirectXSetupGetEULAA}
|
|
DirectXSetupGetEULAW: function(lpszEULA: PWideChar; cchEULA: LongWord; LangID: Word): LongWord; stdcall;
|
|
{$EXTERNALSYM DirectXSetupGetEULAW}
|
|
DirectXSetupGetEULA: function(lpszEULA: PChar; cchEULA: LongWord; LangID: Word): LongWord; stdcall;
|
|
{$EXTERNALSYM DirectXSetupGetEULA}
|
|
|
|
function DirectSetupLoaded: Boolean;
|
|
function UnLoadDirectSetup: Boolean;
|
|
function LoadDirectSetup: Boolean;
|
|
|
|
|
|
implementation
|
|
|
|
const
|
|
DirectSetupDll = 'dsetup.dll';
|
|
|
|
var
|
|
DirectSetupLib: THandle = 0;
|
|
|
|
function DirectSetupLoaded: Boolean;
|
|
begin
|
|
Result:= (DirectSetupLib <> 0);
|
|
end;
|
|
|
|
function UnLoadDirectSetup: Boolean;
|
|
begin
|
|
Result:= True;
|
|
if (DirectSetupLib <> 0) then
|
|
begin
|
|
Result:= Result and FreeLibrary(DirectSetupLib);
|
|
|
|
DirectXSetupA := nil;
|
|
DirectXSetupW := nil;
|
|
DirectXSetup := nil;
|
|
|
|
DirectXRegisterApplicationA := nil;
|
|
DirectXRegisterApplicationW := nil;
|
|
DirectXRegisterApplication := nil;
|
|
|
|
DirectXUnRegisterApplication := nil;
|
|
|
|
DirectXSetupSetCallback := nil;
|
|
DirectXSetupGetVersion := nil;
|
|
DirectXSetupShowEULA := nil;
|
|
|
|
DirectXSetupGetEULAA := nil;
|
|
DirectXSetupGetEULAW := nil;
|
|
DirectXSetupGetEULA := nil;
|
|
|
|
DirectSetupLib:= 0;
|
|
end;
|
|
end;
|
|
|
|
function LoadDirectSetup: Boolean;
|
|
begin
|
|
Result:= DirectSetupLoaded;
|
|
if (not Result) then
|
|
begin
|
|
DirectSetupLib:= LoadLibrary(DirectSetupDll);
|
|
if (DirectSetupLib <> 0) then
|
|
begin
|
|
DirectXSetupA := GetProcAddress(DirectSetupLib, 'DirectXSetupA');
|
|
DirectXSetupW := GetProcAddress(DirectSetupLib, 'DirectXSetupW');
|
|
{$IFDEF UNICODE}
|
|
DirectXSetup := DirectXSetupW;
|
|
{$ELSE}
|
|
DirectXSetup := DirectXSetupA;
|
|
{$ENDIF}
|
|
|
|
DirectXRegisterApplicationA := GetProcAddress(DirectSetupLib, 'DirectXRegisterApplicationA');
|
|
DirectXRegisterApplicationW := GetProcAddress(DirectSetupLib, 'DirectXRegisterApplicationW');
|
|
{$IFDEF UNICODE}
|
|
DirectXRegisterApplication := DirectXRegisterApplicationW;
|
|
{$ELSE}
|
|
DirectXRegisterApplication := DirectXRegisterApplicationA;
|
|
{$ENDIF}
|
|
|
|
DirectXUnRegisterApplication := GetProcAddress(DirectSetupLib, 'DirectXUnRegisterApplication');
|
|
|
|
DirectXSetupSetCallback := GetProcAddress(DirectSetupLib, 'DirectXSetupSetCallback');
|
|
DirectXSetupGetVersion := GetProcAddress(DirectSetupLib, 'DirectXSetupGetVersion');
|
|
DirectXSetupShowEULA := GetProcAddress(DirectSetupLib, 'DirectXSetupShowEULA');;
|
|
|
|
|
|
DirectXSetupGetEULAA := GetProcAddress(DirectSetupLib, 'DirectXSetupGetEULAA');;
|
|
DirectXSetupGetEULAW := GetProcAddress(DirectSetupLib, 'DirectXSetupGetEULAW');;
|
|
{$IFDEF UNICODE}
|
|
DirectXSetupGetEULA := DirectXSetupGetEULAW;
|
|
{$ELSE}
|
|
DirectXSetupGetEULA := DirectXSetupGetEULAA;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
// At least basic procedure is found!
|
|
Result:= Assigned(DirectXSetup);
|
|
if not Result then UnLoadDirectSetup;
|
|
end;
|
|
end;
|
|
|
|
initialization
|
|
{$IFNDEF DIRECTSETUP_DYNAMIC_LINK_EXPLICIT}
|
|
LoadDirectSetup;
|
|
{$ENDIF}
|
|
finalization
|
|
UnLoadDirectSetup;
|
|
end.
|
|
|