2005年05月18日

太久没更新了. :(

2004年11月26日

GDB调试指南:http://www.lslnet.com/linux/books/gdb_guide.pdf

www.loveunix.net 里面有相当多的资料


以后会继续添加 ^_^

2004年11月17日

想看更多的流媒体资源或其他的资源:可以看看:http://www.umsky.com/knowledge/Streaming/

voip书籍:
http://www.chinagk.org/technology/IPTech/001.htm
全球VOIP联盟
http://www.microvoip.com/thdmain01.htm


RTP库:
http://research.edm.luc.ac.be/jori/jrtplib/jrtplib.html



DVB资源网站:
http://www.dvbcn.com



老古开发网:(里面有很多关于单片机和嵌入式等等,各个方面的资料).
http://www.laogu.com/download.aspx?page=28


智能未来:(有些音视频的编码资料下载)
http://www.try2it.com/fir.asp?o=5


陆其明的站点:(流媒体开发)
http://hqtech.nease.net/Document.htm


DirectShow Developer Q & A
http://www.gdcl.co.uk/q_and_a.htm



G729A的免费库:
http://www.voiceage.com/codecsite/openinit_g729eula.php


其他一些源代码的:
http://cvs.winehq.com/cvsweb/wine/dlls


Dialogic OKI <-> G.726 transcoders
http://freespace.virgin.net/joe.carter/codecs/


微软BLOG集:
http://blogs.msdn.com/


一些电子书集下载:
http://leon83.com/leon/download/index.jsp?ct=book%2FNetwork&image=false


H.245协议的VC++实现
http://www.sic.org.cn/lunwen/004.htm


饮水思源 — 精华区文章阅读
http://bbs.sjtu.edu.cn/bbsanc?path=/groups/GROUP_3/C/.index


在线翻译的网站:
http://www.worldlingo.com/wl/translate


RFC文档目录
http://www.leepig.com/rfc/


C++, Java, C#, OO, GP的网站
http://www.allaboutprogram.com/


开源的即时通信协议jabber项目:
http://www.jabber.org/software/libraries.php


 


用于MPEG-4视听流的RTP负载格式
http://www.umsky.com/knowledge/Streaming/RFC3016-cn


MPEG4IP: Open Source, Open Standards, Open Streaming
http://mpeg4ip.sourceforge.net/


主要研究:Internet real-time and multimedia services and protocols, ubiquitous computing, mobile systems, quality of service, modeling and analysis of computer-communication networks, operating systems, network security.

http://www.cs.columbia.edu/~hgs/



SIP and RTP Stack 相关:



基于SIP STACK 的开源项目:
http://www.vovida.org/


H323的开源:
www.openh323.org


在Vovida的基础上实现自己的SIP协议栈
http://www.ctiforum.com/technology/Voip/2003/08/voip0802.htm


vchelp上的:基于SIP的软终端项目预研
http://www.copathway.com/copathway/project_view.asp?prj_id=265



jrtplib: C++; License: Free; Homepage: http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html


Common Multimedia Library: from UCL London, includes RTP stack; C; License: Free; Homepage: http://www-mice.cs.ucl.ac.uk/multimedia/software/common/


ortp: C; License: LGPL; Homepage: http://www.linphone.org/ortp/; without RTCP, from linphone


GNU ccRTP: C++; License: GPL (with linking exception); Homepage: http://www.gnu.org/software/ccrtp/


LIVE.COM Streaming Media: C++; License: LGPL; Homepage: http://live.com/liveMedia/


Morgan RTP DirectShow Filters: C++; License: ?; Homepage: http://www.morgan-multimedia.com/RTP/; based on liveMedia library


RTP from vovida.org: C++; License: Free; Homepage: http://www.vovida.org/protocols/downloads/rtp/


RTPlib: RTP library from Lucent Technologies/Cloumbia University; C; License: Non-exklusive source code license; Homepage: http://www-out.bell-labs.com/project/RTPlib/


librtp: C; License: GPL; Homepage: http://gphone.sourceforge.net/template.php3?page=librtp; from Gnome-o-phone



SIP Stacksdissipate:  Homepage: http://www.div8.net/dissipate/; The original dissipate by Billy Biggs.


dissipate2: GPL; Homepage: http://www.wirlab.net/kphone/; A enhanced dissipate, is part of the kphone distribution.


GNU osip;LGPL; Homepage: http://www.gnu.org/software/osip/; Also known as libosip. Note: The interface of osip has been changed and from now on it will be called osip2!


GNU eXosip;  Homepage: http://savannah.nongnu.org/projects/exosip/; The extensible osip: “…It aims to implement a simple high layer API to control the SIP for sessions establishements and common extensions. Once completed, this eXtended library should provide an API for call management, messaging and presence features….


SIP from vovida.org: C++; License: Vovida Software License; Homepage: http://www.vovida.org/protocols/downloads/sip/



RTP ApplicationsRAT – Robust Audio Tool; Homepage: http://www-mice.cs.ucl.ac.uk/multimedia/software/rat/


JMF – Java Media Framework: Can receive and send RTP streams; Homepage: http://java.sun.com/products/java-media/jmf/


MP3/RTP Plugin for Winamp: Homepage: http://www.live.com/multikit/winamp-plugin.html


Vomit – Voice over Missconfigured Internet Telephones:  Homepage: http://vomit.xtdnet.nl


RTP Tools: Several RTP utilities from the Columbia University; Homepage: http://www.cs.columbia.edu/IRT/software/rtptools/


UDP Packet Reflector/Forwarder: A tiny tool which forwards or reflects UDP packets. You can also add delay and packet loss. Very useful if you want to test RTP applications. Homepage: http://www.cs.ucl.ac.uk/staff/s.bhatti/teaching/z02/reflector.html.


 


SIP Phone (User Agent, Softphone, Proxy)


Ubiquity User Agent: Java based SIP Client for Windows, very useful, you have to register (free) to get an license; Homepage: http://www.ubiquity.net/useragent.php


Linphone: A SIP Softphone for Linux (GNOME), needs libosip ans oRTP; Homepage: http://www.linphone.org/


KPhone: A SIP Softphone for Linux (KDE); Homepage: http://www.wirlab.net/kphone/index.html


Vovida: Complete SIP Suite for Linux (Uaser Agent, Proxy, …), very, very big software contruct; Homepage: Vovida.org


Siphon: Linux SIP Softphone; Homepage: http://siphon.sourceforge.net/index.html


AVAZ SIP Phone: Cool looking SIP Phone for Windows, crashes very often at my PC, but works well on my friends PC; Homepage:http://www.avaz.com/products/software/sip/index.html


EZ-Phone (Evaluation Version): SIP Phone for Windows; Homepage: http://www.hssworld.com/voip/download.htm


MySIP: SIP User Agent from Siemens; Homepage: http://www.mysip.ch/



SJPhone: SIP and H.323 Softphone for Windows, Linux and PocketPC from: http://www.sjlabs.com/. The configuration for SIP is a little bit tweaky. And there must not be another SIP client running on port 5060 or the SJPhone won’t work.


instant xpressa: The software version of the xpressa SIP phone from pingtel: http://www.pingtel.com/appdev.jsp; A really impressive SIP phone with a lot of features. Can be extended with Java programs, but no free version available.


xphone: A SIP client for Windows and Windows CE, http://xphone.xten.net/. The beta version is free.


SIPPS: SIP softphone with answering machine and a lot of features, but, IMHO, a not very intuitive user interface, which should be better in the next version (try it yourself).http://www.sippstar.com/. A Demo for testing is available.


 



 

2004年11月15日


//使用priority_queue:可以时vector中保存的数,做顺序/倒序的排列(利用自定义的比较函数 )
//对于那些在使用非常注重顺序的地方,可以说简单,方便,效率高。
//在实时音频流的接收端,利用priority_queue,做抖动处理
//将非常简单。可以采用类似的下面的处理方法,对收到seq number
//做排序处理



#include <iostream>
#include <queue>
using  namespace std;


typedef struct _tagTest
{
 int seq;
 bool operator <  (_tagTest &a) //重载运算符号
 {
  if(seq < a.seq)
   return true;
  return false;
 }


 bool operator >= (_tagTest &a) ////重载运算符号
 {
  return !(*this<a);
 }
}test;



typedef struct _tagcompare //自定义比较的函数
{
 bool operator() (test *a, test *b)
 {
  return *a >= *b;
 }
}compare;


typedef std::priority_queue<test *, std::vector<test * >, compare > TEST_QUEUE;


int main(int argc, char* argv[])
{
 printf(“Hello World!\n”);


 TEST_QUEUE test_queue;
    test* t= new test;
 t->seq = 1;
 test_queue.push(t);
 cout<<t->seq<<” “;


 


 test* t1= new test;
 t1->seq = 30;
 test_queue.push(t1);
 cout<<t1->seq<<” “;


 test* t2= new test;
 t2->seq = 5;
 test_queue.push(t2);
 cout<<t2->seq<<” “;


 test* t3= new test;
 t3->seq = 3;
 test_queue.push(t3);
 cout<<t3->seq<<” “;


   cout<<endl;
 for(int i=0; i = test_queue.size();i++)
 {
  test* pt = test_queue.top();
  test_queue.pop();
  cout<< pt->seq<<” “; //结果为:1,3,5,30
  delete pt;
  pt = NULL;
  
 }


 char c;
 cout<<endl<<”please entry any key…”<<endl;
 cin>>c;


 


 return 0;
}
2004年11月15日

2004年10月05日

在VC中使用property关键字

以前从来没有在VC++中使用过,这个关键字。在很多书里面也没有讲过这个关键字。
偶尔在看一个C++ BULIDER一个关于打印端口的程序时,看到其中使用了
_property这样一个关键字。
于是出于本能去MSDN中查找property.在里面看到一些怎么使用该关键字用法:
MSDN中资料:
Microsoft Specific —>

__declspec( property( get=get_func_name ) ) declarator

__declspec( property( put=put_func_name ) ) declarator

__declspec( property( get=get_func_name, put=put_func_name ) ) declarator

This attribute can be applied to non-static “virtual data members” in a class or structure definition. The compiler treats these “virtual data members” as data members by changing their references into function calls.

When the compiler sees a data member declared with this attribute on the right of a member-selection operator (“.” or “->“), it converts the operation to a get or put function, depending on whether such an expression is an l-value or an r-value. In more complicated contexts, such as “+=“, a rewrite is performed by doing both get and put.

This attribute can also be used in the declaration of an empty array in a class or structure definition. For example:

__declspec(property(get=GetX, put=PutX)) int x[];
The above statement indicates that x[] can be used with one or more array indices. In this case, i=p->x[a][b] will be turned into i=p->GetX(a, b), and p->x[a][b] = i will be turned into p->PutX(a, b, i);

//
怎么使用该属性呢?
比如:
一个打印控制类;
打印的最基本的端口有:数据端口(0×378),控制端口(0×37a),状态的端口(0×379),要对那些端口直接读写,除了借助第三方的驱动(如果自己不会写驱动/或者不想写的话,因为在2000/XP中是无法对端口直接读写的)。
于是在一个类中,定义三个缓冲,来存放你读写端口的值(这里利用:port95nt这个免费的第三方的驱动程序可以google下载):
于是类似下面形式
CLpt
{

    //存放寄存器中的内容缓冲
 BYTE m_LPTData;
 BYTE m_LPTControl;
 BYTE m_LPTStatus;
public:
         CLpt();
  ~CLpt();

 //写读数据寄存器
 void write_data_reg(BYTE data)
 { 
        DlPortWritePortUchar(0X378,data);

 }
 BYTE read_data_reg()
      {
          return DlPortReadPortUchar(0X378,data);

 }

       //其他的具体内容类似就不写了。
 //写读控制寄存器
 void write_control_reg(BYTE control);
 BYTE read_control_reg();

 //写读状态寄存器
 void write_status_reg(BYTE status);
 BYTE read_status_reg();
public:

 ////在这里像MSDN中说的一样使用property这个关键子。
        //这样就可以通过data,status,control这写属性,来访问(读/写)端口的内容了。是不是感觉比较方便呢。
 //当用拥护: i = CLpt::Data 它将调用CLpt::read_data_reg();
 //当用户: CLpt::Data = i; 它将调用CLpt::write_data_reg(i);
   __declspec(property(get=read_data_reg, put=write_data_reg)) BYTE Data;
   __declspec(property(get=read_status_reg, put=write_status_reg)) BYTE Status;
   __declspec(property(get=read_control_reg, put=write_control_reg)) BYTE Control;

};

比如 :
CLpt* m_plpt =new CLpt;
往里面写入数据0×56就可以这样:m_plpt->Data =  0×56;
要读出里面的数据就可以这样:BYTE m_bdata =m_lpt->Data; //^_^这样感觉方便多了。


 

2004年09月28日

关于浮点的运算要注意一点:

一日计算进度条的位置.得到的都是0,甚是奇怪,原来,浮点做怪。

类似:
 for(int x= 0; x<128; x++)
{
     int  pos = (100/127*x);
}
那日计算不小心按照了以前学数学的写法,写下了pos = (100/127*x)。-_-
结果当然是pos = 0;-_-

浮点转整型在做怪。由于转整型是,整型数据会截尾。因此。
100/127 如果直接转整型,自然为0,0*X =0 -_-;

修改成:
double db = (dobule)(100/127);
 for(int x= 0; x<128; x++)
{
     int  pos = (db*x);
}

或者是:
 for(int x= 0; x<128; x++)
{
     int  pos = (100*x/127);
}

基本上就没问题了^_^

还有转型截尾的问题:

double a=1.001;
int aaa;
double g=(double)(a*1000);
如果直接将转:
aaa = g; //aaa = 1000
aaa = (int)(g+0.000001); //aaa = 1001;

关于浮点运算的文章:
浅谈浮点型“(1.1+1.2)!=2.3” http://www.cnblogs.com/oldjacky/archive/2004/06/20/14367.aspx

www.google.com  ^_^

 

2004年09月01日

一种全屏显示子窗口的方法:
1:基本想法:
  让子窗口脱离父窗口。用SetWindowPos重新设置窗口的大小。
  还原时重新设置子窗口的父窗口。重新设置窗口的大小
 主要代码如下:
//m_hWnd为子窗口的句柄
     static BOOL m_FullScreen = true;
      HWND hwndParentSave;
                //获得整个屏幕的大小
  int cx = ::GetSystemMetrics(SM_CXSCREEN);
  int cy = ::GetSystemMetrics(SM_CYSCREEN);
               
                //获得子窗口的风格
  long style = ::GetWindowLong(m_hWnd,GWL_STYLE);

                //获得子窗口的父窗口
  HWND hwndparent = ::GetParent(m_hWnd);
             
              //判断其父窗口是否存在。
  if(!::IsWindow(hwndparent))
  {
                  //不存在表示已经全屏,重新设置子窗口的风格(主要是加入了WS_CHILD风格
    ::SetWindowLong(m_hWnd,GWL_STYLE,(style | WS_CHILD));
      //重新设置其父窗口(刚才保存的父窗口 
                   ::SetParent(m_hWnd,hwndParentSave);
  }
  else
  {     //父窗口存在,去掉其子窗口的风格
   style &= ~WS_CHILD;
                     //重新设置要脱离父窗口的子窗口的风格
   ::SetWindowLong(m_hWnd, GWL_STYLE, style);
                     //重新设置子窗口的父窗口为NULL(脱离父窗口)
   ::SetParent(m_hWnd,NULL);
                     //把父窗口保存起来
                  hwndParentSave =hwndparent ;
                     把子窗口的大小保存起来
   ::GetWindowRect(m_hWnd,&rc);    
  }
  if(m_FullScreen)
  { 
                     //全屏设置大小 
   ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,cx,cy,0);
   m_FullScreen = false; 
  }
  else
  {
         //还原重新设置大小
   ::MoveWindow(m_hWnd,rc.left,rc.top,rc.Width(),rc.Height(),0);
   m_FullScreen = true;
  }

