#include <WinAPIEx.au3>
#include <Array.au3>
#include <APIConstants.au3>
#include <GDIPlus.au3>
#include <Memory.au3>
#include <StaticConstants.au3>
#include <File.au3>

Global $sDLL = @ScriptDir & "\Resourcen.dll"
Global $sTempFile, $aFiles[1]

Global Const $tagICONDIRENTRY = "BYTE bWidth;BYTE bHeight;BYTE bColorCount;BYTE bReserved;WORD wPlanes;WORD wBitCount;DWORD dwBytesInRes;DWORD dwImageOffset"
Global Const $tagGRPICONDIRENTRY = "BYTE bWidth;BYTE bHeight;BYTE bColorCount;BYTE bReserved;WORD wPlanes;WORD wBitCount;DWORD dwBytesInRes;WORD nID"

Global Const $tagTT_OFFSET_TABLE = "USHORT uMajorVersion;USHORT uMinorVersion;USHORT uNumOfTables;USHORT uSearchRange;USHORT uEntrySelector;USHORT uRangeShift"
Global Const $tagTT_TABLE_DIRECTORY = "char szTag[4];ULONG uCheckSum;ULONG uOffset;ULONG uLength"
Global Const $tagTT_NAME_TABLE_HEADER = "USHORT uFSelector;USHORT uNRCount;USHORT uStorageOffset"
Global Const $tagTT_NAME_RECORD = "USHORT uPlatformID;USHORT uEncodingID;USHORT uLanguageID;USHORT uNameID;USHORT uStringLength;USHORT uStringOffset"

Global Const $SS_REALSIZECONTROL = 0x40


Global $hDLL_Instance, $hResource, $hData, $pData, $iSize
Global $sFontName


While 1
	$sTempFile = FileOpenDialog("Select resource files", @ScriptDir, "All files (*.*)|Icons (*.ico)|Bitmaps (*.bmp)|Fonts (*.ttf)", 3)
	If @error Then ExitLoop
	If $aFiles[0] = "" Then
		$aFiles[0] = $sTempFile
	Else
		_ArrayAdd($aFiles, $sTempFile)
	EndIf
WEnd

_CreateResourceDLL($sDLL, $aFiles)

Global $aIcon = _ArrayFindAll($aFiles, ".ico", 0, 0, 0, 1, 0)
Global $aBitmap = _ArrayFindAll($aFiles, ".bmp", 0, 0, 0, 1, 0)
Global $aJpg = _ArrayFindAll($aFiles, ".jpg", 0, 0, 0, 1, 0)
Global $aFont = _ArrayFindAll($aFiles, ".ttf", 0, 0, 0, 1, 0)

GUICreate("Resource DLL", 800, 800)

If IsArray($aIcon) Then
	For $i = 0 To UBound($aIcon) - 1
		GUICtrlCreateIcon($sDLL, $aFiles[$aIcon[$i]], 10, 10 + 40 * $i, 32, 32, $SS_SUNKEN)
		GUICtrlCreateLabel($aFiles[$aIcon[$i]], 50, 10 + 40 * $i, 120, 32, $SS_CENTERIMAGE)
	Next
EndIf

If IsArray($aBitmap) Then
	For $i = 0 To UBound($aBitmap) - 1
		GUICtrlCreatePic("", 200, 30 + 120 * $i, 100, 100, BitOR($SS_REALSIZECONTROL, $SS_SUNKEN))
		_SetImagefromResource(-1, $aFiles[$aBitmap[$i]], $sDLL, $RT_BITMAP)
		GUICtrlCreatePic("", 310, 30 + 120 * $i, 100, 100, BitOR($SS_CENTERIMAGE, $SS_SUNKEN))
		_SetImagefromResource(-1, $aFiles[$aBitmap[$i]], $sDLL, $RT_BITMAP)
		GUICtrlCreateLabel($aFiles[$aBitmap[$i]], 200, 10 + 120 * $i, 120, 20, 0x200)
	Next
