最近由于需要在程序中使用Flash播放,所以学习了下如何播放Flash,这里使用atl库中的CAxWindow来处理我们要播放的Flash!由于Flash的很多接口我们都不知道,所以可以参考前一篇文章http://blog.csdn.net/xueyunf/article/details/9160657,这篇文章中介绍了如何导出Flash的接口,这篇文章主要介绍一下,Flash的时间的通知,以及如何利用windows的API,进行两个Flash的混合播放!新建一个默认的 win32窗口程序,然后加入后面的头文件,这里主要是加入atl库文件,以及adobe公司的flash的ocx控件。

#include <atlbase.h>
extern CComModule _Module;
#include <atlwin.h>
#include <comdef.h>
#include "flash32_11_7_700_224.tlh"
#include <string>
using namespace std;
using namespace ShockwaveFlashObjects;
CComModule _Module;
然后我们建立个Flash事件的处理类:
class FlashSink : public ShockwaveFlashObjects::_IShockwaveFlashEvents
{
public:    LPCONNECTIONPOINT       m_ConnectionPoint;     DWORD                   m_dwCookie;   int                     m_nRefCount;public:   FlashSink()   {          m_dwCookie = 0;   m_ConnectionPoint = NULL;   m_nRefCount = 0;   }   virtual ~FlashSink()   {   }   HRESULT Init(CComPtr<IShockwaveFlash> ptrFlash)   {   HRESULT aResult = NOERROR;   LPCONNECTIONPOINTCONTAINER aConnectionPoint = NULL;   if ((ptrFlash->QueryInterface(IID_IConnectionPointContainer, (void**) &aConnectionPoint) == S_OK) &&   (aConnectionPoint->FindConnectionPoint(__uuidof(ShockwaveFlashObjects::_IShockwaveFlashEvents), &m_ConnectionPoint) == S_OK))               {   IDispatch* aDispatch = NULL;   QueryInterface(__uuidof(IDispatch), (void**) &aDispatch);   if (aDispatch != NULL)   {   aResult = m_ConnectionPoint->Advise((LPUNKNOWN)aDispatch, &m_dwCookie);   aDispatch->Release();   }   }   if (aConnectionPoint != NULL)    aConnectionPoint->Release();   return aResult;   }   HRESULT Shutdown()   {   HRESULT aResult = S_OK;   if (m_ConnectionPoint)   {   if (m_dwCookie)   {   aResult = m_ConnectionPoint->Unadvise(m_dwCookie);   m_dwCookie = 0;   }   m_ConnectionPoint->Release();   m_ConnectionPoint = NULL;   }   return aResult;   }   HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID* ppv)   {   *ppv = NULL;   if (riid == IID_IUnknown)   {   *ppv = (LPUNKNOWN)this;   AddRef();   return S_OK;   }   else if (riid == IID_IDispatch)   {   *ppv = (IDispatch*)this;   AddRef();   return S_OK;   }   else if (riid == __uuidof(ShockwaveFlashObjects::_IShockwaveFlashEvents))   {   *ppv = (ShockwaveFlashObjects::_IShockwaveFlashEvents*) this;   AddRef();   return S_OK;   }   else   {      return E_NOTIMPL;   }   }   ULONG STDMETHODCALLTYPE AddRef()   {     return ++m_nRefCount;   }   ULONG STDMETHODCALLTYPE Release()   {     int aRefCount = --m_nRefCount;   if (aRefCount == 0)        delete this;           return aRefCount;   }   // IDispatch method   virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT* pctinfo)   {   return E_NOTIMPL;   }   virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo)   {   return E_NOTIMPL;    }   virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames,   UINT cNames, LCID lcid,DISPID* rgDispId)   {   return E_NOTIMPL;    }   virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,   WORD wFlags, ::DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult,   ::EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr)   {   switch(dispIdMember)   {   case 0x7a6:            break;   case 0x96:             if ((pDispParams->cArgs == 2) &&   (pDispParams->rgvarg[0].vt == VT_BSTR) &&   (pDispParams->rgvarg[1].vt == VT_BSTR))   {   FSCommand(pDispParams->rgvarg[1].bstrVal, pDispParams->rgvarg[0].bstrVal);   }   break;   case DISPID_READYSTATECHANGE:                      break;   default:               return DISP_E_MEMBERNOTFOUND;   }    return NOERROR;   }   HRESULT OnReadyStateChange (long newState)   {   MessageBox(NULL,L"",L"Read",MB_OK);return S_OK;   }   HRESULT OnProgress(long percentDone )   {   MessageBox(NULL,L"",L"Done",MB_OK);return S_OK;   }   HRESULT FSCommand (_bstr_t command, _bstr_t args)   {   //         if (m_pFlashWidget != NULL)   //             m_pFlashWidget->FlashCommand((char*) command, (char*) args);   return S_OK;   }
};