2004年08月24日

 

 

在程序销毁时释放资源,往往比较容忽略在另外一个线程可能还在使用的资源而先行被销毁,导致程序在退出时崩溃.

比如:
你在主线程中分配了一块内存区域:
//假设其中不存在资源竞争的问题.(否则要用同步控制,嫌麻烦,暂时不做这种处理了).
char* pBuf = new char[10];

然后在另外一个后台线程中:
BOOL bEnd = FA.SE//全局或者静态变量.
DWORD WINPAI CMyClass::OnThreadFunc(LPVOID lpvoid)
{
    CMyClass* pTempMyClass = (CMyclass*)lpvoid;
   
    while(!bEnd)
  {
        WaitForSingleObject(m_hWaitEvent,INFINITE);
    if(bEnd == TRUE)
   {
      break;
    }
       //在这里对这个pBuf进行一些操作.
 pTempMyClass->pBuf……..

  }
  return 1;
}
 
假设你需要从别的地方得到数据,然后在开始运行这个线程,在正常情况下,你执行完你所需要的操作后就这样:
bEnd = TRUE;
SetEvent(m_hWaitEvent);
让这个线程自然的结束.

于是你在程序退出销毁时:
可能这样做:
delete [] pBuf;
pBuf = NULL;
if(m_hThread && m_hWaitEvnet)
{
    bEnd = TRUE;
    SetEvent(m_hWaitEvent);
    WaitForSingleObject(m_hThread,1000);
    CloaseHandle(m_hThread);
    m_hThread  = NULL;
    CloseHandle(m_hWaitEvent);
    m_hWaitEvent = NULL;
}
上面这是在正常情况一种处理,方法.还做了当没有得到数据数据时,当程序退出时,你也能正确的让这个线程自然退出.

