UDF > WinAPIEx > Menus & Resources > Resources >


_WinAPI_LockResource

Verrouille la ressource spécifié dans la mémoire

#include <WinAPIRes.au3>
_WinAPI_LockResource ( $hData )

Paramètre

$hData Handle de la ressource qui doit être verrouillée. La fonction _WinAPI_LoadResource() retourne ce handle. Ne passez pas des valeurs autres que les valeurs de retour avec succès de la fonction LoadResource.

Valeur de retour

Succès: Retourne le pointeur sur le premier octet de la ressource.
Échec: Retourne 0.

Remarques

Le pointeur retourné par cette fonction est valide jusqu'à ce que le module contenant la ressource soit déchargé. Ce n'est pas nécessaire de débloquer les ressources parce que le système les supprime automatiquement lorsque le processus qui les a créé se termine.

N'essayez pas de verrouiller une ressource en utilisant le handle retourné par la fonction _WinAPI_FindResource() ou _WinAPI_FindResourceEx(). Ce handle pointe sur des données aléatoires.

Notez que _WinAPI_LockResource() ne verrouille pas la mémoire; elle est seulement utilisée pour obtenir un pointeur sur la mémoire contenant les données de ressource. Le nom de la fonction vient de versions antérieures à Windows XP, quand elle était utilisée pour verrouiller un bloc de mémoire globale alloué par _WinAPI_LoadResource().

En relation

_WinAPI_FindResource, _WinAPI_FindResourceEx, _WinAPI_LoadResource, _WinAPI_UnlockFile

Voir aussi

Consultez LockResource dans la librairie MSDN.

Exemple

#include <APIMiscConstants.au3>
#include <APIResConstants.au3>
#include <GUIConstantsEx.au3>
#include <Memory.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIMisc.au3>
#include <WinAPIRes.au3>

Local Const $sJpg = @TempDir & '\~Tech.jpg'

; Charge Resources.dll en mémoire
Local $hInstance = _WinAPI_LoadLibraryEx(@ScriptDir & '\Extras\Resources.dll', $LOAD_LIBRARY_AS_DATAFILE)
If Not $hInstance Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', @ScriptDir & '\Extras\Resources.dll est absent.')
    Exit
EndIf

; Charge les ressources JPEG de la bibliothèque Resources.dll
Local $hResource = _WinAPI_FindResource($hInstance, 'JPEG', 1)
Local $iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
Local $hData = _WinAPI_LoadResource($hInstance, $hResource)
Local $pData = _WinAPI_LockResource($hData)

; Enregistre la ressource du fichier .jpg
Local $hFile = FileOpen($sJpg, 2 + 16)
Local $tData = DllStructCreate('byte[' & $iSize & ']', $pData)
FileWrite($hFile, DllStructGetData($tData, 1))
FileClose($hFile)

; Charge une ressource FONT de la bibliothèque Resources.dll
$hResource = _WinAPI_FindResource($hInstance, $RT_FONT, 'TECHNOVIA_CAPS')
$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

; Ajoute la police en mémoire au système
Local $hFont = _WinAPI_AddFontMemResourceEx($pData, $iSize)

; Charge une ressource SOUND de la bibliothèque Resources.dll
$hResource = _WinAPI_FindResource($hInstance, 'SOUND', 1)
$iSize = _WinAPI_SizeOfResource($hInstance, $hResource)
$hData = _WinAPI_LoadResource($hInstance, $hResource)
$pData = _WinAPI_LockResource($hData)

; Copie WAV en mémoire pour une utilisation ultérieure
Local $hWave = _MemGlobalAlloc($iSize, $GMEM_MOVEABLE)
Local $pWave = _MemGlobalLock($hWave)
_MemMoveMemory($pData, $pWave, $iSize)
; _MemGlobalUnlock ($HWave)

; Charge une ressource STRING de la bibliothèque Resources.dll
Local $sText = _WinAPI_LoadString($hInstance, 1)

; Décharge Resources.dll de la mémoire
_WinAPI_FreeLibrary($hInstance)

; Crée une GUI
GUICreate('Test '& StringReplace(@ScriptName, '.au3', '()'), 350, 350)
GUICtrlCreatePic($sJpg, 0, 0, 350, 350)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlCreateLabel($sText, 10, 18, 330, 36, $SS_CENTER)
GUICtrlSetFont(-1, 30, -1, -1, 'Technovia Caps')
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetColor(-1, 0xF06000)
Local $idButton = GUICtrlCreateButton('Play Sound', 125, 316, 100, 23)
GUISetState(@SW_SHOW)

Local $iMsg
Do
    $iMsg = GUIGetMsg()
    If $iMsg = $idButton Then 
        _WinAPI_PlaySound($pWave, BitOR($SND_ASYNC, $SND_MEMORY, $SND_NOWAIT))
    EndIf
Until $iMsg = $GUI_EVENT_CLOSE

; Libère les ressources
_WinAPI_RemoveFontMemResourceEx($hFont)
FileDelete($sJpg)