当然这也很简单,我们只要明白Flash的机制就可以了。后边是Flash播放的一些简单的处理
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此放置代码。HRESULT hr =  CoInitialize(NULL);AtlAxWinInit();MSG msg;HACCEL hAccelTable;// 初始化全局字符串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_WIN32PROJECT7, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT7));// 主消息循环:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}CoUninitialize();return (int) msg.wParam;
}//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style           = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra      = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT7));wcex.hCursor     = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = MAKEINTRESOURCE(IDC_WIN32PROJECT7);wcex.lpszClassName    = szWindowClass;wcex.hIconSm       = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);
}//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{HWND hWnd;hInst = hInstance; // 将实例句柄存储在全局变量中hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;
RECT rc = {0, 0, 300, 300 };RECT rc1 = {0, 0, 600, 300 };HWND hwnd_tmp= NULL;HWND hwnd_tmp1= NULL;CAxWindow    m_pWinContainer;static CComPtr<IShockwaveFlash> pFlash;static FlashSink    flashSink;CAxWindow    m_pWinContainer1;static CComPtr<IShockwaveFlash> pFlash1;static FlashSink    flashSink1;switch (message){      case WM_CREATE:AllocConsole();freopen("CONOUT$","w+t", stdout);SetWindowPos(hWnd,NULL,0,0,1024,768,SWP_NOMOVE);GetClientRect(hWnd,&rc);GetWindowRect(hWnd,&rc1);POINT tmpPoint;tmpPoint.x = rc1.left;tmpPoint.y = rc1.top;ScreenToClient(hWnd,&tmpPoint);rc1.left -= tmpPoint.x;rc1.top  -= tmpPoint.y;tmpPoint.x = rc.right;tmpPoint.y = rc.bottom;ClientToScreen(hWnd,&tmpPoint);rc1.right = tmpPoint.x;rc1.bottom = tmpPoint.y;hwnd_tmp=m_pWinContainer.Create(hWnd,rc,TEXT("ShockwaveFlash.ShockwaveFlash"),WS_CHILD|WS_VISIBLE);hwnd_tmp1=m_pWinContainer1.Create(hWnd,rc1,TEXT("ShockwaveFlash.ShockwaveFlash"),WS_POPUPWINDOW|WS_VISIBLE,WS_EX_LAYERED);SetLayeredWindowAttributes(hwnd_tmp1, 0, 123, LWA_ALPHA);printf("%d",GetLastError());if (NULL == hwnd_tmp){printf("%s","句柄为空");}if (NULL == hwnd_tmp1){printf("%s","窗口2句柄失败!");}HRESULT hr;hr=m_pWinContainer.QueryControl(__uuidof(IShockwaveFlash),(void**)&pFlash);m_pWinContainer1.QueryControl(__uuidof(IShockwaveFlash),(void**)&pFlash1);if(FAILED(hr)) {return -1L;}else{flashSink.Init(pFlash);wchar_t sst[1024];GetCurrentDirectory(1000,sst);wprintf(L"%s",sst);wstring tmppath;tmppath = sst;wstring tmppath1;tmppath1 = tmppath+L"/f146.swf";wstring tmppath2;tmppath2 =tmppath+ L"/flash1920.swf";hr=pFlash->put_Movie((BSTR)tmppath1.c_str());pFlash1->put_Movie((BSTR)tmppath2.c_str());if(SUCCEEDED(hr)) {pFlash->Play();printf("开始播放!");}pFlash1->Play();}break;case WM_COMMAND:wmId    = LOWORD(wParam);wmEvent = HIWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT://DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);//VARIANT_BOOL isPlayIng;//pFlash->get_Playing(&isPlayIng);if (pFlash->IsPlaying()){pFlash->Stop();}else{pFlash->Play();}break;case IDM_EXIT:if (pFlash1->IsPlaying()){pFlash1->Stop();}else{pFlash1->Play();}break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意绘图代码...EndPaint(hWnd, &ps);break;case WM_DESTROY:FreeConsole();pFlash.Release();//m_pWinContainer.DestroyWindow();PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return (INT_PTR)TRUE;}break;}return (INT_PTR)FALSE;
}
可以看到红色部分是被我修改过的地方,这些东西虽然不难,但是自己做起来没有资料的时候也挺不方便的!这样Flash的播放就好了,但是不知道为什么停止和开始播放按钮对某些Flash动画不起作用。好了就说这么多!因为有些童鞋可能比较没有时间,所以直接附上源码在最后方便修改和使用!http://download.csdn.net/detail/xueyunf/5658183当然也同样给出一个运行的结果截图:

