Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.01.2009, 20:04
kaj вне форума Посмотреть профиль Отправить личное сообщение для kaj Найти все сообщения от kaj
  № 1  
Ответить с цитированием
kaj

Регистрация: Jan 2009
Сообщений: 4
По умолчанию встраивание flash в c++

пытаюсь создать элемент ShockwaveFlash.ShockwaveFlash. подскажите пожалуйста в чем может быть ошибка.
в WinMain вызываю AtlAxWinInit (), дальше создаю окно и в обработчике WM_CREATE делаю такой вызов:

CreateWindowEx (0, TEXT("AtlAxWin"), TEXT("ShockwaveFlash.ShockwaveFlash"), WS_CHILD | WS_TABSTOP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, wWindow, 0, wInstance, 0)

где wWindow был передан WinProc, а wInstance - WinMain. функция завершается с ошибкой 6 - invalid handle.

что я забыл сделать ?
ps ShockwaveFlash в com object viewer-е есть.

Старый 24.01.2009, 19:21
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 2  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Для того, чтобы динамически хостить различные ActiveX с помощью библиотеки ATL MSDN рекомендует пользоваться классом AtlAxWin80. Вот вариант его использования под MSVC++ 2005:
Код:
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
#include <atlwin.h>
#include <atlhost.h>
#define ATL_MIN_CRT 
class CHostActiveXModule : public CAtlExeModuleT<CHostActiveXModule>
{
public :
   CAxWindow m_wndMain;
   // Create the Main window
   HRESULT PreMessageLoop(int nCmdShow)
   {
      HRESULT hr = CAtlExeModuleT<CHostActiveXModule>::PreMessageLoop(nCmdShow);
      if (SUCCEEDED(hr))
      {
         AtlAxWinInit();
         hr = S_OK;
         RECT rc;
         rc.top = rc.left = 100;
         rc.bottom = rc.right = 500;
         m_wndMain.Create(NULL, rc, _T("ShockwaveFlash.ShockwaveFlash"),WS_OVERLAPPEDWINDOW );
		 //m_wndMain.Create(NULL, rc, _T("c:\\myMovie.swf"),WS_OVERLAPPEDWINDOW );
         m_wndMain.ShowWindow(nCmdShow);         
      }
      return hr;
   }

   // Clean up. App is exiting.
   HRESULT PostMessageLoop()
   {
      AtlAxWinTerm();
      return CAtlExeModuleT<CHostActiveXModule>::PostMessageLoop();
   }
};
CHostActiveXModule _AtlModule;
int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
	UNREFERENCED_PARAMETER(hInstance);
   UNREFERENCED_PARAMETER(hPrevInstance);
   return _AtlModule.WinMain(nCmdShow);

}
Для работы конкретно с флэш-контролом можно использовать директиву #import, которая создаст при компиляции оберточный класс для контрола, и далее использовать интерфейс этого класса.
По вашему примеру:
зачем указан стиль WS_CHILD?
wWindow - по смыслу хэндл родительского окна либо NULL, если окно самостоятельное. Ведь класс AtlAxWin - лишь окно-контейнер для контрола.
wInstance - хэндл инстанса приложения, типа не WinMain а один из передаваемых ей параметров, либо
просто GetModuleHandle(NULL);


Последний раз редактировалось alexcon314; 24.01.2009 в 19:34.
Старый 24.01.2009, 19:54
kaj вне форума Посмотреть профиль Отправить личное сообщение для kaj Найти все сообщения от kaj
  № 3  
Ответить с цитированием
kaj

Регистрация: Jan 2009
Сообщений: 4
спасибо большое за пример, сейчас попробую.

Цитата:
зачем указан стиль WS_CHILD?
WS_CHILD - потому что есть главное окно, wWindow. я имел в виду, что wInstance - тот же Instance, что в параметрах WinMain. написал на всякий случай, т.к. на него почему-то ругается CreateWindowEx.

Цитата:
можно использовать директиву #import
не совсем понял.
если не сложно, можете дать ссылку на к-н описание или сказать, что вводить в гугл ?)

Старый 24.01.2009, 22:20
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 4  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
ссылка по #import
или в гугл "#import c++"

Старый 24.01.2009, 22:47
kaj вне форума Посмотреть профиль Отправить личное сообщение для kaj Найти все сообщения от kaj
  № 5  
Ответить с цитированием
kaj

Регистрация: Jan 2009
Сообщений: 4
м-да, глупый вопрос. спасибо. а я использовал midl для этого.

странно, вроде работает
wnd.Create(0, rect, _T("ShockwaveFlash.ShockwaveFlash"), WS_VISIBLE );

а CreateWindowEx - нет. спасибо за наводку. пойду учить atl

>использовал midl
ну в смысле сохранял ole-com object viewer-ом в idl сначала


Последний раз редактировалось kaj; 24.01.2009 в 23:33.
Старый 30.01.2009, 12:36
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Код:
#include <windows.h>

int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show) {
    MSG   msg={0}; 
    void* init = GetProcAddress(LoadLibraryA("atl"),"AtlAxWinInit"); 
    _asm call init;
    CreateWindowA(
		"AtlAxWin", 
		"c:\\WINDOWS\\Help\\Tours\\mmTour\\segment2.swf", 
		WS_VISIBLE|WS_POPUP,
		0,
		0,
		GetSystemMetrics(SM_CXSCREEN),
		GetSystemMetrics(SM_CYSCREEN),
		0,
		0,
		0,
		0);
    while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
};
Вот еще неплохой пример в три строчки кода.
откуда взял.


Последний раз редактировалось alexcon314; 30.01.2009 в 12:38.
Старый 30.01.2009, 14:20
kaj вне форума Посмотреть профиль Отправить личное сообщение для kaj Найти все сообщения от kaj
  № 7  
Ответить с цитированием
kaj

Регистрация: Jan 2009
Сообщений: 4
спасибо, да, его смотрел, но в атл из .net как раз так у меня не получается - т.е. с помощью CreateWindow. в vc 6 все работает. слышал, что AtlAxWin изменилось на AtlAxWin7, но это не помогает, видимо изменилось и еще что-то. но ваш пример с CAxWindow работает - в нем наверное учитываются эти изменения.

Создать новую тему Ответ Часовой пояс GMT +4, время: 20:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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