WinCE中串口驱动及接口函数介绍

作者:ARM-WinCE

 

WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图:

 

       串口驱动本身分为MDD层和PDD层。MDD层对上层的Device Manager提供了标准的流设备驱动接口(COM_xxx)PDD层实现了HWOBJ结构及结构中若干针对于串口硬件操作的函数指针,这些函数指针将指向PDD层中的串口操作函数。DDSI是指MDD层与PDD层的接口,在串口驱动中实际上就是指HWOBJPDD层会传给MDD层一个HWOBJ结构的指针,这样MDD层就可以调用PDD层的函数来操作串口。

       微软针对于串口驱动提供了参考源代码,可以在下面的目录下找到:”/WINCE600/PUBLIC/COMMON/OAK/DRIVERS/SERIAL”。

   串口驱动的结构也就是这样了,下面介绍相关的驱动中的接口。

1. HWOBJ结构 

    在串口驱动中,HWOBJ结构中的函数实现了对串口硬件的操作,并在MDD层被调用。可以说,该结构描述了串口设备的所有特性,先来介绍一下该结构,具体定义如下:
typedef struct __HWOBJ
{  
ULONG BindFlags;  
DWORD dwIntID;  
PHW_VTBL pFuncTbl;
} HWOBJ, *PHWOBJ;

BindFlags:用于控制MDD层如何来处理IST,具体值如下:           

                       THREAD_IN_PDD:MDD层不处理,中断在PDD层处理。           

                       THREAD_AT_INIT:在驱动初始化的时候,MDD层启动IST。           

                       THREAD_AT_OPEN:在驱动被Open的时候,MDD层启动IST。

dwInitID: 系统的中断号 pFuncTbl: 指向一个PHW_VTBL结构,该结构中包含一个函数指针列表,这些函数指针指向串口硬件操作函数,用于操作串口。

 

[css] view plaincopy
  1. typedef struct __HW_VTBL   
  2.   
  3.     {  
  4.   
  5.     PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext);  
  6.   
  7.     ULONG (*HWDeinit)(PVOID pHead);  
  8.   
  9.     BOOL (*HWOpen)(PVOID pHead);  
  10.   
  11.     ULONG (*HWClose)(PVOID pHead);  
  12.   
  13.     ULONG (*HWGetBytes)(PVOID pHead, PUCHAR pTarget, PULONG pBytes);  
  14.   
  15.     PVOID (*HWGetRxStart)(PVOID pHead);  
  16.   
  17.     INTERRUPT_TYPE (*HWGetIntrType)(PVOID pHead);  
  18.   
  19.     VOID (*HWOtherIntrHandler)(PVOID pHead);  
  20.   
  21.     VOID (*HWLineIntrHandler)(PVOID pHead);  
  22.   
  23.     ULONG (*HWGetRxBufferSize)(PVOID pHead);  
  24.   
  25.     VOID (*HWTxIntrHandler)(PVOID pHead);  
  26.   
  27.     ULONG (*HWPutBytes)(PVOID pHead, PUCHAR pSrc, ULONG NumBytes, PULONG pBytesSent);  
  28.   
  29.     BOOL (*HWPowerOff)(PVOID pHead);  
  30.   
  31.     BOOL (*HWPowerOn)(PVOID pHead);  
  32.   
  33.     VOID (*HWClearDTR)(PVOID pHead);  
  34.   
  35.     VOID (*HWSetDTR)(PVOID pHead);  
  36.   
  37.     VOID (*HWClearRTS)(PVOID pHead);  
  38.   
  39.     VOID (*HWSetRTS)(PVOID pHead);  
  40.   
  41.     BOOL (*HWEnableIR)(PVOID pHead, ULONG BaudRate);  
  42.   
  43.     BOOL (*HWDisableIR)(PVOID pHead);  
  44.   
  45.     VOID (*HWClearBreak)(PVOID pHead);  
  46.   
  47.     VOID (*HWSetBreak)(PVOID pHead);  
  48.   
  49.     BOOL (*HWXmitComChar)(PVOID pHead, UCHAR ComChar);  
  50.   
  51.     ULONG (*HWGetStatus)(PVOID pHead, LPCOMSTAT lpStat);  
  52.   
  53.     VOID (*HWReset)(PVOID pHead);  
  54.   
  55.     VOID (*HWGetModemStatus)(PVOID pHead, PULONG pModemStatus);  
  56.   
  57.     VOID (*HWGetCommProperties)(PVOID pHead, LPCOMMPROP pCommProp);  
  58.   
  59.     VOID (*HWPurgeComm)(PVOID pHead, DWORD fdwAction);  
  60.   
  61.     BOOL (*HWSetDCB)(PVOID pHead, LPDCB pDCB);  
  62.   
  63.     BOOL (*HWSetCommTimeouts)(PVOID pHead, LPCOMMTIMEOUTS lpCommTO);  
  64.   
  65.     BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);  
  66.   
  67. } HW_VTBL, *PHW_VTBL;  

 这些函数将在PDD层实现,用于实际的串口硬件操作。

 

