久久躁狠狠躁夜夜爽_777精品视频_色妞一区二区三区_亚洲一区二区久久久久久久

在MFC中使用純COM方式來操縱Flash OCX (IShockwaveFlash)
2008-12-15
5130
小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝,小小貝

1. MFC中的控件(OCX)包裝類

在VC++環境中,使用OCX會變得比較簡單和快捷。

在Dialog中插入ActiveX,如:Shockwave Flash Object。

在建立了Dialog的類之后,為剛才插入的Flash 控件添加變量,

MFC會自動幫我們生成兩個文件:CShockwaveFlash1.h和CShockwaveFlash1.cpp有了這兩個文件,就可以很容易控制Flash了。

2. 通過MIDL生成TLB文件

MFC包裝類固然簡單,但很明顯缺乏一些高級的功能,此時就需要采用純COM的方式了。

首先使用OLE/COM Object Viewer來找到Shockwave Flash Object,

點擊右鍵“View Type Information”,在彈出的界面中,點擊“save as”將信息保存為 SWF.IDL文件,然后在打開VS提供的工具:“Visual Studio 2008 命令提示”,進入DOS界面,切換到SWF.IDL所在的目錄,執行如下命令:

MIDL SWF.IDL /tlb SWF.tlb,即可生成tlb文件。

如果生成過程有錯,提示“error MIDL2110 : end of file found in string”,可以這樣做:將前面打開的界面中(“View Type Information”)的內容拷貝,然后手動新建一個SWF.IDL的文件,將拷貝的內容粘貼入,再次執行MIDL命令。

接下來在你的VC++項目中:#import  "SWF.tlb",編譯之,即會在debug或者release。

目錄下面生成tlh(頭文件,header)和tli文件(實現文件,implementation)。

注意,在tlh文件的末尾處已經包含了tli文件。

當然也可以采用下面敘述的方式生成。

3. 相關概念

多數情況下,生成的com組件DLL/EXE/OCX已經包含了類型庫信息(type information),但當你的com程序足夠大,可能需要分離類型庫信息,此時考慮生成tlb[/B]文件,單獨存放類型庫。

此時使用:#import "XXX.tlb",然后編譯之,也會在debug或者release下面產生 XXX.tli和XXX.tlh文件。

tlh和tli文件實際上是對com接口及其屬性方法的封裝類,其中tlh[/B]相當于類型申明(頭文件),tli相當于定義實現(CPP文件),這里的實現完全是封裝方法的實現,而不是com接口方法的實現。

如下例:

