时间:13:47 2010-9-14
编程环境:
0S:WINCE R3
开发工具:VS2008
注意:编写程序与开发工具是没有什么关联的,只与你的SDK有关。
page:
背景:
由于最近要编写一个摄像头程序,其要求能够:录像,回放,拍照。
此文主要介绍编程环境的建立开始之前的问题。
问题:
在XP上使用DIRECT SHOW开发软件,其需要另外下载DIRECT SHOW的SDK,那么在WINCE上使用
DirectShow开发软件,其是否需要另外下载DIRECTSHOW的SDK呢。
解法:
在WINCE上不要另外下载DIRECTSHOW的SDK, WINCE 当中包括了,只要在定制SDK的时候注意将其加载进行就可以了,XP的SDK当中没有包括DIRECTSHOW,所以要去载。
问题:
WINCE 上的DSHOW(DIRECT SHOW) 的SDK与XP上DSHOW 的SDK很不同呀,如XP上有CBaseClass且还要我们自己去编译成LIB文件,在WINCE 当中只有一个Strmiids.lib 文件,
在XP上编写DV的程序其需要三个接口:
IAMExtDevice, IAMExtTransport,IAMTimecodeReader其的定义包括在XPrtDefs.h。
但在WINCE 的SDK当中但并没有查找到XPrtDefs.h。那怎么样办呢。
我通过查找MSDN
PAGE:
http://msdn.microsoft.com/en-us/library/dd389318%28VS.85%29.aspx
发现
IAMExtDevice, IAMExtTransport,IAMTimecodeReader
其声明在Strmif.h当中。
实现包含在Strmiids.lib,更多细节建议你去查看MSDN.
[感处]
XP与WINCE其的DIRECTSHOW的编程模型与接口是一样的,只是一些头文件不同呢。在WINCE当中编程只要加一个Dshow.h 头文件就可以了。而在XP上编程其要添加其它头文件。
我们还是可以将XP上DIRECTSHOW的经验应用于WINCE上,只要注意一些细节,如头文件,
CSLID,IID
思考:
其为什么还是可以呀,因为DIRECTSHOW其只是框架与其硬件与语言是没有关联的。相当于
#include<stdio.h>
void main(){
printf("hello world \n");
}
在WINCE ,XP上均是可以运行的(注意要重新编译一次)
有人可能会对于printf("hello world \n"); 感到不解:为什么不是printf(L"hello world \n");
WINCE 其是一个UNICODE系统,像"hello world \n" 这样的字符串怎么可能编译通过呢。
WINCE 的UNICODE : 其是说明:其只与WINCE 的API有关,像有一些API当中的参数需要接受字符串,
此参数的类型只有UNICODE的类型(如:WCHAR ,CONST WCHAR *)没有ANSI版本的,但在XP上其就有两个版本。
printf其与C RUNTIME库 其并不是WINCE 的API.
问题:
对于WINCE 能否完成支持标准的DIRECTSHOW感到不相信。
解法:
WINCE 其确实支持( 没有讲完全,因为自己还没有GOOGLE,不能下结论)DREICTSHOW, 但我们要注意到,DIRECTSHOW其能否真正有作用,还是要看硬件提供是否实现了DRIECTSHOW的接口。
就像我们在程序当中动态的加载一个DLL文件,虽然不能够编译通过( 因为有.H. LIB),但其没有实现文件,运行的时候,就没有效果了。
我们可以先熟悉XP上的DIRECTSHOW编程,以后当有机会在WINCE上写代码时候,或在XP上写代码时候,才不会紧张。不要因为WINCE不支持就不去学习,这样只会让自己很被动。
问题:
DIRECTSHOW其定义操作接口IAMExtDevice, IAMExtTransport,IAMTimecodeReader(举其是因为,我要编写一个DV录像,拍照,预览的程序,二是因为其使用的场合有限,如果生辟的东西的实现了,那应该也实现大多数了)
但其是在哪里实现,由谁实现的呢。
解法:
我们可以通过远程查看注册表的工具(WINDOWS CE REMOTE REGISTRY EDITOR),来看目标机器上注册了哪些FILTER, 为什么要查FILTER呢。
因为DIRECTSHOW的功能的划分是以FILTER为单位的,其有哪些FILTER其就实现了DIRECTSHOW的哪些功能,我们使用这些FILTER才会有效果。没有这些FILTER的注册,就像加载DLL文件一样,虽然能够编译
通过,但其运行没有效果。
问题:
FILTER 其与操作接口(IAMExtDevice)之间的关系。
解法:
FILTER 其是一个DLL文件,其内部是一个C++类,此类要通过继承这个接口,此实现这个接口,
用户通过C++类的CLSID,来创建C++对象,然后就可以访问接口了。这和我们使用多态和工厂模式的原理是一样的
。
MS定义标准,其就是定义这些接口,我们能不能使用成功,还要看硬件厂商是否实现了这些接口,硬
件厂商其就是实现这些FILTER.表面是这样,我们初学者这样认为是不会有问题。其与真正做法的不同在于: 对
于FILTER是一个类,对于一个类的组织也可以由MS来实现,这如果由硬件厂商来完全,一来工作量,二来重复
,MS其对于一些操作硬件的函数,定义成空函数,这些由硬件厂商来实现,
注意:
“定义成空函数,这些由硬件厂商来实现” 这是我的想法,我感觉这样理解对于我们初学者也可以,至于
真正情形,我不是十分清楚,也希望哪位工程师补充一下。
补充:
在WINCE 的SDK当中也有