但是有一种情况:
 当某种时机下:
你得到数据,于是你开始运行这个线程.
当线程刚刚执行完if(bEnd == TRUE)这句的时候,于是你发出退出程序的命令,于是你做上面的销毁动作。而恰好,你运行完
delete [] pBuf,pBuf = NULL;后,于是线程又恰好要执行你在线程对该pBuf的处理,于是问题出现.必然的要出现无效指针的错误。

怎么避免呢?
很简单销毁资源之前,先停止线程就能避免了.
比如:
if(m_hThread && m_hWaitEvnet)
{
    bEnd = TRUE;
    SetEvent(m_hWaitEvent);
    WaitForSingleObject(m_hThread,1000);
    CloaseHandle(m_hThread);
    m_hThread  = NULL;
    CloseHandle(m_hWaitEvent);
    m_hWaitEvent = NULL;
}

delete [] pBuf;
pBuf = NULL;

因此在多线程种要注意的是:当程序退出,销毁资源的时候,一定要最先退出其中跑起来的线程(线程的退出最好是自然的结束,不要强制的结束).

我在工作就碰见过这种情况:
当时在正常的情况:(一般都能得到数据的情况下,跑另外一个线程).线程一般都结束了。今天恰好跑到一种情况,在数据没有得到情况.我退出了程序.
程序老报错.当时没怎么注意,还以为是别的模块有错误。后来测试的时候,我只加载我一个模块测试,发现退出也有错.
一跟踪发现就是上述类似的问题。恰好在某种情况下就出来,而这种情况也许认为不会出现的,往往就出现了。:(

2004年08月16日

屏蔽media player 的右键菜单

采用子类化。替换窗口过程,拦截鼠标右键的消息。

static WNDPROC lpOldProc; //保存以前的窗口过程

WNDPROC  CTestMediaplayDlg::lpOldProc;

static LRESULT CALLBACK NewWindowProc(   /*新的窗口过程*/
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
);

/*替换窗口过程*/
lpOldProc = (WNDPROC)SetWindowLong(m_player.GetSafeHwnd(),GWL_WNDPROC,(long)NewWindowProc);

LRESULT CALLBACK CTestMediaplayDlg::NewWindowProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
)
{
        switch(uMsg) //处理右键
 {
 case WM_RBUTTONDOWN:
  TRACE(“TEST\n”);
  return 0;
 case WM_RBUTTONUP:
  TRACE(“TEST2\n”);
  return 0;
 default:
  break;
 }
 return CallWindowProc(lpOldProc,hwnd,uMsg,wParam,lParam); //还原以前的窗口过程

  }