EndIf

If IsArray($aJpg) Then
	For $i = 0 To UBound($aJpg) - 1
		GUICtrlCreatePic("", 440, 30 + 120 * $i, 100, 100, BitOR($SS_REALSIZECONTROL, $SS_SUNKEN))
		_SetImagefromResource(-1, $aFiles[$aJpg[$i]], $sDLL, $RT_RCDATA)
		GUICtrlCreatePic("", 550, 30 + 120 * $i, 100, 100, BitOR($SS_CENTERIMAGE, $SS_SUNKEN))
		_SetImagefromResource(-1, $aFiles[$aJpg[$i]], $sDLL, $RT_RCDATA)
		GUICtrlCreateLabel($aFiles[$aJpg[$i]], 440, 10 + 120 * $i, 120, 20, 0x200)
	Next
EndIf

If IsArray($aFont) Then
	For $i = 0 To UBound($aFont) - 1
		$hDLL_Instance = _WinAPI_LoadLibrary($sDLL)
		$hResource = _WinAPI_FindResource($hDLL_Instance, $RT_FONT, $aFiles[$aFont[$i]])
		$iSize = _WinAPI_SizeOfResource($hDLL_Instance, $hResource)
		$hData = _WinAPI_LoadResource($hDLL_Instance, $hResource)
		$pData = _WinAPI_LockResource($hData)

		$sFontName = _GetFontInfoFromFilePtr($pData)
		$hFont = _WinAPI_AddFontMemResourceEx($pData, $iSize)
		GUICtrlCreateLabel($aFiles[$aFont[$i]] & " - " & $sFontName, 10, 500 + $i * 30, 780, 30, 0x200)
		GUICtrlSetFont(-1, 20, -1, -1, $sFontName)

	Next
EndIf

GUISetState()

Do
Until GUIGetMsg() = -3


