MFC加载指定Flash.ocx, 求助

我喝多了 2020-07-16 05:55:37
如斯情况:

我想加载指定的flash.ocx, 同事的c#工程实测 指定的flash.ocx运行页游, CPU占用是2%-10%之间, 非常省资源.

但是我的c++工程加载指定flash.ocx后, 与同事的电脑配置一模一样, CPU占用却在20%以上.
我想应该是没有加载上我指定的flash.ocx, 而是系统里已注册的flash.ocx被加载上了, 系统里已注册的flash.ocx,跑页游,CPU占用确实是20%以上. 跟我的工程里占用的CPU是一样的.


应该是我的代码哪里有问题, 或者是我没弄明白怎么加载指定的flash.ocx, 请高人帮我看看, 改改代码, 感激涕零

工程下载链接: https://pan.baidu.com/s/19luzqxcXft8kIPbbVUd3XA 提取码: msrc 百度盘

CSDN本站下载, 0积分
https://download.csdn.net/download/woheduole/12625371

代码如下:

.h

#pragma once

#include <atlhost.h>

#import "sdflash.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 */ \
exclude("IServiceProvider"),\
rename("IDispatchEx","IMyDispatchEx")


#ifdef _DEBUG //DEBUG版本
#include "./Debug/sdflash.tlh"
#else //release版本
#include "./Release/sdflash.tlh"
#endif


class CFlash
{
public:
CFlash(void);
~CFlash(void);

public:
BOOL CreateWithMFC(HWND hwnd);//直接绑定到MFC窗口上
BOOL Create(HWND hwnd);//窗口一个FLASH窗口
BOOL Destroy();//销毁FLASH控件

BOOL SetWMode(LPCWSTR strMode);//设置FLASH显示模式
CString GetWMode();//获取FLASH显示模式

BOOL SetQuality(LPCWSTR strMode);//设置FLASH画质
CString GetQuality();//获取FLASH画质

BOOL SetFlashVars(LPCWSTR strVars);//设置FlashVar
CString GetFlashVars();//获取FlashVar

BOOL SetVariable(LPCWSTR strName, LPCWSTR strValue);//设置Flash变量
CString GetVariable(LPCWSTR strName);//获取Flash变量

BOOL LoadMovie(LPCWSTR strUrl);//载入url Movie
BOOL isPlaying();
BOOL Play();
BOOL Stop();

void FullWindow();//使FLASH窗口铺满父窗口
void SetRect(RECT& rt);//设置FLASH窗口大小, 参数必须是用 ::GetClientRect函数获取

BOOL Show();//显示FLASH窗口
BOOL Hide();//隐藏FLASH窗口

public:
CComQIPtr<IShockwaveFlash> m_pf;//IShockwaveFlash对象指针
CComQIPtr<IViewObject2> m_po;//IViewObject2对象指针
CAxWindow* m_pAxWnd;//activex控件宿主窗口
HWND m_hWnd;//FLASH窗口句柄
};

//宏定义 FLASH画质
#define _Quality_Low L"low" //0 low和medium值一样
#define _Quality_Medium L"medium" //0 low和medium值一样
#define _Quality_High L"high" //1 high和best值一样
#define _Quality_Autolow L"autolow" //2
#define _Quality_Autohigh L"autohigh" //3
#define _Quality_Best L"best" //1 high和best值一样

#define _wMode_window L"window"
#define _wMode_opaque L"opaque"
#define _wMode_transparent L"transparent"
#define _wMode_direct L"direct"
#define _wMode_gpu L"gpu"


.cpp

#include "StdAfx.h"
#include "Flash.h"

CComModule _Module;
extern __declspec(selectany) CAtlModule* _pAtlModule=&_Module;

CFlash::CFlash(void)
{
if(FAILED(::CoInitialize(NULL)))
{
AfxMessageBox(L"CoInitialize Failed!\r\n");
return;
}

m_pAxWnd = NULL;
}


CFlash::~CFlash(void)
{
Destroy();

::CoUninitialize();
}