2004年08月07日

Internet 软件分发单位是“软件包”,它由包含 .inf 文件或软件分发 (.osd) 文件(或两者都包括)
的 CAB 文件 (.cab) 所组成。一个分发单位也可以包含软件组件,如 ActiveX 控件 (.ocx)、.dll
文件、.exe 文件、Java 类文件或小程序。当 Web 页上 OBJECT 元素的 CODEBASE 特性引用包含
?.inf 文件的 CAB 文件时,Internet Explorer 3.0 和更新的版本将自动把 CAB 文件作为软件分发单位。

第一步:创建一个inf文件:
?INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。
一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,
与现有硬盘中文件版本号相同的文件不被下载。
要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,
请参考平台软件开发工具包(Platform SDK,)的设置和系统管理服务(Setup and System Management Services)
部分的\Setup API\Overview\INF Files目录下的内容。
下面就以我自己写的一个videoweb.dll为例子。在videoweb.dll中使用到:tdiio.dll,encoder.dll,decoder.dll,tdiio.ini,user.ini,
camer.ini,drivo.ini.
video.inf的例子:
;inf file for videoweb.dll
[version]
;version signature(same fot both NT and Win95) do not remove
signature=”$SCHICAGO$”
AdvancedINF=2.0

[Add.Code]
VideoWeb.dll=VideoWeb.dll
tdiio.dll=tdiio.dll
Decoder.dll=Decoder.dll
encoder.dll=encoder.dll
camer.ini=camer.ini
drvio.ini=drvio.ini
castel.ini=castel.ini
user.ini=user.ini
tdiio.ini=tdiio.ini