Func _CreateResourceDLL($sDLL, ByRef $aFiles)
	If Not IsArray($aFiles) Or $aFiles[0] = "" Then Return SetError(1, 0, 0)
	_CreateEmptyDLL($sDLL)

	Local $hUpdate = _WinAPI_BeginUpdateResource($sDLL, 0)
	If @error Then Return SetError(2, 0, 0)

	Local $hFile, $bFile, $lFile, $tFile, $pFile, $sName, $sExt, $RT_TYPE, $Resource_ID = 0
	Local $tICONDIR, $tICONDIRENTRY, $tGRPICONDIR, $pGRPICONDIR
	Local $Temp
	Local $nSize

	For $i = 0 To UBound($aFiles) - 1
		If Not FileExists($aFiles[$i]) Then SetError(3, 0, 0)

		$hFile = FileOpen($aFiles[$i], 0)
		$bFile = FileRead($hFile)
		FileClose($hFile)
		$lFile = FileGetSize($aFiles[$i])
		$tFile = DllStructCreate("char[" & $lFile & "]")
		DllStructSetData($tFile, 1, $bFile)
		$pFile = DllStructGetPtr($tFile)
		$sName = StringUpper(StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], "\", 0, -1)))
		$sExt = StringTrimLeft($aFiles[$i], StringInStr($aFiles[$i], ".", 0, -1))

		$aFiles[$i] = $sName

		Switch $sExt
			Case "bmp"
				$RT_TYPE = $RT_BITMAP
				$lFile = $lFile - 14
				$pFile = Ptr($pFile + 14)

			Case "ico"
				$RT_TYPE = $RT_ICON

				Local $tB_Input_Header = DllStructCreate("short res;short type;short ImageCount;char rest[" & $lFile - 5 & "]", $pFile)
				Local $pB_Input_Header = DllStructGetPtr($tB_Input_Header)

				Local $IconType = DllStructGetData($tB_Input_Header, "Type")
				Local $IconCount = DllStructGetData($tB_Input_Header, "ImageCount")

				Local $tB_IconGroupHeader = DllStructCreate("short Res;short Type;short ImageCount;char Rest[" & $IconCount * 14 & "]")
				Local $pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader)

				DllStructSetData($tB_IconGroupHeader, "Res", 0)
				DllStructSetData($tB_IconGroupHeader, "Type", $IconType)
				DllStructSetData($tB_IconGroupHeader, "ImageCount", $IconCount)

				For $X = 1 To $IconCount
					Local $pB_Input_IconHeader = DllStructGetPtr($tB_Input_Header, 4) + ($X - 1) * 16
					Local $tB_Input_IconHeader = DllStructCreate($tagICONDIRENTRY, $pB_Input_IconHeader)
					Local $IconWidth = DllStructGetData($tB_Input_IconHeader, "bWidth")
					Local $IconHeigth = DllStructGetData($tB_Input_IconHeader, "bHeight")
					Local $IconColors = DllStructGetData($tB_Input_IconHeader, "bColorCount")
					Local $IconPlanes = DllStructGetData($tB_Input_IconHeader, "wPlanes")
					Local $IconBitPerPixel = DllStructGetData($tB_Input_IconHeader, "wBitCount")
					Local $IconImageSize = DllStructGetData($tB_Input_IconHeader, "dwBytesInRes")
					Local $IconImageOffset = DllStructGetData($tB_Input_IconHeader, "dwImageOffset")

					$pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader, 4) + ($X - 1) * 14
					Local $tB_GroupIcon = DllStructCreate($tagGRPICONDIRENTRY, $pB_IconGroupHeader)
					DllStructSetData($tB_GroupIcon, "bWidth", $IconWidth)
					DllStructSetData($tB_GroupIcon, "bHeigth", $IconHeigth)
					DllStructSetData($tB_GroupIcon, "bColorCount", $IconColors)
					DllStructSetData($tB_GroupIcon, "bReserved", 0)
					DllStructSetData($tB_GroupIcon, "wPlanes", $IconPlanes)
					DllStructSetData($tB_GroupIcon, "wBitCount", $IconBitPerPixel)
					DllStructSetData($tB_GroupIcon, "dwBytesInRes", $IconImageSize)
					$Resource_ID += 1
					DllStructSetData($tB_GroupIcon, "nID", $Resource_ID)
					Local $PB_IconData = DllStructGetPtr($tB_Input_Header) + $IconImageOffset
					_WinAPI_UpdateResource($hUpdate, $RT_TYPE, $Resource_ID, Int("0x" & @OSLang), $PB_IconData, $IconImageSize)
				Next

				$pB_IconGroupHeader = DllStructGetPtr($tB_IconGroupHeader)

			Case "jpg", "jpeg", "gif"
				$RT_TYPE = $RT_RCDATA

			Case "ttf"
				$RT_TYPE = $RT_FONT

;~ 			Case "cur"
;~ 				$RT_TYPE = $RT_CURSOR
;~ 			Case "txt", "au3", "ini", "c", "cpp", "h"
;~ 				$RT_TYPE = $RT_STRING

			Case Else
				ContinueLoop
		EndSwitch

		If $RT_TYPE = $RT_ICON Then
			_WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, $sName, Int("0x" & @OSLang), $pB_IconGroupHeader, DllStructGetSize($tB_IconGroupHeader))
		Else
			$Resource_ID += 1
			_WinAPI_UpdateResource($hUpdate, $RT_TYPE, $sName, Int("0x" & @OSLang), $pFile, $lFile)
		EndIf
;~ 		If @error Then SetError(4, $i, 0)
		$tFile = 0
	Next

	_WinAPI_EndUpdateResource($hUpdate)
	If @error Then Return SetError(5, @extended)
	Return 1
EndFunc   ;==>_CreateResourceDLL