BOOL CFlash::CreateWithMFC(HWND hwnd)
{
RECT rt = {0};
::GetClientRect(hwnd, &rt);

//创建 IShockwaveFlash 对象
HRESULT hr = ::CoCreateInstance(__uuidof(ShockwaveFlash),NULL,CLSCTX_INPROC_SERVER,__uuidof(IShockwaveFlash),(void **)&m_pf);
if (m_pf == NULL)
{
::MessageBox(NULL, L"IShockwaveFlash 创建失败", L"错误", MB_OK);
return FALSE;
}

//查询 IViewObject2对象
hr = m_pf->QueryInterface(__uuidof(IViewObject2),(void **)&m_po);
if (m_po == NULL)
{
::MessageBox(NULL, L"IViewObject2 查询失败", L"错误", MB_OK);
return FALSE;
}

//绑定到MFC的窗口上
hr = ::AtlAxAttachControl(m_pf,hwnd,NULL);
if (FAILED(hr))
{
::MessageBox(NULL, L"IShockwaveFlash绑定窗口失败", L"错误", MB_OK);
return FALSE;
}

return TRUE;
}

BOOL CFlash::Create(HWND hwnd)
{
RECT rt = {0};
::GetClientRect(hwnd, &rt);
rt.bottom -= 50;

//对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败
if (AtlAxWinInit() == FALSE)
{
::MessageBox(NULL, L"初始化容器窗口的注册类 失败", L"错误", MB_OK);
return FALSE;
}

m_pAxWnd = new CAxWindow();
if (m_pAxWnd == NULL)
{
::MessageBox(NULL, L"new CAxWindow(); 失败", L"错误", MB_OK);
return FALSE;
}

//创建Shock wave flash控件
WCHAR wszCtlName[64] = L"ShockwaveFlash.ShockwaveFlash";
m_hWnd = m_pAxWnd->Create(hwnd, rt, wszCtlName,WS_CHILD | WS_VISIBLE);
if (m_hWnd == NULL)
{
::MessageBox(NULL, L"控件窗口 创建失败", L"错误", MB_OK);
return FALSE;
}

CComPtr<IUnknown> pUk = NULL;
m_pAxWnd->QueryControl(&pUk);
if (pUk == NULL)
{
::MessageBox(NULL, L"查询IUnknown 失败", L"错误", MB_OK);
return FALSE;
}

HRESULT hr = pUk->QueryInterface(IID_IShockwaveFlash,(void**)&m_pf);
if (m_pf == NULL)
{
::MessageBox(NULL, L"IShockwaveFlash 查询失败", L"错误", MB_OK);
return FALSE;
}

hr = m_pf->QueryInterface(IID_IViewObject2,(void**)&m_po);

if (m_po == NULL)
{
::MessageBox(NULL, L"IViewObject2 查询失败", L"错误", MB_OK);
return FALSE;
}

m_pf->put_AllowFullScreen(L"true");
m_pf->put_AllowNetworking(L"all");
m_pf->put_BackgroundColor(0x0);//黑色背景
m_pf->put_AllowScriptAccess(L"always");//允许脚本
m_pf->put_WMode(_wMode_window);
m_pf->put_Quality2(_Quality_Low);

return TRUE;
}

BOOL CFlash::Destroy()//销毁FLASH控件
{
if (m_hWnd)
{
::SendMessage(m_hWnd, WM_CLOSE, 0, 0);
::SendMessage(m_hWnd, WM_DESTROY, 0, 0);
::SendMessage(m_hWnd, WM_NCDESTROY, 0, 0);
m_hWnd = NULL;
}

if (m_po != NULL)
m_po.Release();

if (m_pf != NULL)
m_pf.Release();

if (m_pAxWnd != NULL)
{
delete m_pAxWnd;
m_pAxWnd = NULL;
}

return TRUE;
}

BOOL CFlash::SetWMode(LPCWSTR strMode)
{
if (m_pf == NULL)
return FALSE;

return m_pf->put_WMode(CComBSTR(strMode)) == S_OK;
}


CString CFlash::GetWMode()
{
CComBSTR bstrMode;
m_pf->get_WMode(&bstrMode);
return (CString)bstrMode;
}