[置顶] c++播放Flash文件相关推荐

  1. Windows On Top v3.8.0 Windows窗口置顶小工具单文件版

    前言 Window On Top能够让任意的窗口总是在最顶层,那么当你有时需要两个窗口同时打开时就无需频繁的切换了. Window On Top Window On Top 的使用方法十分简单,在 W ...

  2. C#播放flash文件(swf文件)

    大家好,我想介绍一种简单的播放flash的方法给大家!! 首先,新建一个工程 然后在工具箱--常规--点击鼠标右键--选择项(I) 在COM组件中找到Shockwave Flash Object这个控 ...

  3. [置顶] 卡巴斯基2009许可文件、卡巴斯基2009kav版授权key(8月25日更新)

    本站提供:最新卡巴斯基2009key.卡巴斯基2009激活授权文件key.卡巴斯基2009许可文件,卡巴斯基2009反病毒kav8.0版激活授权文件key,卡巴斯基激活码,卡巴斯基授权文件.经黑名单亲 ...

  4. dux修改index.php,DUX主题首页显示置顶文章

    之前有网友跟我要这个功能,实在是忙于生计一直没有时间写这方面的文章,最近这两天闲暇下来总算是有些时间了,其实这个功能说简单也简单,基本思路就是通过 get_option('sticky_posts') ...

  5. ubuntu firefox不能播放MP4,ubuntu Firefox flash 浏览器全屏置顶

    ubuntu默认安装的Firefox是不能播放MP4的, sudo apt-get install gnome-mplayer ubuntu默认安装的Firefox是不能播放flash的, sudo ...

  6. 网页视频小窗口置顶播放

    小窗口分离 Separate-Window_v0.7.6 用法: 最新chrome浏览器需要解压将文件夹添加到扩展中 安装完毕,点击Select,选中视频即可分离出小窗口. 若黑屏无法播放,鼠标滑轮滑 ...

  7. Final swfplayer在安卓12如何播放SWF格式的Flash文件

    安卓上面播放flash一直都是难题,今天找到一个可用在安卓手机上播放最新的播放Final SwfPlayer的播放器,这个播放器据说是基于开源项目移植,没有版权问题,可用免费随便使用. 工具/原料 O ...

  8. Android使用Webview播放Swf文件,实现与Flash数据交互

    HDSwfPlayer 谷歌中国API链接:https://developer.android.google.cn 支持swf播放以及html带swf的播放. 支持swf与js的交互. 自动写入fla ...

  9. video 自动播放并带声音以及置顶

    video 标签 <videov-if="item.type==2"webkit-playsinline="true"playsinline=" ...

  10. cocos2dx swf 、cocos2dx flash 、use SWF / Flash in cocos2d-x; cocos2d(cocos2d-x) 直接播放flash / SWF文件

    前段时间移植一个页游到手游,原先页游的项目里面有1000+的Flash人物,宠物动画,特效. 这要是全部重新做一遍,还不累死人?所以就想干脆直接在Cocos2d(x)里面播放SWF文件.(包括场景,过 ...

最新文章

  1. self.navigationController push到指定控制器
  2. SQL 调优专题总结
  3. C# 多态(接口、虚方法、抽象类)的理解
  4. 最优化学习笔记(七)——Levenberg-Marquardt修正(牛顿法修正)
  5. qt 下log4cplus的使用
  6. OSPF高级特性——LSA-3(Network Summary LSA)的过滤、路由协议——管理距离的修改、外部路由的metric值的修改
  7. mock如何为空_Mockito怎么样Mock返回值为空的方法
  8. 腾讯社交广告转化率预估初探
  9. YOLOv3: An Incremental Improvement
  10. c语言进阶.pdf,C语言程序设计进阶:文件.pdf
  11. displayTag使用详解
  12. 使用tftp服务把路由器的配置上传到服务器
  13. 电路串联和并联图解_串联电路与并联电路的区别
  14. 软考 2015 年上半年 网络管理员 上午试卷
  15. c语言3x3矩阵转置 数组指针 接口(int(※p)[3],int n)
  16. Vite+Vue3+TypeScript
  17. 联想拯救者y7000怎么配置Java环境_联想拯救者Y7000性能配置如何 用起来怎么样...
  18. my ReadTravel_ Choson / Tailand Racha Island / Phuket Island / Malaysia
  19. 关于单词:On-premises的含义
  20. 微服务架构—优雅停机方案

热门文章

  1. PHP接口报错:500服务器错误
  2. golang 时间戳和时间互转
  3. 写的网页标题乱码,怎么办?
  4. 代码管理学:正确理解工作,并不是你想的那样容易
  5. 现在手机屏幕为什么都这么大?
  6. LINUX下载编译uuid
  7. E: 无法打开锁文件 /var/lib/dpkg/lock-frontend - open (2: 没有那个文件或目录)
  8. LINUX虚拟机安装增强功能时报错: Kernel headers not found for target kernel. Please install them and execute
  9. VirtualBox一类系统只能出现一个?
  10. FireFox的插件范例,竟然有问题