比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。 Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。 一般来说,DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows 在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。 在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。 DLL现在越来越容易编写。Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。 一、导出和导入函数的匹配 DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。 简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。这样,一个特殊的DLL可以既有导入函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。 在DLL代码中,必须像下面这样明确声明导出函数: __declspec(dllexport) int MyFunction(int n); 但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在应用程序方面,要求像下面这样明确声明相应的输入函数: __declspec(dllimport) int MyFuncition(int n); 仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。 二、与DLL模块建立链接 应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。 采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。 显式链接方式对于集成化的开发语言(例如VB)比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用 Win32 的LoadLibary函数,并指定DLL的路径作为参数。LoadLibary返回HINSTANCE参数,应用程序在调用 GetProcAddress函数时使用这一参数。GetProcAddress函数将符号名或标识号转换为DLL内部的地址。假设有一个导出如下函数的 DLL文件: extern “C” __declspec(dllexport) double SquareRoot(double d); [...]
November 16, 2009 – 11:40 am
DirectSound编程的入门介绍,通过实例讲解了如何利用DirectSound最基本的功能—–播放音频,并提供了DirectSound播放音频文件的两种方式(Static buffer 和Streaming buffer )
September 29, 2009 – 11:54 am
DM642上使用异常现象,建立一个TCP监听端口,当向这个tcp端口连接时失败,DM642程序在CCS上提示的打印信息:00008.106 SBNew: Buffer OOM00008.681 SBNew: Buffer OOM00009.298 SBNew: Buffer OOM
整个工程原先是可用,最近不知做什么修改才出现了这个问题,怀疑是NDK相关的库被修改了,查了一遍,无果。
还是得从打印信息出发,经查证,SBNew是一个内存分配函数,在stack.lib的sb.c文件里实现,SBNew: Buffer OOM就意味着内存分配不成功。
依据网络堆栈的思路调整了堆栈大小,最终把问题确定下来了,原来我们使用的socket buffer被修改得太大了,之前调试把buffer改成 0×100000,改回8704就ok了!
// Change our socket buffer size to 8704 bytesrc =8704;//8760;// 0×100000;//CfgAddEntry( hCfg, CFGTAG_IP, CFGITEM_IP_SOCKBUFMAX, CFG_ADDMODE_UNIQUE, sizeof(uint), (UINT8 *)&rc, 0 );
TI提供的DM642 NDK存在不少问题,使用时要十分小心!
August 25, 2009 – 12:59 am
preg_match的使用方法
(PHP 4, PHP 5)
preg_match – Perform a regular expression match
Description
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )
Searches subject for a match to the regular expression given in pattern .
August 23, 2009 – 5:47 pm
正则表达式快速入门教程目录
1. 本文目标
2. 如何使用本教程
3. 正则表达式到底是什么东西?
4. 入门
5. 测试正则表达式
6. 元字符
7. 字符转义
8. 重复
9. 字符类
10. 分枝条件
11. 反义
12. 分组
13. 后向引用
14. 零宽断言
15. 负向零宽断言
16. 注释
17. 贪婪与懒惰
18. 处理选项
19. 平衡组/递归匹配
August 19, 2009 – 4:46 pm
下午,负责TI DM3x系列(DM355\DM365)全球PM与我们公司沟通了DM355与DM365方面的开发问题,这是我们成为TI第三方 以来第一次与TI人员的正式会面。
August 17, 2009 – 10:51 am
The TMS320DM355 device can encode and decode 720p movies, but a very high DDR bandwidth is needed to display them simultaneously on an HD display. There are a few prerequisites and restrictions in the system to make sure that there are no display glitches during this scenario. This application report is written based on current hardware and software baselines. The restrictions or limitations can be changed according to future software optimizations and hardware improvements.
August 15, 2009 – 9:23 pm
mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。
不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。
August 15, 2009 – 6:56 pm
定义和用法
implode() 函数把数组元素组合为一个字符串。
语法
implode(separator,array)
参数 描述
separator 可选。规定数组元素之间放置的内容。默认是 “”(空字符串)。
array 必需。要结合为字符串的数组。
说明
虽然 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。
August 11, 2009 – 3:36 pm
CMD 的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关。CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件长时间的引申发展,已经变得非常简洁(不知道TI文档有没有详细CMD配置说明)。
August 10, 2009 – 10:44 pm
The DM365 CCS ubl is in the flash_utils.tar.gz which you can find after you install psp_02_10_xx_xx.bin.
1. Update the CCS ARM cgtools to V4.5.0. You can download it here. Then install it.
2. Change the ARM cgtools used in CCS.
more….
August 7, 2009 – 10:23 pm
DateTime.ToString()所有的模式:
0 MM/dd/yyyy 08/22/2006
1 dddd, dd MMMM yyyy Tuesday, 22 August 2006
2 dddd, dd MMMM yyyy HH:mm Tuesday, 22 August 2006 06:30
wp_list_categories 标签的用法。
作用:
·不是连接到某个分类的
·排列分类
·不显示上一次更新(上次更新后,在当前类内)
·可以无序排列
·可以显示日志数量
·可以只显示制定某个分类
·可以指定分类说明or标题
·可设置无Feed或Feed使用图标
·没有任何exlude类,并包括所有类别? (’include’ => is not shown above)
·缩进?等级?排列样式
·分类标题名单?
·没有限制的sql施加? (’number’ => 0 is not shown above)
August 5, 2009 – 12:00 am
Username: Team FCN!
key:0359d06510103500
wordpress的query_posts()之强大,让人叹为观止!
学习制作Wordpress主题,非常有用函数代码整理。
C#截屏代码(截取全屏幕)。代码很简单,使用Bitmap类的程序来获取屏幕图像,同时显示在对话框上,如果自己建立对话框,稍微做些改动就能直接编译通过。