MFC加载指定Flash.ocx, 求助

我喝多了 我喝多了 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如斯情况:

我想加载指定的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();
}
...全文

相关推荐

VC调用VC制作的OCX(该OCX是带有FLASH的窗体).rar

VC调用VC制作的OCX(该OCX是带有FLASH的窗体).rarVC调用VC制作的OCX(该OCX是带有FLASH的窗体).rar

yangyun1219

2013.07.04《用VC++实现Flash的播…

用VC++实现FLASH播放  .控件的注册【如果你的VC++工具已经有了此控件就不需要注册控件这一步了】 不同于Windows标准控件,ActiveX控件需要注册才能使用,ActiveX一般以.OCX或者.DLL文件格式发布,可以使用VC附带的工具来注册某个控件,按照以下步骤:在VC的Tools菜单下启动ActiveX Control Test Container;在ActiveX Contr

Monica_弋曦

利用Adobe Flash Player ActiveX控件绕过SafeSEH

其实思路就是利用程序加载模块之外的内存地址,找到一个跳板指令绕过SafeSEH,flash9.2.124以前是没有SafeSEH的。 这一次试验因为涉及,mfc控件的构建,由于我虚拟机环境是vs 2008 express版本的,所以没有办法创建这种工程,直接拿别人做好的ocx文件用了。 1、第一步就是创建ActiveX mfc工程,创建一个test函数,函数中包含一个字符串覆盖的漏洞,同时注意

Yx0051

VC调用VC制作的OCX

VC调用VC制作的OCX(该OCX是带有FLASH的窗体) 资源来自互联网

perfeson

Flash10.3_11.3_ocx

新版本的 FlashPlayer 体积 变得越来越庞大,如果仅仅只是 为了发布 flash 程序 或 嵌入式swf ,又担心 客户PC端 没安装flash,那么仅仅是需要PC机注册一下 本压缩包提供的 flash.ocx 控件即可以运行了。不需要再下载 最新版的 FlashPlayer。 '如果你的 swf 没有用到 playglobal.swc 3D API 组件,只需安装 体积更少的 flash 10.3 即可! 如果你是用MFC和duilib库打包swf运行,那这个包是你的最佳选择。

RoadToTheExpert
评论 18
收藏 已收藏
分享
返回顶部
我喝多了
ATL 3,248 成员 48,530 内容