Macromedia Flash и C++ Builder - как связать?
Как вообще подключить этот компонент к моей программе, а то отличия в версиях Flash9b.ocx и Flash9e.ocx вызывают ошибку...
Что делать?
Как вообще подключить этот компонент к моей программе, а то отличия в версиях Flash9b.ocx и Flash9e.ocx вызывают ошибку...
Что делать?
регистрирую ActiveX компонент:
%WINDIR%\system32\Macromed\Flash\Flash9b.ocx
Далее вставляю его в билдер через импорт ActiveX-компонентов
Далее кидаю на форму TShockwaveFlash
При показе формы назначаю ему Movie.
В итоге, если запустить одну и ту же программу на других машинах, где стоит или другая версия Flash, или ее вообще нет, то вылезают разные ошибки.
Если версия на другой машине более новая, то вылазит "access violation in module Flash9e.ocx"...
Как указать, что надо использовать только мою версию flash, т.е. как грузить этот activex при создании формы и регистрировать, если надо, а не устанавливать отдельно..
регистрирую ActiveX компонент:
%WINDIR%\system32\Macromed\Flash\Flash9b.ocx
Далее вставляю его в билдер через импорт ActiveX-компонентов
Далее кидаю на форму TShockwaveFlash
При показе формы назначаю ему Movie.
В итоге, если запустить одну и ту же программу на других машинах, где стоит или другая версия Flash, или ее вообще нет, то вылезают разные ошибки.
Если версия на другой машине более новая, то вылазит "access violation in module Flash9e.ocx"...
На машине где запускается прога:
1. Должен юыть в наличии Flash9b.ocx. Если его нет, то ктож будет работать вместо него:)
То, что ты "...вставляю его в билдер через импорт ActiveX-компонентов Далее кидаю на форму TShockwaveFlash
При показе формы назначаю ему Movie" - совсем не значит, что он у тебя в проге "сидит". В данном случае Билдер является хостом для Flash9e.ocx и это дает тебе только то,что ты можешь порулить им в дезинг-тайме и не более того... Кстати из своей проги, в итоге, ты должен сделать аналогичный хост.
2. Он должен быть зарегестрирован в системе (прописан в реестре). Иначе твоя прога просто его не найдет и - "access violation".
Как указать, что надо использовать только мою версию flash, т.е. как грузить этот activex при создании формы и регистрировать, если надо, а не устанавливать отдельно..
регистрировать можно просто вызвав DllRegisterServer из Flash9e.ocx (осх - это просто длл, но написанная по определенным понятиям и по этим понятиям она должна иметь ф-ю DllRegisterServer). Ну или не париться и поручить это regsvr32.exe.
Далее создавать его через CoCreateInstance и т.п.
но вот не понятны некоторые вещи:
- "должен сделать аналогичный хост" - не понимаю.. :)
- "Далее создавать его через CoCreateInstance и т.п." - это тоже не понятно...
Есть еще один прикол... когда я собираю (компилирую) проект в BCB и запускается прога, то все ОК - ошибок нет.
Но когда я запускаю программу из проводника, например, при передаче программе какого-нибудь параметра в ком. строке, то вылазит ошибка "access violation in ...". И так всегда...
Все библиотеки я зарегистрировал, вообще я сделал это через офиц. установщик от макромедии...
но вот не понятны некоторые вещи:
- "должен сделать аналогичный хост" - не понимаю.. :)
- "Далее создавать его через CoCreateInstance и т.п." - это тоже не понятно...
ну это типо "посадить ActiveX" на свою форму (окно) не буду парить как это делается средствами COM API т.к. я сам в этом не АС. Сделай проще:
1. Идешь сюда качаешь архив Shockwave.zip (он для версии 9 если надо др. версии, следуй инструкциям по этой же ссылке)
2. Создаешь проект, подключаешь ShockwaveFlashObjects_TLB.h, ShockwaveFlashObjects_TLB.срр
#define MainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "ShockwaveFlashObjects_TLB.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
TComInterface<IShockwaveFlash> m_pSWF;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
// cpp
#include <vcl.h>
#include <atldef.h>
#define _ATL_DLL_IMPL
#include <atliface.h>
#pragma hdrstop
#pragma comment(lib, "atl.lib")
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
AtlAxWinInit();
HWND hWnd = ::CreateWindow("AtlAxWin", "ShockwaveFlash.ShockwaveFlash.9",
WS_CHILD|WS_VISIBLE, 0, 0, 300, 300, Handle, NULL, ::GetModuleHandle(NULL), NULL);
IUnknown* pUnk;
AtlAxGetControl(hWnd, &pUnk);
m_pSWF = pUnk;
pUnk->Release();
m_pSWF->set_Movie(WideString(ExtractFilePath(Application->ExeName) + "antimult004-irreverse.swf"));
m_pSWF->GotoFrame(0);
m_pSWF->Stop();
}
но опять же это все может сделать за тебя Билдер (см. в том же архиве)
только Flash должен присутствовать на компе и д.б. зарегистрирован.
Или получается, что все TShockwaveFlash мне придется создавать в RunTime?
Или получается, что все TShockwaveFlash мне придется создавать в RunTime?
нет не надо, но лучше пользоваться одним методом - либо создавай вручную (так вроде должно пошустрей работать), либо пусть это делает Билдер (по сути он делает тоже самое + создает враппер через TOLEControl для того, чтобы можно было работать с ActiveX в designtime )
какое метод ты посоветуешь - писать код или добавить на форму TShockwaveFlash в дизайн-режиме?
При каком случае не будет ошибки "access violation in Flash9b.ocx..."?
При каком случае не будет ошибки "access violation in Flash9b.ocx..."?
ну у меня и так и так работает:)
у меня прикол такой возникает - когда собираю проект в BCB, то все ОК - ошибок нет, когда запускаю программу просто из проводника, возникаеют частенько такие ошибки...
делаю через TLIBIMP.EXE "%windir%\system32\macromed\flash\flash9f.ocx"
создается 4-е файла:
ShockwaveFlashObjects_OCX.cpp
ShockwaveFlashObjects_OCX.dcr
ShockwaveFlashObjects_OCX.h
ShockwaveFlashObjects_TLB.h
У меня на форме есть TShockwaveFlash - я его установил через Import ActiveX...
При этом в проект автоматически вставляются строки:
#pragma link "ShockwaveFlashObjects_OCX" - в .cpp
#include "ShockwaveFlashObjects_OCX.h" - в .h
Когда я пытаюсь собрать проект, закинув эти 4 созданных файла в папку с программой - выдаются ошибки:
[Linker Error] Unresolved external '__fastcall Shockwaveflashobjects_tlb::TFlashObjectInterface::BeforeDestruction()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MYPROG\UMAINFORM.OBJ
[Linker Error] Unresolved external '__fastcall Shockwaveflashobjects_tlb::TFlashObjectInterface::InitServerData()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MYPROG\UMAINFORM.OBJ
[Linker Error] Unresolved external '__fastcall Shockwaveflashobjects_tlb::TFlashObjectInterface::Connect()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MYPROG\UMAINFORM.OBJ
[Linker Error] Unresolved external '__fastcall Shockwaveflashobjects_tlb::TFlashObjectInterface::Disconnect()' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\MYPROG\UMAINFORM.OBJ
Но когда я не закидываю эти файлы в папку с проектом, то он собирается нормально, но программа глючит - из той папки, где весь проект и исходники, она запускается, а из какой-нибудь другой, например C:\1\MyProg.exe - нет, пишет Access violation in module Flash9f.ocx.
И еще один прикол:
При Import ActiveX создаются не такие файлы, как через TLIBIMP.EXE. И когда в папку кидаю файлы, созданные Import ActiveX, то проект собирается без проблем. Но опять же ошибка возникает, если я программ куда-нибудь перемещаю.
Заколебался уже... Что я не так делаю?
пишет:
Unable to open file "ATL.LIB"
Я посмотрел - его действительно нигде нет...
Поискал в интернете, нашел только atl.dll - это то или нет?
пишет:
Unable to open file "ATL.LIB"
Я посмотрел - его действительно нигде нет...
Поискал в интернете, нашел только atl.dll - это то или нет?
держи...