2. MDD层API

MDD层向上提供了流设备接口,这部分代码微软已经实现,用于管理串口。虽然我们不需要实现这部分,但是还是对相应的接口做个简单介绍。

 

2.1HANDLE COM_Init(ULONG Identifier)

       初始化串口设备,该函数通过读取注册表获得串口设备号,并获得相应的HWOBJ的结构指针,通过该指针调用PDD层的硬件初始化函数初始化串口。

Identifier:如果驱动被设备管理器加载,那么这个参数将包含一个注册表键值在” HKEY_LOCAL_MACHINE/Drivers/Active”路径下。如果驱动是通过调用RegisterDevice函数来加载的,那么这个值等于dwInfo的值。在COM_Init中,会先打开该键值,用返回的句柄来查询DeviceArrayIndex值,并根据该值获得PDD层的HWOBJ结构指针。

 

2.2 BOOL COM_Deinit(void)

       卸载串口设备,该函数中主要做了一些释放资源的操作。也可以被DeregisterDevice函数调用。

 

2.3 HANDLE COM_Open(HANDLE pContext, DWORD AccessCode, DWORD ShareMode)

       打开串口设备。应用程序调用CreateFile函数打开串口时,该函数会被调用。

       pContextCOM_Init函数返回的Handle

       AccessCode:设置访问模式,比如共享读或者是读写模式。

       ShareMode:在参数从应用程序中的CreateFile函数中传来,表示是否支持独自占有。

 

2.4 BOOL COM_Close(DWORD pContext)

       关闭串口设备。应用程序调用CloseHandle函数关闭串口时,该函数会被调用。

       pContext:该参数为COM_Open函数返回的Handle

 

2.5 ULONG COM_Read(HANDLE pContext, PUCHAR pTargetBuffer, ULONG BufferLength, PULONG pBytesRead)

       读串口数据。应用程序调用ReadFile函数读串口的时候,该函数被调用。

       pContextCOM_Open函数返回的Handle

       pTargetBuffer:指向一个用于存放读到数据的Buffer

       BufferLengthpTargetBuffer指向的Buffer的大小。

       pBytesRead:实际读到的数据的大小。

 

2.6 ULONG COM_Write(HANDLE pContext, PUCHAR pSourceBytes, ULONG NumberOfBytes)

       写串口数据。应用程序调用WriteFile函数写串口的时候,该函数被调用。

       pContextCOM_Open函数返回的Handle

       pSourceBytes:指向一个Buffer,该Buffer包含要写入串口的数据。

       NumberOfBytes:要写入串口的数据的大小。

 

2.7 BOOL COM_PowerUp(HANDLE pContext)

       该函数主要用于串口设备从suspend模式恢复到正常模式。

       pContext:串口设备的Handle

 

2.8 BOOL COM_PowerDown(HANDLE pContext)

       该函数主要用于串口设备从正常模式进入suspend状态。

       pContext:串口设备的Handle

 

2.9 BOOL COM_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DOWRD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)

       该函数主要实现了一些串口的IO控制,他会被应用层的一些串口函数调用来获得或者设置串口的状态。

       dwOpenDataCOM_Open函数返回的Handle

       dwCodeI/O控制操作码。

       pBufIn:传入的Buffer

       dwLenIn:传入的Buffer的大小。

       pBufOut:传出的Buffer

       dwLenOut:传出的Buffer的大小。

       pdwActualOut:实际传出的数据的大小。

    对于串口驱动来说,COM_IOControl函数非常有用,应用程序通过调用COM_IOControl函数并传入不同的操作码,实现了控制串口的功能。这里列举一些操作码如下:

