解决wmv文件在vista下无法播放的问题

因为工作关系,同事解决wmv文件经过libasf解析重组后在vista下无法播放问题。
处理后的wmv在windows xp下工作正常,但是在vista平台,wmp显示无法识别此文件。比较微妙,可以大致推断,应该是对wmv文件处理后,丢失了某些必要的属性,而这些属性在windows xp下不需要,而vista对wmv格式要求比较严格,因此出现了问题。
在MS 的ASF spec 文档的描述中,有几个object是必须的:
HEADER OBJECT
FILE PROPERTIES OBJECT
STREAM PROPERTIES OBJECT
HEADER EXTENSION OBJECT
四个Object是必须的,看看原来的wmv解析重组代码,没有HEADER EXTENSION OBJECT这个对象,好的,问题应该在这里!
首相将HEADER EXTENSION OBJECT对象中所有的子对象都加入到处理后的文件中,测试通过!随后小心翼翼的进行HEADER EXTENSION OBJECT子对象的删除,经过一番简单的 重试-测试 之后, 最终只要保存HEADER EXTENSION OBJECT对象中的Extended Stream Properties Object即可。
好了,我们的ASF头部由原来的5K,降低到了600字节。

boost之-intrusive_ptr说明

介绍:
intrusive_ptr类模板内部保存一个指针,这个指针所指对象必须具有嵌入式的内部计数。
intrusive_ptr可以为开发人员提供一个针对这个指针的上层封装,这样用户使用intrusive_ptr进行
拷贝,赋值等相关操作,内部计数会自动的进行addref(增加引用)或release(减少引用)的操作。
为开发人员提供编码简单,异常安全的特性。
因此instrusive_ptr存在的意义如下:
1, 支持某些操作系统中原有的具有引用计数的指针
2, 方便用户操作具有引用技术的指针
3, 保证代码异常安全
注意,由于各种对象在实现内部计数时,可能接口函数不同,如A class可能使用add_ref和release_ref,
B class可能使用addref和release,每个开发人员有自己不同的编码风格,命名风格。因此intrusive_ptr
要求这些类的作者必须在boost的全局命名空间中提供两个函数:
intrusive_ptr_add_ref 用来增加计数
intrusive_ptr_release 用来减少计数
依据这个要求,A class必须在A的定义后,定义下面的函数:

void intrusive_ptr_add_ref(A * p)
{
p->add_ref();
}
void intrusive_ptr_release(A * p)
{
p->release_ref();
}

intrusive_ptr的定义中会调用这两个函数,稍后我们查看intrusive_ptr的代码时可以看到。
intrusive_ptr代码片段:

namespace boost {
template<class T> class intrusive_ptr {
public:
typedef T element_type;
intrusive_ptr(); // never throws
intrusive_ptr(T * p, bool [...]

class template member function explicit specialization definition

最近在写一个小工具,我所掌握的tempalte知识,以及boost,还有一些网络编程模式,最近学的东西都一股脑的给下锅了。
今天使用最近写的一个ini操作模板类,多个cpp引入inicfg.hpp,链接时vs.net2003提示open函数在多个obj中定义。
这可是折磨死我了!下面是解决过程:
看到编译器提示很长的信息,顿时慌了手脚,c++ 中调试template最为苦恼的就是调试信息非常的冗长。
我在此犯了一个错误,没有认真的看链接错误信息!
首先怀疑是inicfg.hpp的头文件是否有#ifndef #define #endif信息,检测没有问题。
然后怀疑是否vs.net2003不支持模板的这种include,但是不可能stl的vector,list等对象都用的好好的。
随后怀疑是否模板具现化中,在两个cpp产生了同样的具现体,导致的错误?用vector进行测试,两个cpp都include vector,
然后定义两个相同的vector对象. a.cpp中 std::vector<int> v1; b.cpp中 std::vector<int> v2。编译,链接都很正常。
因此这个疑虑也排除了。
最后发现是我在inicfg.hpp中使用了class member function explicit specialization definition,类模板成员函数的显示特化,参看<c++ primer>中关于类模板的说明。对于成员函数的特化必须采用这样的形式:

//inicfg.hpp
template <typename strtype>
class inicfg
{
public:
bool open();
}
template <typename strtype>
bool inicfg::open()
{
return false;
}
// 声明一个特化体
template <> bool inicfg<std::string>::open();
//inicfg.cpp
// 定义特化体
template <>
bool inicfg<std::string>::open()
{
//do some op…
return true;
}
将这两个文件添加到工程,编译,链接一切正常!