Func _CreateEmptyDLL($sFilePath)
	Local $bEmptyDll = _Empty_DLL()
	Local $hFile = FileOpen($sFilePath, 18) ;Binary mode + Write mode (Erase old content!)
	FileWrite($hFile, $bEmptyDll)
	FileClose($hFile)
EndFunc   ;==>_CreateEmptyDLL

Func _Empty_DLL()
	Local $Empty_DLL
	$Empty_DLL &= 'TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEFAP6WNU0AAAAAAAAAAOAADiELAQIyAAQAAAAGAAAAAAAAABAAAAAQAAAAMAAAAAAAEAAQAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAABAAAAAAAAAMAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAAAwAAA8AAAAAFAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAC'
	$Empty_DLL &= 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUMAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5jb2RlAAAAYwAAAAAQAAAAAgAAAAQAAAAAAAAAAAAAAAAAACAAAGAudGV4dAAAABgAAAAAIAAAAAIAAAAGAAAAAAAAAAAAAAAAAAAgAABgLmRhdGEAAADMAAAAADAAAAACAAAACAAAAAAAAAAAAAAAAAAAQAAAwC5yZWxvYwAAIAAAAABAAAAAAgAAAAoAAAAAAAAAAAAAAAAAAEAAAEIucnNyYwAAABAAAAAAUAAAAAIAAAAMAAAAAAAAAAAAAAAAAABAAAB'
	$Empty_DLL &= StringRepeat("A", 598) & 'IN8JAgBdQ6LRCQEo8QwABDoIgAAAIN8JAgCdQCDfCQIAHUF6CkAAACDfCQIA3UAuAEAAADCDABoAAAAAGgAEAAAaAAAAADouw8AAKPAMAAQw+gMAAAA/zXAMAAQ6KsPAADDww'
	$Empty_DLL &= StringRepeat("A", 550) & '/yVUMAAQ/yVcMAAQ/yVgMAAQ/yVkMAAQ'
	$Empty_DLL &= StringRepeat("A", 651)
	$Empty_DLL &= '8MAAAAAAAAAAAAAB2MAAAVDAAAEQwAAAAAAAAAAAAALIwAABcMAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsMAAAAAAAAIIwAACQMAAAnjAAAAAAAABsMAAAAAAAAIIwAACQMAAAnjAAAAAAAACZAm1lbXNldAAATVNWQ1JULmRsbAAApAJIZWFwQ3JlYXRlAAClAkhlYXBEZXN0cm95APoBR2V0TW9kdWxlSGFuZGxlVwAAS0VSTkVMMzIuZGxs'
	$Empty_DLL &= StringRepeat("A", 431) & 'QAAAQAAAADDBMMFgwAAAAIAAAEAAAAAIwCDAOMBQw'
	$Empty_DLL &= StringRepeat("A", 645) & 'BSXNk0DAAc'
	$Empty_DLL &= StringRepeat("A", 668) & '='
	Return Binary(_Base64Decode($Empty_DLL))
EndFunc   ;==>_Empty_DLL

Func _Base64Decode($input_string)
	Local $struct = DllStructCreate("int")
	Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
	If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
	Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
	$a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $input_string, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
	If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
	Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode

Func StringRepeat($sChar, $nCount)
	$tBuffer = DllStructCreate("char[" & $nCount + 1 & "]")
	DllCall("msvcrt.dll", "ptr:cdecl", "memset", "ptr", DllStructGetPtr($tBuffer), "int", Asc($sChar), "int", $nCount)
	Return DllStructGetData($tBuffer, 1)
EndFunc   ;==>StringRepeat

