Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [VB.NET] IntPtr e SafeHandle

    Sovente quando eseguo l' analisi del codice rilevo errori di questo tipo:

    "CA2006 : Microsoft.Reliability : Controllare l'utilizzo di 'FrmMain.OldHwnd', un'istanza 'IntPtr', per determinare se deve essere sostituita con SafeHandle o CriticalHandle."

    Ho provato a sostituire:

    Dim OldHwnd as IntPtr

    con

    Dim OldHwnd As Microsoft.Win32.SafeHandles.CriticalHandleMinusOne IsInvalid

    La dichiarazione viene accettata.... peccato che poi tutte le API mi danno errore, perché si aspettano un IntPtr.

    Allora ho provato a sostituire OldHwnd con

    CType(OldHwnd, IntPtr), ottenendo l' errore: Impossibile convertire....

    MORALE: Ok, devo sostituire un IntPtr con un SafeHandle... ma poi che me ne faccio del SafeHandle se è ingestibile dalle API??


  2. #2
    EDIT:

    Se per assurdo dichiaro OldHwnd as String........ e poi nelle API sostituisco con acconci:

    CType(OldHwnd, IntPtr)

    gli errori nella analisi spariscono e tutto funziona ugualmente.... ma se la soluzione è così semplice perché scomodare questa fantomatica classe SafeHandle??????

    Grazie.

  3. #3
    SafeHandle è una classe che rappresenta un handle e fornisce qualche "servizio accessorio"; sostanzialmente, serve per gestire automaticamente la chiusura degli handle e contemporaneamente evitare che il GC li chiuda mentre è in corso una chiamata PInvoke (tipicamente, questo può accadere con l'uso di API asincrone). Dato che diversi tipi di handle hanno diversi metodi di chiusura e diverse idee di cosa sia un handle non valido, SafeHandle è una classe astratta, e il .NET Framework fornisce qualche classe derivata per gestire i casi più comuni.
    HWND non è tra i casi "già pronti", per cui dovresti scriverti a mano una classe derivata da SafeHandler reimplementando correttamente i vari metodi; tuttavia, in genere per degli HWND che starai usando tu non è corretta la semantica di chiusura alla distruzione dell'handle, dato che non sono oggetti che "possiede" il tuo codice (a meno che tu non stia creando finestre manualmente con CreateWindow/CreateWindowEx, ma ne dubito), ma sono gestiti da chi ha effettivamente creato la finestra.

    In sintesi, se fai solo chiamate ad API bloccanti e i tuoi handle sono solo HWND puoi non preoccuparti di tutto questo e usare tranquillamente IntPtr.
    MORALE: Ok, devo sostituire un IntPtr con un SafeHandle... ma poi che me ne faccio del SafeHandle se è ingestibile dalle API??
    Se uno usa i SafeHandle cambia le dichiarazioni delle API di conseguenza, PInvoke fa il marshaling dei SafeHandle alla stessa maniera degli IntPtr.
    Se per assurdo dichiaro OldHwnd as String........ e poi nelle API sostituisco con acconci:
    L'analisi serve ad individuare errori comuni (tipo usare IntPtr per gli handle in casi in cui un SafeHandle sarebbe più appropriato), mica va a pensare che uno faccia robe perverse come memorizzare degli handle in stringhe...
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.