получить доступ к MacromediaFlashPlayerActiveX
Народ как-то это делает.... Добрался до того что флеш имеет тип
MacromediaFlashPlayerActiveX. Покапавшись в нете нашел
http://it4business.ru/forum/index.php?showtopic=5283&pid=29031&st=0&#entry29031
Там пишут что Flash приложения довольно закрытые, и доступ к их контролам можно получить только через плагин MSAA если они реализуют интерфейс IAccessible.
Ребят. что такое IAccessible ? Что такое MSAA ?
----------
Покопался еще немного....
Говорят что можно через BHO получить доступ к элементам флешки, кнопчками и тому подобному.
Что такое BHO ?
А дальше работаем со свойствами Пример на моем сайте [email]smorodov@narod.ru[/email] в программе симуляторе промышленного контроллера
компилятор: C++Builder 6.Файл:robot.cpp Дерзай:)
текст его ниже:
#include <vcl.h>
#pragma hdrstop
#include "robot.h"
#include "EditU1.h"
#include "EditU2.h"
#include "EditU3.h"
#include "Unit4.h"
#include "Unit6.h"
#include "Unit7.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "ShockwaveFlashObjects_OCX"
#pragma resource "*.dfm"
TRobotForm *RobotForm;
bool s0=1,s1=0;
bool PrevCommand[3];
bool Sensors[6];
int position[3];
int n=0;
//---------------------------------------------------------------------------
__fastcall TRobotForm::TRobotForm(TComponent* Owner)
: TForm(Owner)
{
ShockwaveFlash1->Movie=ExtractFilePath(Application->ExeName)+"stanok.swf";
ShockwaveFlash1->GotoFrame(0);
ShockwaveFlash1->Stop();
for (int i=0;i<3;i++)
{
position=2;
Command=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TRobotForm::Display(void)
{
TColor Col[]={clWhite,clGreen};
bool change=false;
if(RobotForm->Visible)
{
for (int i=0;i<6;i++)
{
if (Form2->I!=Sensors){change=true;}
Form2->I=Sensors;
}
if(change){
Form1->StateChanged();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TRobotForm::Panel1Resize(TObject *Sender)
{
//
ShockwaveFlash1->Refresh();
Panel1->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TRobotForm::ProcessStep(void)
{
n=0;
if(Command[n] && position[n]<49){position[n]++;}
if(!Command[n] && position[n]>1){position[n]--;}
if(position[n]<4 && !Sensors[0]){Sensors[0]=true;}
if(position[n]>=4 && Sensors[0]){Sensors[0]=false;}
if(position[n]>47 && !Sensors[1]){Sensors[1]=true;}
if(position[n]<=47 && Sensors[1]){Sensors[1]=false;}
ShockwaveFlash1->SetVariable(StringToOleStr("all.h"),StringToOleStr(IntToStr(position[n])));
n=1;
if(Command[n] && position[n]<49){position[n]++;}
if(!Command[n] && position[n]>1){position[n]--;}
if(position[n]<4 && !Sensors[2]){Sensors[2]=true;}
if(position[n]>=4 && Sensors[2]){Sensors[2]=false;}
if(position[n]>47 && !Sensors[3]){Sensors[3]=true;}
if(position[n]<=47 && Sensors[3]){Sensors[3]=false;}
ShockwaveFlash1->SetVariable(StringToOleStr("all.stanok.l"),StringToOleStr(IntToStr(position[n])));
n=2;
if(Command[n] && position[n]<49){position[n]++;}
if(!Command[n] && position[n]>1){position[n]--;}
if(position[n]<4 && !Sensors[4]){Sensors[4]=true;}
if(position[n]>=4 && Sensors[4]){Sensors[4]=false;}
if(position[n]>47 && !Sensors[5]){Sensors[5]=true;}
if(position[n]<=47 && Sensors[5]){Sensors[5]=false;}
ShockwaveFlash1->SetVariable(StringToOleStr("all.stanok.shvat.s"),StringToOleStr(IntToStr(position[n])));
Display();
Sleep(30);
}
void __fastcall TRobotForm::Button1Click(TObject *Sender)
{
for (int i=0;i<3;i++)
{
position=1;
Command=false;
}
int n=0;
ShockwaveFlash1->SetVariable(StringToOleStr("all.h"),StringToOleStr(IntToStr(position[n])));
n=1;
ShockwaveFlash1->SetVariable(StringToOleStr("all.stanok.l"),StringToOleStr(IntToStr(position[n])));
n=2;
ShockwaveFlash1->SetVariable(StringToOleStr("all.stanok.shvat.s"),StringToOleStr(IntToStr(position[n])));
ProcessStep();
//ShockwaveFlash1->Free();
bool change=false;
for (int i=0;i<6;i++)
{
if (Form2->I!=Sensors){change=true;}
Form2->I=Sensors;
}
if(change){
Form1->StateChanged();
}
Display();
}
//---------------------------------------------------------------------------
void __fastcall TRobotForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
Form1->iLedMatrix4->IndicatorActive[0][1]=false;
}
//---------------------------------------------------------------------------
-------
Menu Component->Import ActiveX Control в списке Macromedia ShockWaveFlash устанавливаем компонент.
Чет ненашел я такого компонента =(
У меня 2006 борланд
а если пройтись по коллекции и получить его IDispatch?
Покопался еще немного....
Говорят что можно через BHO получить доступ к элементам флешки, кнопчками и тому подобному.
Что такое BHO ?
Browser Helper Object - такой плагин к IE. Никаких преймуществ по доступу к Флэшам явно не имеет.
Browser Helper Object - такой плагин к IE. Никаких преймуществ по доступу к Флэшам явно не имеет.
А что нам даст пройтись по коллекции? По коллекции чего? Кнопочек?
Или всех элементов? iHTMLElementCollection ? =)
CComPtr<IHTMLEmbedElement>spEmbEl;
CComPtr<IDispatch>spDisp;
spDoc->get_embeds(&spEmbCol);
VARIANT ind;
ind.vt = VT_I4;
long Emb_ln;
spEmbCol->get_length(&Emb_ln);
for (long i=0; i<Emb_ln; i++) // EMBLED's
{
ind.lVal = i;
if (spDisp) spDisp.Release();
spEmbCol->item(ind,ind, &spDisp);
spDisp->QueryInterface(IID_IHTMLEmbedElement, (LPVOID*)&spEmbEl);
spEmbEl-> /// c ним и работать
spDisp.Release();
spEmbEl.Release();
}
Лан, сие моно проверить только практическим путем...
Emb_ln почему-то равень нулю... Вывел ШТМЛ, <embed - почему то не оказалось в коде.... Открыл код страницы через браузер, <embed там есть.... фантастика =(
доступ к самому элементу либо через файл spEmbEl->get_src(...)
либо через его IDispatch
доступ к самому элементу либо через файл spEmbEl->get_src(...)
либо через его IDispatch
Где компонент Macromedia ShockWaveFlash взять?
библиотека сама находится (у меня):
C:\winwows\system32\Macromed\Flash\Flash9b.ocx
проинсталил себе... работает. Только жаль хелпа по нему нет (в ВСВ)
Create Unit
или
Add unit to proect?
----------------------------
Linker Error =(
на вкладке (сверху у ВСВ) ActiveX появится ShockwaveFlash
его на форму кидаешь и работаешь...
// Error creating palette bitmap of (TFlashProp) : Server C:\Windows\system32\Macromed\Flash\Flash9b.ocx contains no icons
// Error creating palette bitmap of (TFlashObjectInterface) : Server C:\Windows\system32\Macromed\Flash\Flash9b.ocx contains no icons
// ************************************************************************ //
Вот что выдает =( при импорте. И не добавляется в панель ActiveX. Я так понимаю что не может найти иконку. Где взять иконку эту? =(
Вот к чему пришел -
ShockwaveFlash - тут нужно знать имена объектов и слоев чтобы ими управлять. Мне же ничего не известно.
До самой флешки получилось достучаться только так
iDoc2Area->get_applets(&iCol); Т.к. интерфейс на IHTMLEmbedElement выдавать ни в какую не хочет
Вот это у меня не вышло в Borland 2006. Дык я пошел другим путем.
1)Идем C:\WINDOWS\system32\Macromed\Flash\Flash9b.ocx и копируем в папочку с нашим проектом
2) в проекте пишем #import "Flash9b.ocx". Пытаемся собрать (F9)
3) Смотрим в папочку с проектом там создалось
Flash9b.tlh
Flash9b.tli
4)Вместо #import "Flash9b.ocx" пишем #include "Flash9b.tlh" Пытаемся собрать.
5) Пишет кучу ошибок в comdef.h. Лезем в папку с борландом и копируем comdef.h к себе в папочку с проектом. Собираем. Выводит кучу ошибок. На местах ошибок ставим // =), т.е. комментируем
6) Пишем using namespace ShockwaveFlashObjects;
и спокойно создаем данный объект =)
IShockwaveFlash* shwaveflash;
ВуалЯ! =)
Правда после всех этих махинаций у меня что-то интерфейсы глючить стали и борланд стал ругаться даже на IWebBrowser2* pBrowser;
вот такую запись хотя до этого все ништяк работало =)
вот такую запись хотя до этого все ништяк работало =)
надо думать что все через ж.. будет работать, если поотключал все в хедерах борландовских :)
для того чтоб не копировать в папку проекта в опциях есть пути откуда брать хедеры, библиотеки и т.п.
2) в проекте пишем #import "Flash9b.ocx".
The #import directive is included for Microsoft compatibility only. Its use is generally not recommended. You should use the Import Type Library command or TLIBIMP.EXE when importing type libraries.
В коммандной строке:
[path]\TLIBIMP.EXE [path]\Flash9b.ocx - Enter.
Если не будешь ставить в палитру нужны только: ShockwaveFlashObjects_TLB.cpp и ShockwaveFlashObjects_TLB.h
В проекте прописал #include "ShockwaveFlashObjects_OCX.h"
И добавил СППешник
[C++ Error] ShockwaveFlashObjects_OCX.h(46): E2209 Unable to open include file 'ShockwaveFlashObjects_TLB.h'
[C++ Error] ShockwaveFlashObjects_OCX.h(97): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(97): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(112): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(112): E2238 Multiple declaration for 'TShockwaveFlash::TCOMIShockwaveFlash'
[C++ Error] ShockwaveFlashObjects_OCX.h(97): E2344 Earlier declaration of 'TShockwaveFlash::TCOMIShockwaveFlash'
[C++ Error] ShockwaveFlashObjects_OCX.h(112): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(113): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(113): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(172): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(172): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(277): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(277): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(283): E2303 Type name expected
[C++ Error] ShockwaveFlashObjects_OCX.h(283): E2139 Declaration missing ;
[C++ Error] ShockwaveFlashObjects_OCX.h(288): E2293 ) expected
[C++ Error] ShockwaveFlashObjects_OCX.h(299): E2316 'IServiceProviderPtr' is not a member of 'Shockwaveflashobjects_tlb'
[C++ Error] ShockwaveFlashObjects_OCX.h(299): E2293 ) expected
[C++ Error] ShockwaveFlashObjects_OCX.h(293): E2268 Call to undefined function 'GetDefaultInterface'
[C++ Error] ShockwaveFlashObjects_OCX.h(293): E2288 Pointer to structure required on left side of -> or ->*
Воообщем вот стока всего выдает
В проекте прописал #include "ShockwaveFlashObjects_OCX.h"
И добавил СППешник
ведь написано:
нужны ShockwaveFlashObjects_TLB.cpp и ShockwaveFlashObjects_TLB.h
Не надо его в палитру пихать! Хости его самостоятельно!
... а у меня и в палитру пихается ЫЫ :)