操作码

解释

IOCTL_SERIAL_CLR_DTR

设置串口的DTR管脚为低

IOCTL_SERIAL_CLR_RTS

设置串口的RTS管脚为低

IOCTL_SERIAL_DISABLE_IR

禁用串口的红外模式

IOCTL_SERIAL_ENABLE_IR

启用串口的红外模式

IOCTL_SERIAL_GET_COMMSTATUS

清除串口设备的异常标记并返回当前状态

IOCTL_SERIAL_GET_DCB

获得串口的DCB结构

IOCTL_SERIAL_GET_MODEMSTATUS

获得当前Modem的控制寄存器值

IOCTL_SERIAL_GET_PROPERTIES

重新获得当前串口设备的硬件属性

IOCTL_SERIAL_GET_TIMEOUTS

获得串口设备的读写超时

IOCTL_SERIAL_GET_WAIT_MASK

获得等待事件标记掩码

IOCTL_SERIAL_IMMEDIATE_CHAR

在发送数据前,先发送一个特定的字符

IOCTL_SERIAL_PURGE

清除串口中的输入输出Buffer,也可以中止未进行的读写操作

IOCTL_SERIAL_SET_BREAK_OFF

串口通讯从中断状态恢复

IOCTL_SERIAL_SET_BREAK_ON

设置串口为中断状态,停止发送接收数据

IOCTL_SERIAL_SET_DCB

设置串口的DCB结构

IOCTL_SERIAL_SET_DTR

设置串口的DTR管脚为高

IOCTL_SERIAL_SET_QUEUE_SIZE

目前,在微软的MDD层代码中没有支持

IOCTL_SERIAL_SET_RTS

设置串口的RTS管脚为高

IOCTL_SERIAL_SET_TIMEOUTS

设置串口的读写操作超时

IOCTL_SERIAL_SET_WAIT_MASK

设置等待事件标记掩码

IOCTL_SERIAL_SET_XOFF

软件流控模式下,终止数据传输

IOCTL_SERIAL_SET_XON

软件流控模式下,启动数据传输

IOCTL_SERIAL_WAIT_ON_MASK

等待一个与事件掩码中匹配的事件

       上述的操作码,很多都会被应用程序调用,看看MDD层中的实现,其中一些也是调用了PDD层下的函数来完成对串口硬件的设置。

3. PDD层API

       PDD层的函数主要是实现了对串口硬件的操作,函数比较多,不过还是都说一下吧:

3.1 PHWOBJ GetSerialObject(DWORD DeviceArrayIndex)

       该函数返回一个指向HWOBJ结构的指针,该结构包含了相关硬件接口函数的函数指针。

       DeviceArrayIndex:串口索引号

 

3.2 VOID HWClearBreak(PVOID pContext)

       清除串口中断状态,用于串口从中断状态恢复。

       pConText:指向HWInit函数返回的指针。

 

3.3 VOID HWClearDTR(PVOID pContext)

       设置串口的DTR管脚为低

       pConText:指向HWInit函数返回的指针。

 

3.4 VOID HWClearRTS(PVOID pContext)

       设置串口的RTS管脚为低

       pConText:指向HWInit函数返回的指针。

 

3.5 VOID HWClose(PVOID pContext)

       关闭由HWInit函数初始化的设备

       pConText:指向HWInit函数返回的指针。

 

3.6 VOID HWDeinit(PVOID pContext)

       当设备驱动被卸载的时候,该函数被调用。

       pConText:指向HWInit函数返回的指针。

 

3.7 VOID HWDisableIR(PVOID pContext)

       禁用串口的红外模式

       pConText:指向HWInit函数返回的指针。

 

3.8 VOID HWEnableIR(PVOID pContext)

       启用串口的红外模式

       pConText:指向HWInit函数返回的指针。

 

3.9 VOID HWGetCommProperties(PVOID pContext, LPCOMMPROP pCommProp)

       重新获得当前串口设备的硬件属性。

       pConText:指向HWInit函数返回的指针。

       pCommProp:指向一个COMMPROP结构,该结构描述硬件设备的属性,比如最大波特率,停止位以及流控模式等。

 

