• 不要将返回值类型为LPCTSTR的函数值直接赋值给CString对象,比如CString s=Fun();Fun为返回LPCTSTR的函数,而是要这样写:CString s=CString(Fun());否则s可能出现乱码,不知为何。

  • 通过%s格式化字符串时,不要使用LPCTSTR的参数,而是强制转为CString,比如 s.Format(_T("%s"),CString(lpctstrString));否则s也可能出现乱码。

  • 通过%s格式化字符串时,不要使用CDuiString的参数,而是强制转为CString,比如 s.Format(_T("%s"),CString(duiString));否则s也可能出现乱码。

  • duilib控件的float属性为true时,SetFixedWidth和SetFixedHeight可能无效,需要设置为false。在CDuiDlgPrintMandtQR中,希望设置二维码宽度时下面的CBarcodeLabelUI绘制宽度能跟着改变,如果其属性float设置为true则不能达到目的。

  • 应用程序无法正常启动(0xc000007b)

    SysWOW64目录下的dll并非确保是64位的,实际上从这里拷贝出来的msvcr120.dll是32位的。 那么到哪里去找真正的64位的dll呢?在这里 vs2015安装目录\Microsoft Visual Studio 14.0\Team Tools\Performance Tools,这里有正统的dll 此外,原则上x86的也应该从该处的x86目录拷贝,毕竟这是才是面向分发的。 更换msvcr120.dll后,问题排除。

    发布的时候,需要vc或mfc环境,到你的开发工具的目录的Microsoft Visual Studio 14.0\VC\redist目录去找dll就可以,取系统目录找就不对了

    数据已截断

    存入数据库时产生的ODBC异常,异常返回值1021。这种情况是由于数据表字段的长度超过了255,而CRecordset的派生类的函数DoFieldExchange中如下函数:

    • void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName, CString& value, int nMaxLength = 255, int nColumnType =SQL_VARCHAR);
    • void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255);
    参数nMaxLength缺省设置成了255所致,将其改为MAXINT或实际的表字段长度。
  • 冗余代码问题

    由于一个鼠标操作可能引发多个DUILIB的消息,不要在不同的消息中重复做相同的事务操作。在网络版或云板中也许没有大问题,最多就是慢一些,但是在单机版时可能会引发异常。

    案例:

    在CDlgPrintTemplateSetup打印模板设置对话框中,由于取消了保存按钮,所以每当用户选择一个模板时就自动保存用户选择,开始在消息DUI_MSGTYPE_IE_ENDCELLEDIT和DUI_MSGTYPE_ITEMSELECT中都调用了OnCellChanged,在该函数中保存用户的选择,在网络版和云版中没问题,单机版时出现了问题。用户一个鼠标选择触发了两次保存,导致数据库begintrans后committrans之前,再一次调用begintrans,从而引发异常。