;needed DLL
[tdiio.dll]
file-win32-x86=thiscab
FileVersion=2,1,701,1
DestDir=11
RegisterServer=yes

[Decoder.dll]
file-win32-x86=thiscab
FileVersion=
DestDir=11
RegisterServer=yes

[encoder.dll]
file-win32-x86=thiscab
DestDir=11
RegisterServer=yes

;needed ini
[camer.ini]
file-win32-x86=thiscab
DestDir=10

[tdiio.ini]
file-win32-x86=thiscab
DestDir=10

[user.ini]
file-win32-x86=thiscab
DestDir=10

[drvio.ini]
file-win32-x86=thiscab
DestDir=10

[castel.ini]
file-win32-x86=thiscab
DestDir=10
;ActiveX dll
[VideoWeb.dll]
file-win32-x86=thiscab
clsid={4BDA0AA3-2164-44B7-8A88-208A145F51DC}
FileVersion=2, 0, 0, 1
DestDir=11
RegisterServer=yes

;end of INF file

下面解说一下上面的一些关键的东西:
关键字”file-win32-x86″ 指定平台是 x86。
file-win32-x86也可以指向一个url上的dll。比如:file-win32-x86=http://www.castelsz.com/xxx/xxx.dll
FileVersion:版本号(点右键看属性就可以得到,也可以没有)
DestDir:指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32;
?????? 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
clsid:指的是要安装控件的CLSID
RegisterServer:表示是否需要注册。
当然以上仅仅是在internet上分发软件时一个很简单的inf文件,还有更复杂的inf文件。请看SDK。