3.10 INTERRUPT_TYPE HWGetIntrType(PVOID pContext)

       获得当前的中断类型。返回值可以是INTR_NONEINTR_LINEINTR_RXINTR_TXINTR_MODEM,这些值在Serhw.h中定义。

       pConText:指向HWInit函数返回的指针。

 

3.11 VOID HWGetModemStatus(PVOID pContext, PULONG pModemStatus)

       获得Modem的状态。

       pConText:指向HWInit函数返回的指针。

       pModemStatusModem的状态。

 

3.12 ULONG HWGetRxBufferSize(PVOID pContext)

       获得串口硬件接收Buffer的大小。

       pConText:指向HWInit函数返回的指针。

 

3.13 PVOID HWGetRxStart(PVOID pContext)

       返回硬件接收Buffer的起始位置。

       pConText:没有被使用。

 

3.14 ULONG HWGetStatus(PVOID pContext, LPCOMSTAT lpStat)

       获得硬件状态信息。

       pConText:指向HWInit函数返回的指针。

       lpStat:指向COMSTAT结构,该结构描述硬件状态。

 

3.15 PVOID HWInit(ULONG Identifier, PVOID pMDDContext, PHWOBJ pHWObj)

       初始化串口硬件设备。

       Identifier该驱动的键值,从MDD层传到PDD层。

       pMDDContext:指向MDD层串口相关信息,从MDD层传给PDD层。

       pHWObj:指向HWOBJ结构。

 

3.16 BOOL HWIoctl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)

       执行I/O控制

       dwOpenDataCOM_Open函数返回的Handle

       dwCodeI/O控制操作码。

       pBufIn:传入的Buffer

       dwLenIn:传入的Buffer的大小。

       pBufOut:传出的Buffer

       dwLenOut:传出的Buffer的大小。

       pdwActualOut:实际传出的数据的大小。

 

3.17 VOID HWLineIntrHandler(PVOID pContext)

       线路状态信息中断处理函数

       pContext:指向HWInit函数返回的指针。

 

3.18 VOID HWModemIntrHandler(PVOID pContext)

       该函数检测Modem状态,并对相关中断进行处理。

       pContext:指向HWInit函数返回的指针。

 

3.19 BOOL HWOpen(PVOID pContext)

       打开串口设备,可以在该函数中打开串口硬件供电。

       pContext:指向HWInit函数返回的指针。

 

3.20 VOID HWOtherHandler(PVOID pContext)

       该函数已经被HWModemIntrHandler取代,实现与HWModemIntrHandler一样。

       pContext:指向HWInit函数返回的指针。

 

3.21 BOOL HWPostInit(PVOID pContext)

       该函数在COM_Init中被调用,但是在串口数据,硬件以及IST初始化后备调用。

       pContext:指向HWInit函数返回的指针。

 

3.22 BOOL HWPowerOff(PVOID pContext)

       串口硬件进入Suspend模式。

       pContext:指向HWInit函数返回的指针。

 

3.23 BOOL HWPowerOn(PVOID pContext)

       串口硬件从Suspend模式恢复到工作模式。

       pContext:指向HWInit函数返回的指针。

 

3.24 VOID HWPurgeComm(PVOID pContext, DWORD fdwAction)

       清除串口硬件buffer的信息。

       pContext:指向HWInit函数返回的指针。

       fdwAction

                        PURGE_TXABORT:终止写操作立即返回。

                        PURGE_RXABORT:终止读操作立即返回。

                        PURGE_TXCLEAR:清空写Buffer

                        PURGE_RXCLEAR:清空读Buffer

 

3.25 ULONG HWPutBytes(PVOID pContext, PUCHAR pSrc, ULONG NumberOfBytes, PULONG pBytesSent)

       通过写数据到硬件中来直接发送数据。

       pContext:指向HWInit函数返回的指针。

       pSrc:指向要发送的数据Buffer

       NumberOfBytes:要发送的数据长度。

       pBytesSent:实际发送的数据长度。

 

3.26 VOID HWReset(PVOID pContext)

       复位串口硬件。

       pContext:指向HWInit函数返回的指针。

 

3.27 ULONG HWRxIntrHandler(PVOID pContext, PUCHAR pTargetBuffer, PULONG pByteNumber)

       接收数据中断处理函数。

       pContext:指向HWInit函数返回的指针。

       pTargetBuffer:接收数据Buffer

       pByteNumber:接收数据Buffer的大小。

 