BOOL CFlash::SetQuality(LPCWSTR strMode)
{
return m_pf->put_Quality2(CComBSTR(strMode)) == S_OK;
}

CString CFlash::GetQuality()
{
CComBSTR bstrQu;
m_pf->get_Quality2(&bstrQu);
return (CString)bstrQu;
}

void CFlash::FullWindow()
{
HWND hParent = ::GetParent(m_hWnd);
RECT rt = {0};
::GetClientRect(hParent, &rt);
SetRect(rt);
}

void CFlash::SetRect(RECT& rt)//设置FLASH窗口大小, 参数必须是用 ::GetClientRect函数获取
{
int nWith = rt.right - rt.left;
int nHeight = rt.bottom - rt.top;
::MoveWindow(m_hWnd,rt.left,rt.top,nWith,nHeight,TRUE);
}

BOOL CFlash::SetFlashVars(LPCWSTR strVars)//设置FlashVar
{
return m_pf->put_FlashVars(CComBSTR(strVars)) == S_OK;
}

CString CFlash::GetFlashVars()//获取FlashVar
{
CComBSTR bstrVars;
m_pf->get_FlashVars(&bstrVars);
return (CString)bstrVars;
}

BOOL CFlash::SetVariable(LPCWSTR strName, LPCWSTR strValue)//设置FLASH变量
{
return m_pf->SetVariable(CComBSTR(strName), CComBSTR(strValue)) == S_OK;
}

CString CFlash::GetVariable(LPCWSTR strName)//获取FLASH变量
{
CComBSTR bstrValue;
m_pf->GetVariable(CComBSTR(strName), &bstrValue);
return (CString)bstrValue;
}


BOOL CFlash::LoadMovie(LPCWSTR strUrl)//载入url Movie
{
return m_pf->LoadMovie(0, CComBSTR(strUrl)) == S_OK;
}

BOOL CFlash::isPlaying()
{
VARIANT_BOOL vb;
m_pf->IsPlaying(&vb);
return vb != FALSE;
}

BOOL CFlash::Play()
{
return m_pf->Play() == S_OK;
}

BOOL CFlash::Stop()
{
return m_pf->Stop() == S_OK;
}

BOOL CFlash::Show()
{
return ::ShowWindow(m_hWnd,SW_SHOW);
}

BOOL CFlash::Hide()
{
return ::ShowWindow(m_hWnd,SW_HIDE);
}



void CswftestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_f.Create(GetSafeHwnd());

m_f.SetFlashVars(L"assetsHost=http://res.zfd.zhi-ming.com/QQstable/elements/&socket_ip=119.29.73.239&socket_port=23089&serverId=S3097&isOpenGm=0&goldExtract=0&isAdult=1&time=1593743917&author=D46A6999E3ED64325008D2C5E943FB3C&authorKey=D46A6999E3ED64325008D2C5E943FB3C&autoMode=0&version=5201314&mainVersion=2014112010&mainswfVersion=202006281655&platform=qqgame&official=http://rc.qzone.qq.com/1104216374&bbs=&recharge=&client=1¶ms=pf%3Dqqgame%26serverid%3D6612%26openid%3DD46A6999E3ED64325008D2C5E943FB3C%26openkey%3D1EB0314F500C48DC84CC9285747422DE%26seqid%3D381f5a71d48c1418179dcb9f8f811264%26pfkey%3DE9EB03845BA7578B2D50E51E5D4F6DD4%26manyouid%3Dnull%26appid%3D1104216374µClient=-1&comm_params=linkType%3DlinkUrl%3BlinkUrl%3Dhttp%3A%2F%2Fhuodong.37.com%2Fdist%2Fcqby%2F20190115%2F&sign=c57a491413857aa0d9630133b282044c&loginClient=http://dldir1.qq.com/box/QQmicrogamebox/release/1104216374/8/CQBY_latest.exe&isDebug=0&isClickLog=0");

m_f.m_pf->LoadMovie(0,L"http://res.zfd.zhi-ming.com/QQstable/mir/main.swf?ver=1593743917");