Func _SetImagefromResource($CtrlID, $Resname, $Resfile = -1, $ResType = 10)
	;Raupi
	;Diese Funktion basiert auf der UDF von Zedna@Autitscript.com und Code von Progandy@AutoIt.de
	Local Const $IMAGE_BITMAP = 0
	Local Const $STM_SETIMAGE = 0x0172
	Local $hmod, $hwnd, $InfoBlock, $ResSize, $Mem, $pMem, $dll, $dll2, $hData, $pData, $pStream, $ret, $hBitmap, $pBitmap
	If $Resfile = -1 Then
		$hmod = _WinAPI_GetModuleHandle("")
	Else
		$hmod = _WinAPI_LoadLibrary($Resfile)
	EndIf
	If $ResType = $RT_BITMAP Then
		$hBitmap = _WinAPI_LoadImage($hmod, $Resname, $IMAGE_BITMAP, 0, 0, 0)
		If @error Then Return SetError(1, 0, 0)
		$hwnd = GUICtrlGetHandle($CtrlID)
		If $hwnd = 0 Then Return SetError(2, 0, 0)
		DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
		If @error Then Return SetError(3, 0, 0)
	Else
		$InfoBlock = DllCall("kernel32.dll", "int", "FindResourceA", "int", $hmod, "str", $Resname, "long", $ResType)
		If @error Then Return SetError(4, 0, 0)
		$InfoBlock = $InfoBlock[0]
		If $InfoBlock = 0 Then Return SetError(5, 0, 0)
		$ResSize = DllCall("kernel32.dll", "dword", "SizeofResource", "int", $hmod, "int", $InfoBlock)
		If @error Then Return SetError(6, 0, 0)
		$ResSize = $ResSize[0]
		If $ResSize = 0 Then Return SetError(7, 0, 0)
		$Mem = DllCall("kernel32.dll", "int", "LoadResource", "int", $hmod, "int", $InfoBlock)
		If @error Then Return SetError(8, 0, 0)
		$Mem = $Mem[0]
		If $Mem = 0 Then Return SetError(9, 0, 0)
		$pMem = DllCall("kernel32.dll", "int", "LockResource", "int", $Mem)
		If @error Then Return SetError(8, 0, 0)
		$pMem = $pMem[0]
		If $pMem = 0 Then Return SetError(10, 0, 0)
		If $Resfile <> -1 Then DllCall("Kernel32.dll", "int", "FreeLibrary", "str", $hmod)
		$hData = _MemGlobalAlloc($ResSize, 2)
		$pData = _MemGlobalLock($hData)
		_MemMoveMemory($pMem, $pData, $ResSize)
		_MemGlobalUnlock($hData)
		$ret = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "int", $hData, "long", 1, "Int*", 0)
		$pStream = $ret[3]
		_GDIPlus_Startup()
		$pBitmap = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
		$pBitmap = $pBitmap[2]
		$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($pBitmap)
		$hwnd = GUICtrlGetHandle($CtrlID)
		If $hwnd = 0 Then Return SetError(11, 0, 0)
		DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hwnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
		If @error Then Return SetError(12, 0, 0)
		_GDIPlus_BitmapDispose($pBitmap)
		_GDIPlus_Shutdown()
		$dll = DllStructCreate("Uint", $pStream)
		$dll2 = DllStructCreate("uInt", DllStructGetData($dll, 1) + 8)
		DllCall("", "UInt", DllStructGetData($dll2, 1), "UInt", $pStream)
		_WinAPI_DeleteObject($pStream)
		$pStream = 0
		_MemGlobalFree($hData)
		If $Resfile <> -1 Then _WinAPI_FreeLibrary($hmod)
	EndIf
EndFunc   ;==>_SetImagefromResource

