C # / ActionScript с AxShockwaveFlash

голоса
2

Я новичок в ActionScript и пытаюсь общаться между AS и C #. Каждый учебник / объяснение я нахожу , кажется, точно так же, но я просто не могу заставить его работать. callFunctionбросает COM исключение ( «E_FAIL»), и когда я пытаюсь вызова ExternalInterface.call()из AS, он никогда не кажется.

Я получил эту работу в JavaScript / HTML, но я из идей для C #; Я подозреваю, что я делаю что-то неправильно / не разрешено в моей AS. Я скомпилировать AS файл с Adobe Flex 4.6 и mxmlc.

Изменить: Просто чтобы прояснить этот код показывает только тест с вызовом C # функции от AS , так как он кажется менее подвержены ошибкам (не XML аргумента обращению требуется). Кроме того , я запустить тест с while(true) ExternalInterface.call(someFct, Hello world);петлей в моей AS и мое использование CPU для процесса отладки в основном так же , как и без инструкций в AS (~ 0,3%). Так что , похоже код не выполняется вообще.

Вот мой файл AS:

package
{
    import flash.external.ExternalInterface;
    public class Test
    {     
        public function Test()
        {
            ExternalInterface.call(someFct, Hello world);
        }
    }
}

И в C # У меня есть элемент управления AxShockwaveFlash в WinForms:

private void InitializeComponent()
{
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
    this.axShockwaveFlash1 = new AxShockwaveFlashObjects.AxShockwaveFlash();
    ((System.ComponentModel.ISupportInitialize)(this.axShockwaveFlash1)).BeginInit();
    this.SuspendLayout();
    // 
    // axShockwaveFlash1
    // 
    this.axShockwaveFlash1.Enabled = true;
    this.axShockwaveFlash1.Location = new System.Drawing.Point(104, 67);
    this.axShockwaveFlash1.Name = axShockwaveFlash1;
    this.axShockwaveFlash1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject(axShockwaveFlash1.OcxState)));
    this.axShockwaveFlash1.Size = new System.Drawing.Size(574, 314);
    this.axShockwaveFlash1.TabIndex = 0;
    this.axShockwaveFlash1.FlashCall += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FlashCallEventHandler(this.recv);
    this.Click += new System.EventHandler(this.Form1_Click);
//...
    ((System.ComponentModel.ISupportInitialize)(this.axShockwaveFlash1)).EndInit();
     this.ResumeLayout(false);
}

Инициализация SWF объекта и получения его вызова:

private void Form1_Click(object sender, EventArgs e)
{
    axShockwaveFlash1.LoadMovie(0, @mypath\test.swf);
}

//Never executes
public void recv(object sender, _IShockwaveFlashEvents_FlashCallEvent e)
{
    string s = e.request;
}
Задан 23/11/2015 в 06:14
источник пользователем
На других языках...                            


1 ответов

голоса
2

Я нашел проблемы.

1) Как я и подозревал, СОМ - объект нуждается в какой - то графический инициализации для того , чтобы работать на всех. Оформление основного класса расширение Spriteрешает эту проблему.

2) Вы , видимо , не может использовать ExternalInterface.call()или ExternalInterface.setCallback()в главном классе конструктор напрямую. Создание экземпляра нового класса в главном классе конструктор и делает ExternalInterfaceвызов в конструкторе или любая другая функция решает эту проблему.

Test.as:

package
{
    import flash.display.*;
    public class Test extends Sprite
    {     
        public function Test()
        {
            super();
            var x : Test1 = new Test1();
        }
    }
}

И Test1.as:

package
{   
    import flash.external.ExternalInterface;
    public class Test1
    {
        public function Test1()
        {
            ExternalInterface.call("recv", "Hello world");
        }
    }
}

Я также не имею не знаю , почему кто - то downvote мой вопрос ...

Ответил 24/11/2015 в 04:55
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more