Pour une raison quelconque, SWFAddress utilise un setInterval dès son initialisation pour lancer un premier appel javascript dès que le swf est chargé au runtime. En actionscript 2, cela fonctionne très bien et se présente comme ceci :

class SWFAddress {

    ...

    private static var _interval:Number;
    private static var _init = SWFAddress._initialize();

    public static var onChange:Function;
    
    private static function _check():Void {
        if (SWFAddress.onChange) {
            clearInterval(SWFAddress._interval);
            SWFAddress.setValue(SWFAddress.getValue());
        }
    }

    private static function _initialize():Void {
        SWFAddress._interval = setInterval(SWFAddress._check, 10);
        if (_availability) {
            ExternalInterface.addCallback('getSWFAddressValue', SWFAddress, 
                function():String {return this._value});
            ExternalInterface.addCallback('setSWFAddressValue', SWFAddress, 
                SWFAddress.setValue);
        }
    }

    ...
}

Grâce à ligne private static var _init = SWFAddress._initialize(); le compilateur prépare la classe pour qu'elle lance la méthode _initialize dès qu'elle est chargée au runtime. Malheureusement ce genre de combine ne semble plus fonctionner avec le nouveau compilo. Dans la version AS3 de SWFAddress on trouve pourtant ceci :

package {

    import flash.external.ExternalInterface;
    import flash.utils.clearInterval;
    import flash.utils.setInterval;

    public class SWFAddress {

        ... 
        public static var onChange:Function;

        private static function _check():void {
            if (SWFAddress.onChange != null) {
                clearInterval(SWFAddress._interval);
                if (_availability) {
                    ExternalInterface.addCallback('getSWFAddressValue', 
                        function():String {return _value});
                    ExternalInterface.addCallback('setSWFAddressValue', 
                        SWFAddress.setValue);
                }
                SWFAddress.setValue(SWFAddress.getValue());
            }
        }    
        private static var _interval:Number = setInterval(SWFAddress._check, 10);
        ...
  }
}

Je suppose qu'en Flex on peut utiliser cette technique avec un setInterval puisque c'est une fonction native mais dans Flash CS3 ça ne marche simplement pas. Une autre bizzarerie que je n'ai pas pu comprendre, c'est pourquoi les registrations des callbacks js ont été déplacé dans le test de chargement de la classe ? Parce que finalement ça ne fontionne pas non plus et ça crée un 2eme problème dans Flash.

J'ai finalement opté pour une méthode publique init à lancer soit même. Ce n'est pas le plus propre qu'il soit, mais en attendant une correction de SWFAddress pour Flash CS3 ça fait son travail :

package {

    import flash.external.ExternalInterface;
    import flash.utils.clearInterval;
    import flash.utils.setInterval;

    public class SWFAddress {

        ...
	private static var _interval:Number;
 
        public static var onChange:Function;		

        private static function _check():void {
            if (SWFAddress.onChange != null) {
                clearInterval(SWFAddress._interval);                
                SWFAddress.setValue(SWFAddress.getValue());
            }
        }       

	public static function init():void{
		_interval = setInterval(SWFAddress._check, 10);
		if (_availability) {
                   ExternalInterface.addCallback('getSWFAddressValue', 
                        function():String {return _value});
                    ExternalInterface.addCallback('setSWFAddressValue', 
                        SWFAddress.setValue);
        }
        ...
  }
}

Il faut donc lancer SWFAddress.init(); à la main au début de son projet pour que celà fonctionne.

Vous pouvez télécharger la version modifiée de la classe AS3 ici

En tous cas SWFAddress est un fabuleux outil et ce petit bug sera sans doute rapidement corrigé par les auteurs, affaire à suivre donc...