第二步:把video.inf, tdiio.dll,encoder.dll,decoder.dll,tdiio.ini,user.ini,
camer.ini,drivo.ini.放在一个文件夹中。
第三步:开始制作cab文件,我是用IExpress工具制作的(可以到wwww.newhua.com去下载pIExpres2工具),其实改工具就是使用了:cabarc这个VC5.0中带一个工具。
???? 1:选择创建新的自解压指令文件。
???? 2:选择仅创建压缩文件(ActiveX安装)
???? 3:点击添加把你要供别人下载的文件添加
???? 4:点击浏览 输入*.cab文件的存放地址(包含文件名)
???? 5:就随便了
好了制作完成。
现在在你的网页中使用该控件,当别人访问你的网页时,如果他的机子上没有你的控件,浏览器就会自动下载安装。因为你的控件可能没有获得签名
因此得在你的浏览器中把浏览器的安全级别降低。在internet 工具中选择安全,选择自定义。找到下载未签名的ActiveX控件。选择其下面的提示或者启用。
在网页中插入:

<OBJECT classid=clsid:4BDA0AA3-2164-44B7-8A88-208A145F51DC
codebase=”video.cab#version=2,0,0,1″
data=data:application/x-oleobject;base64,owraS2Qht0SKiCCKFF9R3AADAAA1SgAAZzQAAA==
id=Video1 style=”HEIGHT: 507px; WIDTH: 718px”></OBJECT>
codebase=”video.cab#version=2,0,0,1″
data=data:application/x-oleobject;base64,owraS2Qht0SKiCCKFF9R3AADAAA1SgAAZzQAAA==
id=Video1 style=”HEIGHT: 507px; WIDTH: 718px”>

该句.
注意:得把*.cab 文件你和的网页放在同一目录下。或者在codebase中指定*.cab的路径。

?