unit DXCommon; interface //{$DEFINE ERRORFUNCS} uses Windows; const UnrecognizedError = 'Unrecognized Error'; type {$IFDEF UNICODE} PCharAW = PWideChar; {$ELSE} PCharAW = PAnsiChar; {$ENDIF} function IsNTandDelphiRunning : boolean; function RegGetStringValue(Hive: HKEY; const KeyName, ValueName: string): string; function ExistFile(const FileName: string): Boolean; function Trunc(const x : Single) : Integer; function Frac(const x : Single) : Single; function Round(const x : Single) : Integer; {$IFDEF ERRORFUNCS} function DXErrorString(Error: HResult): string; function DXErrorMessage(Error: HResult): boolean; {$ENDIF} implementation {$IFDEF ERRORFUNCS} uses DirectInput8, DirectInput, DirectSound, DirectMusic, DirectPlay, DirectPlay8, Direct3D, Direct3DRM, DirectDraw, DirectShow, DirectXGraphics, Dialogs, SysUtils; function DXErrorMessage(Error: HResult): boolean; begin Result := FAILED(Error); if Result then MessageDlg(DXErrorString(Error), mtError, [mbAbort], 0); end; function DXErrorString(Error: HResult): string; var Facility: DWORD; begin Facility := (Error shr 16) and $7FFF; case Facility of // Direct3D, DirectDraw _FACD3D : if (Error and $FFFF) > D3DERR_WRONGTEXTUREFORMAT then Result := DirectXGraphics.DXGErrorString(Error) else Result := DirectDraw.DDErrorString(Error); // DirectMusic, DirectSound _FACDS : if (Error and $FFFF) > DMUS_ERRBASE then Result := DirectMusic.DMErrorString(Error) else Result := DirectSound.DSErrorString(Error); // DirectPlay _FACDPV : Result := DirectPlay8.DPErrorString(Error); _FACDPV7: Result := DirectPlay.DPErrorString(Error); //Definitions still to come else case Error of S_OK : Result := ''; S_FALSE : Result := ''; E_INVALIDARG : Result := ''; E_NOINTERFACE : Result := ''; E_FAIL : Result := ''; E_OUTOFMEMORY : Result := ''; E_NOTIMPL : Result := ''; E_ACCESSDENIED : Result := ''; else Result := DirectInput.DIErrorString(Error); end; end; end; {$ENDIF} function RegGetStringValue(Hive: HKEY; const KeyName, ValueName: string): string; var EnvKey : HKEY; Buf : array[0..255] of char; BufSize : DWord; RegType : DWord; rc : DWord; begin Result := ''; BufSize := Sizeof(Buf); ZeroMemory(@Buf, BufSize); RegType := REG_SZ; try if (RegOpenKeyEx(Hive, PChar(KeyName), 0, KEY_READ, EnvKey) = ERROR_SUCCESS) then begin try if (ValueName = '') then rc := RegQueryValueEx(EnvKey, nil, nil, @RegType, @Buf, @BufSize) else rc := RegQueryValueEx(EnvKey, PChar(ValueName), nil, @RegType, @Buf, @BufSize); if rc = ERROR_SUCCESS then Result := string(Buf); finally RegCloseKey(EnvKey); end; end; finally RegCloseKey(Hive); end; end; function ExistFile(const FileName: string): Boolean; var hFile: THandle; begin hFile := CreateFile(PChar(FileName), 0, 0, nil, OPEN_EXISTING, 0, 0); Result := hFile <> INVALID_HANDLE_VALUE; if Result = true then CloseHandle(hFile); end; function IsNTandDelphiRunning : boolean; var OSVersion : TOSVersionInfo; AppName : array[0..255] of char; begin OSVersion.dwOsVersionInfoSize := sizeof(OSVersion); GetVersionEx(OSVersion); // Not running in NT or program is not Delphi itself ? AppName[0] := #0; lstrcat(AppName, PChar(ParamStr(0))); // ParamStr(0) = Application.ExeName CharUpperBuff(AppName, SizeOf(AppName)); result := ( (OSVersion.dwPlatformID = VER_PLATFORM_WIN32_NT) and (Pos('DELPHI32.EXE', AppName) = Length(AppName) - Length('DELPHI32.EXE') + 1) ); end; function Trunc(const x : Single) : Integer; register; const cwChop : Word = $1F3F; asm SUB ESP,8 FSTCW [ESP] FLDCW cwChop FLD x FISTP dword ptr [ESP+4] FLDCW [ESP] POP ECX POP EAX end; function Frac(const x : Single) : Single; register; begin Result := x - Trunc(x); end; function Round(const x : Single) : Integer; register; asm SUB ESP,4 FLD x FISTP dword ptr [ESP] POP EAX end; end.