m_f.Play();
}
...全文
464 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
我喝多了 2020-07-27
  • 打赏
  • 举报
回复
引用 17 楼 蒋晟 的回复:
检查你的同事的C#项目的manifest文件,是不是用了免注册方式调用ActiveX 如果是的话,你可以同样在你的项目里加入manifest文件。
你说的对. 他用的就是 manifest 文件, 这几天我也正在研究 manifest
蒋晟 2020-07-27
  • 打赏
  • 举报
回复
检查你的同事的C#项目的manifest文件,是不是用了免注册方式调用ActiveX 如果是的话,你可以同样在你的项目里加入manifest文件。
Windy2018 2020-07-26
  • 打赏
  • 举报
回复
手动regsvr32注册下程序目录下的ocx试试?或者程序启动的时候DllRegisterServer动态注册ocx。。。
我喝多了 2020-07-26
  • 打赏
  • 举报
回复
加载的的确还是系统中已注册的 flash.ocx

#import "sdflash.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 */ \
    exclude("IServiceProvider"),\
    rename("IDispatchEx","IMyDispatchEx")
这里没有起作用, 大侠们知道为什么么
我喝多了 2020-07-21
  • 打赏
  • 举报
回复
引用 13 楼 蒋晟 的回复:
你可以自己用Process Monitor,在过滤器里加上Path Contains 你的ActiveX文件名 看到底加载的是哪里的控件。 再就是容器不同了,你可以换ATL::CAxHostWindow试试……这个支持无窗口模式的ActiveX。
感谢指点, 我去研究研究
蒋晟 2020-07-19
  • 打赏
  • 举报
回复
你可以自己用Process Monitor,在过滤器里加上Path Contains 你的ActiveX文件名 看到底加载的是哪里的控件。 再就是容器不同了,你可以换ATL::CAxHostWindow试试……这个支持无窗口模式的ActiveX。
我喝多了 2020-07-18
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
"sdflash.ocx" ? "swflash.ocx" 吧
文件名就是 sdflash.ocx 有工程, 您可以下载看一下
mmcanyu 2020-07-18
  • 打赏
  • 举报
回复
我的电脑已经卸载了flash,遇到不能播放flash的网页,解决办法是,关闭网页!
我喝多了 2020-07-18
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
网页上的播放Flash的时候,有启用/禁用硬件加速开关的, 是否和这个有关?
您好, 跟这方面没有关系
我喝多了 2020-07-18
  • 打赏
  • 举报
回复
大侠们都在哪里啊
zgl7903 2020-07-18
  • 打赏
  • 举报
回复
网页上的播放Flash的时候,有启用/禁用硬件加速开关的, 是否和这个有关?
schlafenhamster 2020-07-17
  • 打赏
  • 举报
回复

//#import "C:\\WINNT\\system32\\macromed\\flash\\Flash9b.ocx"
#import "flash9b.ocx" //type library
我喝多了 2020-07-17
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
adobe 明年不支持 flash 了
明年不支持, 但是今年还得用啊
我喝多了 2020-07-17
  • 打赏
  • 举报
回复
引用 1 楼 Simple-Soft 的回复:
能不ocx放到你的目录,然后指定import它
现在FLASH.ocx就在我的工程目录里, .h文件开头就import了啊
schlafenhamster 2020-07-17
  • 打赏
  • 举报
回复
adobe 明年不支持 flash 了
schlafenhamster 2020-07-17
  • 打赏
  • 举报
回复
"sdflash.ocx" ?
"swflash.ocx" 吧
我喝多了 2020-07-17
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
如 //#import "C:\\WINNT\\system32\\macromed\\flash\\Flash9b.ocx" #import "flash9b.ocx" //type library
.h文件开头我也是这样做的

#import "sdflash.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 */ \
	exclude("IServiceProvider"),\
	rename("IDispatchEx","IMyDispatchEx")\
	rename("ICanHandleException", "IMyCanHandleException")
Simple-Soft 2020-07-16
  • 打赏
  • 举报
回复
能不ocx放到你的目录,然后指定import它

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