Func _GetFontInfoFromFilePtr($pFile, $iFlag = 1); 0=copyright;1=name;2=type ... 10=description;11=website
	;funkey 2012, May 15
	Local $ttOffsetTable = DllStructCreate($tagTT_OFFSET_TABLE, $pFile)
	DllStructSetData($ttOffsetTable, "uNumOfTables", _SWAPWORD(DllStructGetData($ttOffsetTable, "uNumOfTables")))
	DllStructSetData($ttOffsetTable, "uMajorVersion", _SWAPWORD(DllStructGetData($ttOffsetTable, "uMajorVersion")))
	DllStructSetData($ttOffsetTable, "uMinorVersion", _SWAPWORD(DllStructGetData($ttOffsetTable, "uMinorVersion")))

	;check is this is a true type font and the version is 1.0
	If StringFormat("%i.%i", DllStructGetData($ttOffsetTable, "uMajorVersion"), DllStructGetData($ttOffsetTable, "uMinorVersion")) <> "1.0" Then
		Return SetError(1)
	EndIf

	Local $tblDir = DllStructCreate($tagTT_TABLE_DIRECTORY)
	Local $bFound = False
	Local $sTemp

	For $i = 0 To DllStructGetData($ttOffsetTable, "uNumOfTables") - 1
		$tblDir = DllStructCreate($tagTT_TABLE_DIRECTORY, $pFile + DllStructGetSize($ttOffsetTable) + $i * DllStructGetSize($tblDir))
		If StringLeft(DllStructGetData($tblDir, "szTag"), 4) = "name" Then
			$bFound = True
			DllStructSetData($tblDir, "uLength", _SWAPLONG(DllStructGetData($tblDir, "uLength")))
			DllStructSetData($tblDir, "uOffset", _SWAPLONG(DllStructGetData($tblDir, "uOffset")))
			ExitLoop
		EndIf
	Next

	If Not $bFound Then Return SetError(2)

	Local $ttNTHeader = DllStructCreate($tagTT_NAME_TABLE_HEADER, $pFile + DllStructGetData($tblDir, "uOffset"))
	DllStructSetData($ttNTHeader, "uNRCount", _SWAPWORD(DllStructGetData($ttNTHeader, "uNRCount")))
	DllStructSetData($ttNTHeader, "uStorageOffset", _SWAPWORD(DllStructGetData($ttNTHeader, "uStorageOffset")))
	Local $ttRecord = DllStructCreate($tagTT_NAME_RECORD)

	Local $tResult, $sResult

	For $i = 0 To DllStructGetData($ttNTHeader, "uNRCount") - 1
		$ttRecord = DllStructCreate($tagTT_NAME_RECORD, $pFile + DllStructGetData($tblDir, "uOffset") + DllStructGetSize($ttNTHeader) + $i * DllStructGetSize($ttRecord))
		DllStructSetData($ttRecord, "uNameID", _SWAPWORD(DllStructGetData($ttRecord, "uNameID")))

		If DllStructGetData($ttRecord, "uNameID") = $iFlag Then ;1 says that this is font name. 0 for example determines copyright info

			DllStructSetData($ttRecord, "uStringLength", _SWAPWORD(DllStructGetData($ttRecord, "uStringLength")))
			DllStructSetData($ttRecord, "uStringOffset", _SWAPWORD(DllStructGetData($ttRecord, "uStringOffset")))

			$tResult = DllStructCreate("char [" & DllStructGetData($ttRecord, "uStringLength") & "]", $pFile + _
					DllStructGetData($tblDir, "uOffset") + DllStructGetData($ttRecord, "uStringOffset") + _
					DllStructGetData($ttNTHeader, "uStorageOffset"))

			$sResult = DllStructGetData($tResult, 1)
			If StringLen($sResult) > 0 Then ExitLoop

		EndIf
	Next
	Return $sResult
EndFunc   ;==>_GetFontInfoFromFilePtr

Func _SWAPWORD($X)
	Return _WinAPI_MakeWord(_WinAPI_LoByte($X), _WinAPI_HiByte($X))
EndFunc   ;==>_SWAPWORD
Func _SWAPLONG($X)
	Return _WinAPI_MakeLong(_SWAPWORD(_WinAPI_HiWord($X)), _SWAPWORD(_WinAPI_LoWord($X)))
EndFunc   ;==>_SWAPLONG
