2017-04-19 4 views
4

Le code suivant dans Delphi 2007 me donne l'avertissementComment puis-je me débarrasser de "W1047 code non protégé '@ opérateur" dans cet appel RaiseExeption

W1047 de code non protégé '@ opérateur'

dans la ligne qui passe à @ThreadNameInfo RaiseException:

procedure SetThreadName(const _Name: AnsiString); 
var 
    ThreadNameInfo: TThreadNameInfo; 
begin 
    ThreadNameInfo.FType := $1000; 
    ThreadNameInfo.FName := PAnsiChar(_Name); 
    ThreadNameInfo.FThreadID := $FFFFFFFF; 
    ThreadNameInfo.FFlags := 0; 
    try 
    RaiseException($406D1388, 0, SizeOf(ThreadNameInfo) div SizeOf(LongWord), 
     @ThreadNameInfo); // --> Here 
    except 
    // ignore 
    end; 
end; 

en dehors de la désactivation de l'avertissement du compilateur pour « code non sécurisé », est-il un autre moyen de se débarrasser de cet avertissement? Cet avertissement a-t-il même un sens, puisque Delphi ne supporte plus dotNET?

J'ai essayé de transtyper explicitement le paramètre en PDWord (le type déclaré du dernier paramètre), qui n'a rien changé.

+0

Est-ce que Addr (ThreadNameInfo) fonctionne? –

+1

@LURD 'Addr' et' @ 'sont complètement interchangeables, de toutes les façons autres que d'être affectés par' $ TYPEDADDRESS'. Plus précisément, 'Addr' est une fonction instrinsique qui retourne' Pointer'. D'autre part, avec '$ TYPEDADDRESS ON' alors' @ 'donne un pointeur typé. Conclusion, 'Addr()' entraînera également cet avertissement étant émis. –

Répondre

7

Cet avertissement est destiné à être utilisé avec du code qui doit être compilé par le compilateur .net. Si vous n'utilisez pas le compilateur Delphi .net, vous pouvez, et devriez, supprimer cet avertissement particulier.