3.28 VOID HWSetBreak(PVOID pContext)

       设置串口为中断状态,停止发送接收数据。

       pContext:指向HWInit函数返回的指针。

 

3.29 BOOL HWSetCommTimeouts(PVOID pContext, LPCOMMTIMEOUT lpCommTO)

       设置串口操作超时时间。

       pContext:指向HWInit函数返回的指针。

       lpComTO:指向一个超时的结构,其中包括读写超时。

 

3.30 BOOL HWSetDCB(PVOID pContext, LPDCB pDCB)

       设置串口硬件设备信息。

       pContext:指向HWInit函数返回的指针。

       pDCB:指向DCB结构,该结构描述相关的串口硬件设置信息。

 

3.31 VOID HWSetDTR(PVOID pContext)

       设置串口的DTR管脚为高

       pContext:指向HWInit函数返回的指针。

 

3.32 VOID HWSetRTS(PVOID pContext)

       设置串口的RTS管脚为高

       pContext:指向HWInit函数返回的指针。

 

3.23 VOID HWTxIntrHandler(PVOID pContext, PUCHAR pSourceBuffer, PULONG pByteNumber)

       串口发送中断处理函数。

       pContext:指向HWInit函数返回的指针。

       pSourceBuffer:发送数据Buffer

       pByteNumber:最大能够发送的数据的大小。函数返回时,指向实际发送的数据的大小。

 

3.24 VOID HWXmitComChar(PVOID pContext, UCHAR ComChar)

       发送一个字符

       pContext:指向HWInit函数返回的指针。

       ComChar:要被发送的字符。

 

 

 

    上述这些函数不一定串口驱动中都会被用到,根据具体要求来实现吧。在这里我还要给自己找条退路,由于本人并未实现上面的所有函数,一些是通过读文档和看源码分析得来,而且本人水平有限,如果有错误的地方,请谅解并欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】ABP源码分析四十六:ABP ZERO中的Ldap模块

通过AD作为用户认证的数据源。整个管理用户认证逻辑就在LdapAuthenticationSource类中实现。 LdapSettingProvider:定义LDAP的setting和提供DefautValue。主要提供配置访问AD数据库的账号信息。 LdapSettings/ILdapSettings:通过settingManager获取LDAP settings Ab…

广州.NET俱乐部 VSTS活动报道

首先要感谢广州.NET开发人员一直以来对俱乐部的支持,另外,要感谢微软鞠海洋提供的丰富礼品。本次活动主线是VSTS,俱乐部的讲师黎波为我们讲解了VSTS的基本组成和功能分布,让我们大家从宏观上了解VSTS。在活动上,微软的…

【转】ABP源码分析四十七:ABP中的异常处理

ABP 中异常处理的思路是很清晰的。一共五种类型的异常类。 AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationException异常就可以,无须做额外处理。这类异常往往是需要维护人员介入分析的。 其他四个异常都在A…

当你累了,准备放弃时,看看这个吧!!!

在别的空间看到这篇文章,感觉说的很有道理,故转过来,送给所有还在坚持的朋友~~ 每个人都背负着一个沉重的十字架,在缓慢而艰难地朝着目的地前进。 途中,有一个人忽然停了下来。 他心想:这个十字架实在是…

梦游4k

本来还打算晚上看案例分析的, 觉得是在太困了就上床眯会儿, 一睁眼,呀,怎么就快九点了呢。 可怜我一晚上的宝贵时间就这么被我浪费过去了。 从床上蠕动到椅子上,努力扒开眼睛看看BBS, 还是跑步好啊。 跑步好…

ajax里绑定框,Select级联菜单,用Ajax获取Json绑定下拉框(jQuery)

