Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблемы с externalinterface (http://www.flasher.ru/forum/showthread.php?t=96640)

werdn 04.06.2007 10:43

Проблемы с externalinterface
 
Встроил ролик в программу на Delphi через ActiveX-компонент.
Вызываю следующую функцию (на haxe):
Код:

private function ExGetCamList():Xml
{
        var s:Xml = Xml.createElement('root');
        var i:MyCam;
        for(i in cameras)
        {
                var c:Xml;
                c = Xml.createElement('cam');
                c.set("x", Std.string(i._x));
                c.set("y", Std.string(i._y));
                c.set("name", i.caption);
               
                s.addChild(c);
        }
        trace(s.toString());
        return s;
}

следующим образом:
Код:

  s := ShockwaveFlash1.CallFunction(
    '<invoke name="GetCamList" resulttype="xml"></invoke>');
  ShowMessage(s);

ShowMessage пишет "Undefined", trace пишет нормальный код XML, после этого программа на Flash терпит крах и не работает (все видно, но ни события, ни что другое не работает).
Как в анекдоте: "Что я делаю неправильно?".
заранее благодарю.

etc 04.06.2007 12:20

Во Flash есть класс XML, но никак не «Xml». Приведенный код неверен.

Вы пытаетесь вызвать функцию с именем GetCamList, а описываете ExGetCamList?

werdn 04.06.2007 12:45

Цитата:

Сообщение от __etc
Во Flash есть класс XML, но никак не «Xml». Приведенный код неверен.

Вы пытаетесь вызвать функцию с именем GetCamList, а описываете ExGetCamList?

1. это в AS - XML, а в haxe - Xml.
2. Я вызываю AddCallBack():
Код:

var methodName:String = "GetCamList";
var instance:Dynamic = null;
var method:Dynamic = ExGetCamList;

trace("Добавление внешней функции: " + methodName);

var wasSuccessful:Bool = ExternalInterface.addCallback(methodName, instance, method);
               
trace("Результат: " + wasSuccessful);

Функция вызывается, но падает программа на Flash написанная

WGR 21.06.2007 02:58

Собственно вот из семплов которые идут с компонентом

во флеше пишем функцию которую в дальнейшем вызовем из делфи
Код:

import flash.external.*;

ExternalInterface.addCallback("CallMeFromApplication", this, InternalFunction);

function InternalFunction(str: String): String {
        TextArea1.text = str;
        return "The function was called successfully";
}

из делфи вызываем так
и получаем ответ от флеша
Код:

procedure TForm1.Button3Click(Sender: TObject);
var
  Response: WideString;
begin
  Response := FlashPlayerControl1.CallFunction('<invoke name="CallMeFromApplication" returntype="xml"><arguments><string>Some text for TFlashPlayerControl</string></arguments></invoke>');
  ShowMessage(Format('The function returned: %s', [ Response ] ));
end;



и ещё
вариант
во флешке на кнопке
Код:

on (click) {_root.TextArea1.text =flash.external.ExternalInterface.call("SomeFunction");
}

в делфе (родимой)
в событии onflashcalll
Код:

procedure TForm1.FlashPlayerControl1FlashCall(ASender: TObject;
  const request: WideString);
begin
FlashPlayerControl1.SetReturnValue('<string>Current time is: ' + TimeToStr(Time) + #13#10 + 'This info is returned by TMainForm.FlashPlayerControl1FlashCall()</string>');
end;


PS кто ищет тот найдёт!

werdn 25.06.2007 12:45

Благодарю, но я немного не это спрашивал.
Все это ясно, но не ясно, что нужно возвращать из функции, returntype, которой установлен в xml???
Когда возвращаю экземпляр класса Xml в haxe приходит кирдык программе в ролике.

Kikasso 25.06.2007 12:51

Попробуйте String возвращать.

werdn 06.07.2007 11:19

Так и делаю. Благодарю за ответы.

Cheburah 13.07.2007 12:52

У меня проблема с тем же ExternalInterface. Внедряю flash ActiveX компонент в приложение VC++ через MFC. ExternalInterface.call() прекрасно работает, а вызов функции AS из контейнера - ни в какую.
Код AS:
Код:

function cally():String
        {
                return "callys invoke";
        }

ExternalInterface.addCallback("ska",cally);

C++:
Код:

m_flObj.CallFunction("<invoke name=\"ska\" returntype=\"xml\"><arguments><null/></arguments></invoke>");
При вызове вылетает пустое окно ошибки.

Dr.OH 15.07.2007 01:06

извини, конечно, чебуратор, за мои сомнения, но ты точно во флэшке не забыл написать примерно следующее:
Код:

import flash.external.*;

var methodName:String = "ska";
var instance:Object = null;
var method:Function = cally;
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);

потому что флэш крайне капризный чувак, если вдруг что не так, сразу вылетает с exeption'ом. Кстати, тебе офигенно повезло, у меня он в свое время даже окошка не выдавал, т.е. С'шный код нормально работал дальше, а флэш не реагировал :(
А так вроде бы все правильно... <null/> писать совсем не обязательно.


Часовой пояс GMT +4, время: 05:13.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.