Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   встраивание flash в c++ (http://www.flasher.ru/forum/showthread.php?t=120551)

kaj 23.01.2009 20:04

встраивание 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-е есть.

alexcon314 24.01.2009 19:21

Для того, чтобы динамически хостить различные 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);

kaj 24.01.2009 19:54

спасибо большое за пример, сейчас попробую.

Цитата:

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

Цитата:

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

alexcon314 24.01.2009 22:20

ссылка по #import
или в гугл "#import c++"

kaj 24.01.2009 22:47

м-да, глупый вопрос. спасибо. а я использовал midl для этого.

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

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

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

alexcon314 30.01.2009 12:36

Код:

#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);
};

Вот еще неплохой пример в три строчки кода.
откуда взял.

kaj 30.01.2009 14:20

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


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

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