此问题我已卡住很多天了,VCKbase,微软新闻组都问过了,仍没有解决!环境:
工具:VC.net
项目类型:支持MFC的动态链接库功能:
首次加载此DLL时会注册一个窗口类,并且负责管理此窗口类的消
息。目的:
1、我要在这个窗口类的某条消息中创建FLASH动画通常方法:
1、网上有人提供了MFC下的CShockwareFlash类,在MFC应用程序下
很好用,但是用在此项目中会出错误。是容器错误。
2、Win32应用程序下可以使用一个CAxWindow的东西,也很简单好
用,但在此项目中失败。请高人指点迷津,卡住很多天了。最好能告诉我如何不用MFC或者
什么容器之类的东西就能实现的方式。能不能通过查找注册表查看
用户安装的FLASH版本及其相应的文件位置,然后加载那个ocx文件
我自己调用里面的函数这样从最原始的方式创建FLASH?现在我直接用控件里的CShockwareFlash类实现FLASH出错:
/**********************堆栈:
>mfc71d.dll!CWnd::InvokeHelper(long dwDispID=142, unsigned short wFlags=1, unsigned short vtRet=0, void * pvRet=0x00000000, const unsigned char * pbParamInfo=0x1003a944, ...) 行374 + 0x3 C++
Really.dll!CShockwaveFlash::LoadMovie(long layer=0, const char * url=0x10034ad4) 行317 + 0x21 C++
Really.dll!CReallyApp::Add_Flash(tagPOINT pt={...}) 行674 C++
Really.dll!CReallyApp::WndProc(HWND__ * hWnd=0x000506f6, unsigned int message=273, unsigned int wParam=32772, long lParam=0) 行493 C++/**********************出错的OLE代码:
//////////////////////////////////////////
// CWnd invoke helpers for OLE Control wrappersvoid AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
void* pvRet, const BYTE* pbParamInfo, ...)
{
ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least) if (m_pCtrlSite == NULL)
return; va_list argList;
va_start(argList, pbParamInfo);
m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
argList);
va_end(argList);
}/**********************异常提示:
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。/**********************输出:
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
DllTestSdk.exe 中的 0x77e53887 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012e59c 。
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
DllTestSdk.exe 中的 0x77e53887 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012e59c 。
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。我需要一个安全的可以在只有一个HWND的情况下可以使用FLASH的方法,谢谢!
工具:VC.net
项目类型:支持MFC的动态链接库功能:
首次加载此DLL时会注册一个窗口类,并且负责管理此窗口类的消
息。目的:
1、我要在这个窗口类的某条消息中创建FLASH动画通常方法:
1、网上有人提供了MFC下的CShockwareFlash类,在MFC应用程序下
很好用,但是用在此项目中会出错误。是容器错误。
2、Win32应用程序下可以使用一个CAxWindow的东西,也很简单好
用,但在此项目中失败。请高人指点迷津,卡住很多天了。最好能告诉我如何不用MFC或者
什么容器之类的东西就能实现的方式。能不能通过查找注册表查看
用户安装的FLASH版本及其相应的文件位置,然后加载那个ocx文件
我自己调用里面的函数这样从最原始的方式创建FLASH?现在我直接用控件里的CShockwareFlash类实现FLASH出错:
/**********************堆栈:
>mfc71d.dll!CWnd::InvokeHelper(long dwDispID=142, unsigned short wFlags=1, unsigned short vtRet=0, void * pvRet=0x00000000, const unsigned char * pbParamInfo=0x1003a944, ...) 行374 + 0x3 C++
Really.dll!CShockwaveFlash::LoadMovie(long layer=0, const char * url=0x10034ad4) 行317 + 0x21 C++
Really.dll!CReallyApp::Add_Flash(tagPOINT pt={...}) 行674 C++
Really.dll!CReallyApp::WndProc(HWND__ * hWnd=0x000506f6, unsigned int message=273, unsigned int wParam=32772, long lParam=0) 行493 C++/**********************出错的OLE代码:
//////////////////////////////////////////
// CWnd invoke helpers for OLE Control wrappersvoid AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
void* pvRet, const BYTE* pbParamInfo, ...)
{
ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least) if (m_pCtrlSite == NULL)
return; va_list argList;
va_start(argList, pbParamInfo);
m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,
argList);
va_end(argList);
}/**********************异常提示:
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。/**********************输出:
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
DllTestSdk.exe 中的 0x77e53887 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012e59c 。
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
DllTestSdk.exe 中的 0x77e53887 处最可能的异常: Microsoft C++ exception: COleException @ 0x0012e59c 。
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。
DllTestSdk.exe 中的 0x7c239fd7 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000050 时发生访问冲突 。我需要一个安全的可以在只有一个HWND的情况下可以使用FLASH的方法,谢谢!
com的优越就不多说,使用atl开发com方便而快捷,并且具有size小,dependency少的特点。vc++的import 编译支持更是对com开发的巨大支持。闲话休说,这就开始吧。
一.flash组件
1.atl com appwizard创建新项目"atlflash",选择dll类型。
2.加入atl object "flash"
insert -> new atl object
选择object中的simple object,
short name:“flash”
3.接口添加method “play”
参数为:[in]bstr bstrfile,[in]long hinstance,[in]long hwnd
4.在cflash类中加入:
private:
hwnd m_hwnd;//视频窗口句柄
5. 实现play方法。
stdmethodimp cflash::play(bstr bstrfile, long hinstance, long hwnd)
{
try{
m_hmciwnd=(hwnd)hwnd;
_bstr_t file(bstrfile);
m_hmciwnd=::mciwndcreate((hwnd)hwnd,(hinstance)hinstance,
ws_popup¦ws_visible¦
mciwndf_noplaybar¦
mciwndf_nomenu,
(char *)file); rect rect;
int sx,sy;
::getwindowrect(m_hmciwnd,&rect);
sx=(::getsystemmetrics(sm_cxscreen)
-rect.right+rect.left)/2;
sy=(::getsystemmetrics(sm_cyscreen)
-rect.bottom+rect.top)/2;
//窗口居中
::setwindowpos(m_hmciwnd,hwnd_topmost,sx,
sy,0,0,swp_showwindow¦swp_nosize);
g_nlength=mciwndgetlength(m_hmciwnd);
mciwndplay(m_hmciwnd);
settimer(m_hmciwnd,1,50,timerproc);
}catch(...)
{
atltrace("error:%ul",::getlasterror());
}
return s_ok;
}
6.flash.cpp中实现timerproc,用于关闭视频窗口。
long g_nlength;
void callback timerproc(
hwnd hwnd, // handle of window for timer messages
uint umsg, // wm_timer message
uint idevent, // timer identifier
dword dwtime // current system time
)
{
long nlength;
bool bescape=::getkeystate(vk_escape)&0x0100;
nlength=mciwndgetposition(hwnd);
//视频放完,或点击esc键,关闭视频窗口
if((nlength>=g_nlength)¦¦(bescape)){
killtimer(hwnd,idevent);
mciwndend(hwnd);
mciwndclose(hwnd);
mciwnddestroy(hwnd);
}
};
7.stdafx.h中加入
#include <vwf.h>
项目设置中加入“vwf32.lib”库,
打开项目设置中c++,c++language中的enable error handling
编译,一切ok。
二,组件的使用。
1.创建一个mdi或sdi项目"flashclient"
2.stdafx.h中加入
#import “atlflash.dll” no_namespace
flashcient.cpp中加入
struct _initcom{
_initcom(){::coinitialize(null);}
~_initcom(){::couninitialize(); }
}__initcom;
3.cflashclientview加入
private:
iflashptr pflashserver;
4.cflashclent::oninitialupdate()加入
_bstr_t file("sample.avi");
pflashserver->play( file,(long)::afxgetinstancehandle(),(long)this->getsafehwnd());
5.编译,一切ok。