inline int IShockwaveFlash::GetQuality ( ) {
int _result = 0;
HRESULT _hr = get_Quality(&_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}


其中get_Quality的真正實現實際上在XXX.ocx或者XXX.dll中。

4. 開始創建IShockwaveFlash 

為了簡單起見,就不使用那么麻煩的方法了,直接這樣:

#import "C:WINDOWSsystem32MacromedFlashFlDbg9f.ocx"  
raw_interfaces_only, /* Don't add raw_ to method names */
raw_native_types, /* Don't map to DTC smart types */  
named_guids, /* Named guids and declspecs */  
no_namespace /* Don't wrap with C++ name space */ 


如前述會自動在debug目錄下面生成tlh和tli文件,不需要在工程屬性里面加入lib,也不要include什么,很方便。

接下來,構造、析構:


其中isf和ivo是成員變量(在.h中聲明):

IShockwaveFlash * isf;
IViewObject2 * ivo;


再初始化接口:

HRESULT CFlashHelper::Init(BSTR fileName)
{
HRESULT hr;
JIF(CoCreateInstance(__uuidof(ShockwaveFlash),
NULL,CLSCTX_INPROC_SERVER,
__uuidof(IShockwaveFlash),(void **)&isf));
JIF(isf->QueryInterface(__uuidof(IViewObject2),(void **)&ivo));
AtlAxAttachControl(isf,theApp.m_pFlashPlayerDlg->m_hWnd,NULL);
isf->put_Movie(fileName);
return S_OK;
}


其中JIF是一個宏:

#define JIF(x) if (FAILED(hr=(x)))
{TRACE(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT(" "), hr); return hr;}


這里還要使用一點點ATL,ATL做COM這方面的工作在行些。

故,要在工程屬性中,設置“動態使用ATL”,在這個cpp文件中,包含如下頭文件:

#include <atlbase.h>
#include <atlcom.h>
#include <atlctl.h>


上面的代碼中還采用了一種比較簡單的方法,即:

AtlAxAttachControl(isf,theApp.m_pFlashPlayerDlg->m_hWnd,NULL);


傳統的做法是先用CAxWindow創建窗口,然后采用其QueryControl方法得到IUnknown接口,

再采用其QueryInterface,得到IShockwaveFlash,代碼大概如下:

HRESULT CFlash::Create(LPRECT lpRect) {
HRESULT hr = S_OK;
AtlAxWinInit();
m_pAxWin = new CAxWindow();
m_hwnd = m_pAxWin->Create(NULL, lpRect, g_szCLSID_ShockwaveFlash, 0);
if (!m_hwnd)
{
return E_FAIL;
}
IUnknown *pUk = NULL;
hr = m_pAxWin->QueryControl(&pUk);
if (FAILED(hr))
{
return hr;
}
m_lWidth = lpRect->right-lpRect->left;
m_lHeight = lpRect->bottom - lpRect->top;
hr = pUk->QueryInterface(IID_IShockwaveFlash,(void**)&m_pShockwaveFlash);
pUk->Release();
return hr;
}


但這個工程既然是MFC的工程,就不想使用CAxWindow來創建窗口,所以采用MFC來建立的Dialog,

然后AtlAxAttachControl(isf,theApp.m_pFlashPlayerDlg->m_hWnd,NULL);就可以了。

通過上面的方法就得到了IShockwaveFlash和IViewObject2了,接下來怎么做就隨你了。

5. 其他要注意

如果你同時在使用GDI+,那么可能會要加入如下代碼:

// for GDI+
#include <comdef.h>
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long *
#include "GdiPlus.h"
using namespace Gdiplus;
// end for GDI+
#endif


這樣編譯的時候就會出現如下的錯誤:

錯誤 8 error C2440: “初始化”: 無法從“int”轉換為“unsigned long *” c:program filesmicrosoft visual studio 9.0vcatlmfcincludeatlwin.h 523 LEDEngine

錯誤 9 error C2664: “GlobalAlloc”: 不能將參數 2 從“unsigned long *”轉換為“SIZE_T” c:program filesmicrosoft visual studio

9.0vcatlmfcincludeatlwin.h 570 LEDEngine

其實是因為ULONG_PTR這個數據類型,這個東西在ATL中也有定義,而且在altwin.h中使用了,但是其實在ATL中:

ULONG_PTR是這樣定義的:typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

在GDI+中式這樣定義的:#define ULONG_PTR unsigned long *

這樣就有沖突了,故如要同時使用GDI+和ATL,一定要這樣聲明:

// for GDI+
#include <comdef.h>
#include "GdiPlus.h"
using namespace Gdiplus;
// end for GDI+


好了,這個話題就說到這里。

 

關鍵字:MFC中使用純COM方式來操縱Flash,OCX,貝一科技知識庫
久久躁狠狠躁夜夜爽_777精品视频_色妞一区二区三区_亚洲一区二区久久久久久久
亚洲欧洲国产日韩精品| 欧美亚洲另类制服自拍| 久久久久久久国产| 国产chinese精品一区二区| 久久免费视频这里只有精品| 国产高清av在线播放| 久草视频这里只有精品| 色777狠狠综合秋免鲁丝| 日韩中文字幕免费看| 日韩一区av在线| 国产精品日韩欧美| 中文字幕色呦呦| 亚洲熟妇无码一区二区三区导航 | 国产伦精品一区二区三区高清版 | 久久免费视频这里只有精品| 国产xxxx振车| 久久精品国产久精国产思思| 国产精品激情av电影在线观看 | 久久久久久12| 欧美一区二区视频97| 日韩欧美猛交xxxxx无码| 欧美性大战久久久久xxx| 国产综合第一页| 成人免费视频久久| 国产成人一区二区三区别| 日韩在线播放视频| 欧美成人中文字幕| 欧美一区二区视频97| 欧美丰满熟妇xxxxx| 国产裸体写真av一区二区| 7777免费精品视频| 国产精品视频999| 伊人色综合久久天天五月婷| 日本欧美在线视频| 国产一区二区中文字幕免费看| 国产精品一色哟哟| 精品国产一区二区三区在线观看 | 国产精品色午夜在线观看| 欧美激情在线视频二区| 日韩美女视频中文字幕| 国产精品自拍视频| 精品国产欧美成人夜夜嗨| 国产99在线播放| 欧美日韩精品免费在线观看视频| 国产精品自拍首页| 久久精品影视伊人网| 大地资源第二页在线观看高清版| 欧美连裤袜在线视频| 波多野结衣久草一区| 国产精品免费一区二区| 视频在线99re| 国产日韩一区二区| 国产成人啪精品视频免费网| 亚洲v国产v在线观看| 国产免费黄色av| 国产精品视频男人的天堂| 亚洲 欧美 日韩 国产综合 在线| 欧美日韩dvd| 久久久综合香蕉尹人综合网| 欧美激情精品久久久久久久变态| 欧美在线视频一区二区| 91精品91久久久久久| 久久91精品国产91久久跳| 欧美性视频在线播放| 久久久亚洲精品无码| 欧美精品久久久久久久久久| 男女视频网站在线观看| 久久国产精品高清| 日日噜噜夜夜狠狠久久丁香五月| 国产欧美精品一区二区三区| 国产精品露出视频| 欧美日韩国产三区| 国产ts人妖一区二区三区| 一卡二卡3卡四卡高清精品视频| 国产中文字幕乱人伦在线观看| 国产成人精品视频免费看| 日韩国产精品毛片| 久久免费看av| 亚洲av综合色区| 91国内揄拍国内精品对白| 亚洲最大成人在线| 91久久精品www人人做人人爽| 一本色道久久99精品综合| 国产天堂在线播放| 精品毛片久久久久久| 国产一区二区片| 国产精品二区在线| 国严精品久久久久久亚洲影视| 久久久久久久久久久亚洲| 日本免费高清不卡| 久久精品欧美| 日韩免费av一区二区| 九一免费在线观看| 日韩精品免费一区| 久久国产一区二区三区| 欧美日韩系列| 国产精品裸体一区二区三区| 国产无套内射久久久国产| 欧美黄网免费在线观看| 国产精品一区二区欧美| 亚洲 国产 日韩 综合一区| 国产二区不卡| 奇米一区二区三区四区久久| 久久精品成人一区二区三区| 精品人妻人人做人人爽| 精品久久久久av| 97精品久久久| 日本高清久久一区二区三区| 久久久久99精品久久久久| 免费精品视频一区二区三区| 色综合久久久久久中文网| 超碰在线观看97| 日本免费不卡一区二区| 国产精品久久国产三级国电话系列| 国产素人在线观看| 亚洲精品国产suv一区88| 色青青草原桃花久久综合| 精品午夜一区二区| 亚洲欧美日韩综合一区| 日韩一中文字幕| 国产日韩第一页| 熟妇人妻va精品中文字幕| 久久精品电影网站| 国产女精品视频网站免费| 午夜精品一区二区三区av| 久久久国产视频91| 白白操在线视频| 男人的天堂99| 午夜久久久久久久久久久| 色视频www在线播放国产成人| 国产欧美欧洲| 欧美中文字幕在线| 一区二区三区四区在线视频| 九色一区二区| 国产精品自产拍高潮在线观看| 日韩av三级在线| 美日韩精品免费观看视频| 日韩一区二区在线视频| 99色精品视频| 免费看国产一级片| 日韩欧美在线电影| 亚洲综合视频一区| 国产精品入口免费| 国产黄页在线观看| 国产乱人伦精品一区二区三区| 日韩免费视频在线观看| 亚洲自拍av在线| 国产精品美女免费看| 国产高清免费在线| 国产精品一区二区av| 欧美精品一区二区三区在线四季| 亚洲精品9999| 精品高清视频| 国产精品美女久久久免费| 久久久噜噜噜久久中文字免| 国产精品一区在线播放| 国内精品伊人久久| 欧美亚洲视频一区| 日本不卡一区| 少妇av一区二区三区无码| 中文字幕精品在线播放| 国产精品国模在线| 久久av一区二区三区漫画| 91久久国产综合久久91精品网站| 国产日韩精品电影| 国产一区二区三区av在线| 国内精品伊人久久| 欧美日韩在线观看一区| 青春草国产视频| 欧美一级在线播放| 婷婷精品国产一区二区三区日韩| 久久久久久18| 欧美激情视频一区二区三区不卡| 国产精品久久久久久亚洲调教| 久久精品视频在线播放| 日韩中文字幕视频| 久久久久久久久综合| 国产成人精品久久| 久久久免费在线观看| 91国语精品自产拍在线观看性色| 成人免费a级片| 99久久免费国| 91传媒视频免费| 久久久日本电影| 久久国产亚洲精品无码| 久久久亚洲天堂| 国产v亚洲v天堂无码久久久| 国产激情一区二区三区在线观看| 国产二区一区| 日韩有码在线观看| 久久久精品久久久| 国产精品老女人视频| 国产精品国产三级国产aⅴ浪潮| 国产精品裸体瑜伽视频| 久热精品视频在线观看| 精品九九九九| 亚洲综合自拍一区| 日韩在线三区| 欧美日韩一区二区三区电影| 国产一区二区在线免费视频 |