需求类似这样 ↓ ↓ ↓--》 菜单A发生变化,动态取数据填充下拉菜单B。JS代码如下:$(function () {$("#TeamSelect").change(function () {var tid $("#TeamSelect option:selected").val();$.ajax({url: "/ajax/ajaxGetMa…

【转】CANOPEN总线的相关问题点整理分享*****

CANopen 是一个基于 CAN(控制局域网)串行总线系统和 CAL(CAN 应用层)的高层协议。CANopen 通讯协议 CiA DS-301 包括周期和事件驱动型通讯,不仅能够将总线负载减少到最低限度,而且还能确保极短的反应时间。…

WinCE系统字体的设置

作者:ARM-WinCE 确实很久没有写Blog了,感觉有些对不住曾经看我blog的朋友。刚从美国回来,由于项目原因,春节都在美国工作,现在有点时间,先写一篇简单的,介绍一下WinCE字体的设置。 WinCE系统字体…

js脚本点击按钮显示文字_JSBOX脚本聊天神器

聊天神器是一个基于JSBox的脚本JSBox 是一个可以用来运行 JavaScript 脚本的 iOS 应用,你可以通过他来执行标准的 JavaScript 脚本 这种执行不是指跑在浏览器上,而是执行在一个完全原生的环境,效率很高。并且我们提供了很多 iOS 原生的接口&a…

轻松实现无刷新三级联动菜单[VS2005与AjaxPro]

最近做一些网站程序,经常要用到多个下拉菜单选择,看了介绍开始用AjaxPro这个控件,感觉效果不错。以前使用过MagicAjax,很久不用了忘记了,最麻烦的就是在虚拟目录的时候比较麻烦,呵呵,在网上也有…

【转】为什么博士叫PhD?

作者:李青影 链接:https://www.zhihu.com/question/20950602/answer/1028008012 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 在填学历的时候遇到过这个问题,明明毕业证书上写…

dnf服务器合并信息,卤蛋带你看韩服!全体服务器合并改版信息互通

‍各位好久不见啊!我是卤蛋 本期为各位介绍韩服合区后的全部改动~在韩服合并服务器之前 一共有八个服务器:但是在合区之后大区依然存在,不过服务器是互通的在哪个大区创建角色基本上没什么区别 这样做避免了角色混乱的问题如何切换频道呢&…

java 无法执行export 命令_模块中的export、import以及复合模式的使用方法

export:规定模块对外接口①默认导出:export default Test(导入时可指定模块任意名称,无需知晓内部真实名称)②单独导出:export const name "Bruce"③按需导出:export { age, name, sex }(推荐)④改名导出&a…

【转】在ASP.NET Web API 2中使用Owin基于Token令牌的身份验证

基于令牌的身份验证 基于令牌的身份验证主要区别于以前常用的基于cookie的身份验证,基于cookie的身份验证在B/S架构中使用比较多,但是在Web Api中因其特殊性,基于cookie的身份验证已经不适合了,因为并不是每一个调用api的客户端都…

number 限制最长数字_Java源码阅读-Number

抽象类Number是BigDecimal, BigInteger,Byte,Double,Float,Integer, Long, Short类的父类,实现了java.io.Serializable接口,这个接口以后再说。其中的抽象方法主要是基本数据类型的转换,这些方法都可能涉及到四舍五入和截断Integer类实现了父…

(JavaScript)实现在客户端动态改变Treeview节点的选中状态

Asp.net 2.0 中的 Treeview 非常好用,而且轻便。但在使用过程中,往往会发现一些不够人性化的地方。例如您要设计一棵树,里面放置了一些收藏的网址。在这棵树中,节点的 SelectAction 只有 Expand 和 NavigateUrl 状态,也…

【转】Castle中AdditionalInterfaces用法介绍

首先见下图(图一),其中FooController是一个没有实现任何Interface的空类。需要实现的效果是:通过FooController对象调用FooService的Do方法。设置这一不常见的场景主要是为了说明Castle中AdditionalInterfaces的用法。 这个场景诡…

ffmpeg添加到环境变量_Windows + MSVC环境编译ffmpeg

实测成功环境: WIN7 VS2013 FFmpeg4.3 和 WIN10 VS2019 FFmpeg4.3(N-98819-ge2589ac)源码下载FFmpeg源码依赖工具MSYS2​YASM下载安装MSYS2; 下载YASM,将文件名改为yasm.exe,将它所在的目录加入到环境变量中。配置头文件和库搜索路径以下几种方法任选一种1.使用…

【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive

导读 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactoring , 02 年的 P of EAA ,还是 03 年的 Enterprise Integratio…

wince编译报错

新建了工程,加入之前完整的BSP,怎么也编译不过,提示: [01:0000009403:ERRORE] NMAKE : U1073: dont know how to make C:\WINCE600\OSDesigns\xyjhht30\xyjhht30\Wince600\SMDK6410_ARMV4I\cesysgen\sdk\lib\ARMV4I\retail\ddraw.…