2006年11月14日
#
大家都做过基于MFC Dialog的应用程序,我更喜欢用CFrameWnd派生类来实现应用程序的主框架,我不太喜欢SDI模板,又是Document又是View的,MFC背着你干了很多事情!
好了,说说问题,大家如果作过基于CFrameWnd的主窗口,可能会发现主窗口会有一个3D的边框,一开始我用ModifyStyle发现不行,那就在PreCreateWindow里面吧!呵呵,也不管用,跟进MFC的代码,发现CFrameWnd::PreCreateWindow会重置dwExStyle,好了看代码吧!
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT
&
cs)
{
BOOL bRet
=
CFrameWnd::PreCreateWindow(cs);
if
(bRet)
{
cs.dwExStyle
&=~
WS_EX_CLIENTEDGE;
return
TRUE;
}
return
FALSE;
}
2006年9月27日
#
好象还是有点不开心,大概搞TMD 软件每天都有解决不完的问题,尤其象我这种不知道天高地厚的人更是如此!
牢骚要发,也得继续搞,屏幕捕获的算法终于优化出来了,下一步是用ASF Container把数据包装起来,效果应该不错,我有点搞不明白的是AVI的索引为什么那么慢,数据量大是一方面,关键还是数据组织上存在缺陷,不如MPEG4!
如果顺利,应该在10月份就可以拿出一个象样的版本的录制软件了,应该可以毙掉一批垃圾录屏软件了,这是我希望看到的!
下面的事情还很多,每个都够啃的,我还得多些耐心,少些焦虑,也希望认识一些朋友大家一块合作!
2006年9月18日
#
我要开始征途了,也许前面是坦途或荆棘,这已经都不重要了,更多在于我的机会也许只能在此征途体现了,如果失败,也许就意味着我在IT行业的彻底颠覆,我认了!
我把自己blog定为行胜于言,意义就在这里,我的计划开始了,从今天开始!
2006年7月24日
#
大家开发网络程序,经常要连接其他主机,如果在xp上运行,一定会提示你,只有选择解除阻止才能实现正常的网络连接.那么有没有办法在防火墙的例外列表里面通过编程的方式加入自己的程序呢?
当然有了,不然就不要介绍了
xp的系统目录下面有个hnetcfg.dll就是这个编程接口,头文件是netfw.h,初始化代码如下:
INetFwProfile* m_pFireWallProfile=NULL;
HRESULT hr
=
S_FALSE;
INetFwMgr
*
fwMgr
=
NULL;
INetFwPolicy
*
fwPolicy
=
NULL;
FW_ERROR_CODE ret
=
FW_NOERROR;
try
{
if
( m_pFireWallProfile )
throw
FW_ERR_INITIALIZED;
//
Create an instance of the firewall settings manager.
hr
=
CoCreateInstance( __uuidof(NetFwMgr), NULL, CLSCTX_INPROC_SERVER, __uuidof( INetFwMgr), (
void
**
)
&
fwMgr );
if
( FAILED( hr ))
throw
FW_ERR_CREATE_SETTING_MANAGER;
//
Retrieve the local firewall policy.
hr
=
fwMgr
->
get_LocalPolicy(
&
fwPolicy );
if
( FAILED( hr ))
throw
FW_ERR_LOCAL_POLICY;
//
Retrieve the firewall profile currently in effect
hr
=
fwPolicy
->
get_CurrentProfile(
&
m_pFireWallProfile );
if
( FAILED( hr ))
throw
FW_ERR_PROFILE;
}
catch
( FW_ERROR_CODE nError)
{
ret
=
nError;
}
if
( fwPolicy )
fwPolicy
->
Release();
if
( fwMgr )
fwMgr
->
Release();
return
ret;
将程序名称加入例外列表:
WinXPSP2FireWall::AddApplication( const wchar_t* lpszProcessImageFileName, const wchar_t* lpszRegisterName )
{
FW_ERROR_CODE ret = FW_NOERROR;
HRESULT hr;
BOOL bAppEnable;
BSTR bstrProcessImageFileName = NULL;
BSTR bstrRegisterName = NULL;
INetFwAuthorizedApplication* pFWApp = NULL;
INetFwAuthorizedApplications* pFWApps = NULL;
try
{
if( m_pFireWallProfile == NULL )
throw FW_ERR_INITIALIZED;
if( lpszProcessImageFileName == NULL || lpszRegisterName == NULL )
throw FW_ERR_INVALID_ARG;
// First of all, check the application is already authorized;
FW_ERROR_CODE nError = this->IsAppEnabled( lpszProcessImageFileName, bAppEnable );
if( nError != FW_NOERROR )
throw nError;
// Only add the application if it isn't authorized
if( bAppEnable == FALSE )
{
// Retrieve the authorized application collection
hr = m_pFireWallProfile->get_AuthorizedApplications( &pFWApps );
if( FAILED( hr ))
throw FW_ERR_AUTH_APPLICATIONS;
// Create an instance of an authorized application
hr = CoCreateInstance( __uuidof(NetFwAuthorizedApplication), NULL, CLSCTX_INPROC_SERVER, __uuidof(INetFwAuthorizedApplication), (void**)&pFWApp);
if( FAILED( hr ))
throw FW_ERR_CREATE_APP_INSTANCE;
// Allocate a BSTR for the Process Image FileName
bstrProcessImageFileName = SysAllocString( lpszProcessImageFileName );
if( SysStringLen( bstrProcessImageFileName ) == 0)
throw FW_ERR_SYS_ALLOC_STRING;
// Set the process image file name
hr = pFWApp->put_ProcessImageFileName( bstrProcessImageFileName );
if( FAILED( hr ) )
throw FW_ERR_PUT_PROCESS_IMAGE_NAME;
// Allocate a BSTR for register name
bstrRegisterName = SysAllocString( lpszRegisterName );
if( SysStringLen( bstrRegisterName ) == 0)
throw FW_ERR_SYS_ALLOC_STRING;
// Set a registered name of the process
hr = pFWApp->put_Name( bstrRegisterName );
if( FAILED( hr ))
throw FW_ERR_PUT_REGISTER_NAME;
// Add the application to the collection
hr = pFWApps->Add( pFWApp );
if( FAILED( hr ))
throw FW_ERR_ADD_TO_COLLECTION;
}
}
catch( FW_ERROR_CODE nError )
{
ret = nError;
}
SysFreeString( bstrProcessImageFileName );
SysFreeString( bstrRegisterName );
if( pFWApp )
pFWApp->Release();
if( pFWApps )
pFWApps->Release();
return ret;
}
2006年7月22日
#
现今的即时通信软件都实现了音频、视频互通的功能,这得益于视频编码技术的应用,目前市面上Microsoft 有MPEG4 v3,DIVX,XVID等等不一而足,但目前市场上好象对用户桌面录制技术关注不够,因为大家知道桌面图象和运动图象是不一样的,这也造成优秀的桌面录制软件非常缺乏。
为什么要讨论桌面压缩呢?因为起应用领域非常广泛,第一他用在课件制作技术方面,可以完整还原教师的培训过程,尤其是操作类培训的课程更有实际意义。第二桌面共享依赖于桌面压缩技术,更好的压缩效率和质量将使得低带宽下的高质量桌面共享成为可能?
大家都知道桌面压缩技术的实现可以基于RLE或HUFFMAN或其他更高级的算法进行实现,如何实现更为优秀的回放效果和质量,是目前这些方法所不能解决的。
同时,为了兼容应用需求,录制的输出格式也有很多要求,比如实现网上点播、录制成ASF格式等。
在最近一段时间的开发过程和实现过程中,我尝试了一些新的方法,取得了一些突破,但离自己最终的想法还有一定距离,如果大家感兴趣的话,可以到我的网站下载:屏踪幻影,由于目前软件还不是非常完善,所以目前还无法公开代码,在后续的时间里我会公开程序结构和内部代码实现。
希望大家对我的软件实现提出建议和修改意见。
2006年7月6日
#
音量调节是实现互联网语音通信的重要环节,很多公司自行实现了有关音量调节的向导,无奈水平各异,千差万别.微软公司也给出了解决方案,不过是在RTC实现,需要安装RTC运行时.
今天给大家介绍的使用DirectX中有关DirectVoice中的实现来解决我们的问题:
//http://www.handytech.cn
#include <dvoice.h>
#pragma comment(lib,"dxguid.lib")
void CTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
IDirectPlayVoiceTest* pTest;
HRESULT hr=CoCreateInstance(CLSID_DirectPlayVoiceTest,NULL,CLSCTX_INPROC_SERVER,IID_IDirectPlayVoiceTest,(void**)&pTest);
if(SUCCEEDED(hr))
{
pTest->CheckAudioSetup(&DSDEVID_DefaultVoicePlayback,&DSDEVID_DefaultCapture,NULL,DVFLAGS_ALLOWBACK);
pTest->Release();
}
OK上面的代码就调用了DirectVoice中的实现,大家看看效果!