PDA

Просмотр полной версии : Проблемы с externalinterface


werdn
04.06.2007, 10:43
Встроил ролик в программу на 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
Во 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/> писать совсем не обязательно.