5,391
社区成员
发帖
与我相关
我的任务
分享
ShockwaveFlash1.CallFunction('<invoke name="myFunction" returntype="xml"><arguments><string>123</string></arguments></invoke>');
falshplayer1.callfunction(...........)
procedure TfeFlashPlayer.LoadMovie(layer: SYSINT; const url: WideString);
var
M: TMemoryStream;
l: Integer;
fs: TFileStream;
playFileName, url2: string;
i: integer;
begin
if FFlashNotExists then Exit;
if not FFlashNotExists then
begin
if Pos('.flv', url) > 0 then
begin
M := TMemoryStream.Create;
try
M.Write(play_swf, sizeOf(play_swf));
M.Position := 0;
SetLength(playFileName, 1000);
l := GetTempPath(1000, PChar(playFileName));
SetLength(playFileName, l);
if (Length(playFileName)>0) and (playFileName[Length(playFileName)]<>'\') then
playFileName := playFileName+'\';
l := Random(1000);
while FileExists(playFileName+IntToStr(l)+'.swf') do
inc(l);
playFileName := playFileName+IntToStr(l)+'.swf';
fs := TFileStream.Create(playFileName, fmCreate);
fs.CopyFrom(M, M.Size);
fs.Free;
for i := 1 to Length(playFileName) do
if playFileName[i] = '\' then
playFileName[i] := '/';
url2 := url;
for i := 1 to Length(url2) do
if url2[i] = '\' then
url2[i] := '/';
DefaultInterface.LoadMovie(layer, playFileName + '?fileName=' + url2);
deleteFile(playFileName);
finally
M.Free;
end;
end
else
begin
DefaultInterface.LoadMovie(layer, url);
end;
SetBounds(Left, Top, Width, Height);
end;
end;
procedure TfeFlashPlayer.LoadMovieFromStream(layer: SYSINT; const Stream: TStream);
var
Sign: array [1..3] of char;
begin
Stream.Position := 0;
Stream.Read(Sign, 3);
Stream.Position := 0;
if (Sign[1] = 'F') and (Sign[2] = 'L') and (Sign[3] = 'V') then
begin
FStream.SetSize(0);
Stream.Position := 0;
FStream.CopyFrom(Stream, Stream.Size);
FStream.Position := 0;
if FStream.Size > 0 then
begin
InitFlash(true);
SetBounds(Left, Top, Width, Height);
end;
end
else
begin
FStream.SetSize(0);
Stream.Position := 0;
FStream.CopyFrom(Stream, Stream.Size);
if FStream.Size > 0 then
begin
InitFlash;
SetBounds(Left, Top, Width, Height);
end;
end;
end;
procedure TfeFlashPlayer.LoadMovieFromResource(layer: SYSINT; const ResName: WideString);
var
R: TResourceStream;
begin
R := TResourceStream.Create(0, ResName, RT_RCDATA);
if R <> nil then
LoadMovieFromStream(layer, R);
R.Free;
end;
function TfeFlashPlayer.GetIntegerProp(const Index: Integer): Integer;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
Result := Temp.VInteger;
end;
function TfeFlashPlayer.GetIsFlashAvailable: boolean;
begin
Result := not FFlashNotExists;
end;
function TfeFlashPlayer.GetIUnknownProp(const Index: Integer): IUnknown;
var
Temp: TVarData;
begin
GetProperty(Index, Temp);
Result := IUnknown(Temp.VUnknown);
end;
procedure TfeFlashPlayer.SetFlashList(const Value: TfeFlashList);
begin
FFlashList := Value;
if FFlashList = nil then FFlashIndex := -1;
FlashIndex := FlashIndex;
end;
procedure TfeFlashPlayer.SetIntegerProp(const Index, Value: Integer);
var
Temp: TVarData;
begin
Temp.VType := varInteger;
Temp.VInteger := Value;
SetProperty(Index, Temp);
end;
procedure TfeFlashPlayer.SetIUnknownProp(const Index: Integer;
const Value: IUnknown);
var
Temp: TVarData;
begin
Temp.VType := VT_UNKNOWN;
Temp.VUnknown := Pointer(Value);
SetProperty(Index, Temp);
end;
procedure TfeFlashPlayer.SetFlashIndex(const Value: integer);
var
Flash: TMemoryStream;
begin
FFlashIndex := Value;
if (FFlashList <> nil) and (FFlashList.Flashs.Count > 0) and (FFlashIndex >= 0) then
begin
if FFlashIndex < 0 then FFlashIndex := 0;
if FFlashIndex >= FFlashList.Flashs.Count - 1 then
FFlashIndex := FFlashList.Flashs.Count - 1;
if FFlashList.Flashs.Items[FFlashIndex].Flash <> nil then
begin
Flash := FFlashList.Flashs.Items[FFlashIndex].Flash;
if Flash <> nil then
begin
LoadMovieFromStream(0, Flash);
end;
end;
end
else
if FFlashIndex < 0 then
begin
end;
end;
代碼太長,省略。。。(你提供油箱,我發給你)...
unit fe_flashplayer;
{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{.$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{.$VARPROPSETTER ON}
interface
uses Windows, SysUtils, ActiveX, Classes, Graphics, OleCtrls, OleServer, StdVCL,
fe_flashole, fe_flashwnd, fe_stream;
const
// TypeLibrary Major and minor versions
ShockwaveFlashObjectsMajorVersion = 1;
ShockwaveFlashObjectsMinorVersion = 0;
.............................省略部分代碼.........................
CoFlashObjectInterface = class
class function Create: IFlashObjectInterface;
class function CreateRemote(const MachineName: string): IFlashObjectInterface;
end;
implementation
uses ComObj;
procedure TForm1.sfFlashPlayer1HandleFSCommand(ASender: TObject;
const command, args: WideString);
begin
if (command = 'website') and (args = 'open')
then
begin
ShellExecute(0, 'open', 'http://www.test.com', nil, nil, SW_SHOWNORMAL);
end
else
if (command = 'closeabout')
then
begin
if FLoadFromStore
then
sfFlashPlayer1.FlashIndex := StoreIndex
else
sfFlashPlayer1.LoadMovie(0, OpenDialog.FileName);
end;
end;
const
cstInvoke='<invoke name="%s" returntype="xml"><arguments>%s</arguments></invoke>';
其中,具體的參數如下:
a、字串以string表示
b、數值以number表示
c、Boolean類型比較特殊,直接傳遞自閉合的 <true/> 或 <false/>
d、日期類型以date表示、
e、未定義以undefined表示
f、空值以自閉和的 <null/> 表示
舉例如下:傳遞字串和Boolean類型參數
TsfFlashPlayerAsync.CallFunction(0,'<invoke name="SetFocus2Center" returntype="xml"><arguments><string>商家名稱</string><true/></arguments></invoke>')
如果傳遞字串參數,有可能會遇到XML保留關鍵字或字元,會導致XML解析失敗。
因此建議使用CDATA來保證字串出現XML的保留關鍵字或字元。
CDATA格式:<![CDATA[內容]]>
上訴例子可以改為:
TsfFlashPlayerAsync.CallFunction(0,'<invoke name="SetFocus2Center" returntype="xml"><arguments><string><![CDATA[商家名稱]]></string><true/></arguments></invoke>')
function __flash__arrayToXML(obj) {
var s = "<array>";
for (var i=0; i<obj.length; i++) {
s += "<property id=\"" + i + "\">" + __flash__toXML(obj[i]) + "</property>";
}
return s+"</array>";
}
function __flash__argumentsToXML(obj,index) {
var s = "<arguments>";
for (var i=index; i<obj.length; i++) {
s += __flash__toXML(obj[i]);
}
return s+"</arguments>";
}
function __flash__objectToXML(obj) {
var s = "<object>";
for (var prop in obj) {
s += "<property id=\"" + prop + "\">" + __flash__toXML(obj[prop]) + "</property>";
}
return s+"</object>";
}
function __flash__escapeXML(s) {
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
}
function __flash__toXML(value) {
var type = typeof(value);
if (type == "string") {
return "<string>" + __flash__escapeXML(value) + "</string>";
} else if (type == "undefined") {
return "<undefined/>";
} else if (type == "number") {
return "<number>" + value + "</number>";
} else if (value == null) {
return "<null/>";
} else if (type == "boolean") {
return value ? "<true/>" : "<false/>";
} else if (value instanceof Date) { return date + value.getTime() + /date; } else if (value instanceof Array) { return __flash__arrayToXML(value); } else if (type == object) { return __flash__objectT
} else if (value instanceof Date) {
return "<date>" + value.getTime() + "</date>";
} else if (value instanceof Array) {
return __flash__arrayToXML(value);
} else if (type == "object") {
return __flash__objectToXML(value);
} else {
return "<null/>"; //???
}
}
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}
Label1.Caption := ShockwaveFlash1.CallFunction('<invoke name="myFunction"><arguments><string>SSSS</string></arguments></invoke>');
function callMe(str:String):String {
MyShowA.text = str;
return "busy signal";
}
ExternalInterface.addCallback("myFunction", callMe);
Label1.Caption := ShockwaveFlash1.CallFunction('<invoke name="myFunction"><arguments><string>SSSS</string></arguments></invoke>');