WPF调用C/C++DLL出现异常:System.StackOverflowException
一、问题描述
项目要求调用某公司的DLL链接库操作LED设备,要求使用WPF开发该应用程序。链接库为pArmSendQt.dll ,操作为:
【函数格式】
int SS_Send_Power_On (void)
【函数参数】
WPF调用C/C++DLL出现异常:System.StackOverflowException
一、问题描述
项目要求调用某公司的DLL链接库操作LED设备,要求使用WPF开发该应用程序。链接库为pArmSendQt.dll ,操作为:
【函数格式】
int SS_Send_Power_On (void)
【函数参数】
Entity Framework的全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架。早期被称为 ObjectSpace。它以新实体框架为特色。使得开发人员可以通过对象模型(而不是逻辑/关系数据模型)专注于数据。实体框架有助于将逻辑数据架构抽象为概念模型,并且允许以多种方式通过对象服务和名为“EntityClient”的新数据提供程序与概念模型交互。EntityFramework的主要特点:
EF使用概念层(ConceptualModels)、映射层(Mappings)和逻辑层(StorageModels)将逻辑数据库结构抽象化。使开发人员可以编写更少的数据访问代码,减少维护,将数据结构抽象化为更易于开展业务(标准化程度较低)的方式,并且有利于数据的持久性。同时这三层也是EF的核心——EDM(实体数据集)。
如果DLL接口的输入参数为char**,也就是字符数组的数组(即字符串数组),此时在C#声明中不能直接传递string[],传递的应该是通过Encoding类对这个string[]进行编码后得到的一个char[]。
如果DLL接口的输出参数为char**,也就是字符数组的数组(即字符串数组),此时在C#声明中应该使用byte[]来做参数。然后通过Encoding类对这个byte[]进行解码,得到字符串。如下例所示:
C++ DLL接口:
1 | long _stdcall USE_GetAgentGroupInfoEx( |
C#中的声明
由于软件的向下兼容,vs2010可以打开vs2008项目,但是vs2008打开vs2010时会出现一些错误提示。解决办法如下:
1.替换VS2010项目中SLN文件的
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
为
在项目中需要将datagrid这个控件转化成图像输出,思考了几种办法:
1.可以对屏幕截取,然后再根据控件相对于屏幕的坐标再次截取,即可取得控件截图。这种方法限制性很大,如图像的分辨率被限死,同时,如果控件不在屏幕中显示的话那么就无法进行截图。
2.查看datagrid源码,重新绘制图形。这个办法只要掌握,其实一劳永逸。只不过需要时间过长,略显复杂,项目中需要一种简洁的方法来操作。
3.有自带方法绘制控件。经过查阅资料,整理代码如下
1 | /// <summary> |
1.win7下右键计算机,点击管理,会发现不能打开,这会给配置服务等一些操作带来麻烦,解决这个问题只需要添加注册表信息:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{20D04FE0-3AEA-1069-A2D8-08002B30309D}shellManagecommand]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,25,00,25,00,73,00,79,
00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,00,25,00,25,00,5c,00,53,00,
59,00,53,00,54,00,45,00,4d,00,33,00,32,00,5c,00,63,00,6f,00,6d,00,70,00,6d,
00,67,00,6d,00,74,00,2e,00,6d,00,73,00,63,00,00,00
将其保存为reg格式,导入即可。
2.安装Office2010后有时会发现每次打开word等应用都会要求配置,需要等待很长时间,重新安装也不能解决,这时候只需要运行:
reg add HKCUSoftwareMicrosoftOffice14.0WordOptions /v NoReReg /t REG_DWORD /d 1
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
例如:
n = 9, k = 1, m = 5
【解答】
出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。
关于C#窗体间的数据传值的方法好几种,在项目中都各有应用,虽然简单,这里记录下来,分享给大家!
主窗体
1 | private void button_Click(object sender, System.EventArgs e) |
子窗体(Form2)
Aspx中使用cs中的函数及成员时需要注意该函数类型为protected或者public
Asp.net的服务端控件和客户端控件ID不见得一样。服务端控件在内网环境和后台环境下使用是很方便的。而HTML控件用于前台。物尽其用。
获取客户端控件ID方法: 服务端id.ClientID
document.getElementById(‘<%=TextBox1.ClientID%>’)
JQuery同理。
Aspx中asp标签的控件的css样式:CssClass=”…”,等同于HTML中class属性。也可以单独修改控件样式,但不建议这样做。会生成大量冗余代码。
控件的Attributes用于设置控件的额外属性。
Label渲染成Span,若设置了AssociateControlID属性,就渲染成label,且for属性为关联的控件id。
Literal不做任何渲染,就是文本。将其mode属性设置为encode后,可以自动对文本进行编码,防止xss漏洞。
TextBox控件的AutoPostBack属性为true时,当该控件失去焦点,就自动Post。ASP.net中要提交表单时最好使用_doPostBack()方法。
RadioButton渲染为 input type=”radio”, 通过GroupName进行分组。
Button等控件可以通过Command以及CommandName,CommandArgument来统一处理。
Panel是容器,如果GroupingText的属性设置了,就渲染成有filedset的div,否则直接为div
HyperLink,能将虚拟路径转化为客户端路径。
FileUpload控件使用说明:需要增加上传文件的类型及权限。防止恶意攻击。
Jquery使用注意:$(“#<%=TextBox1.ClientID%>”).val() 只有<%%>里的是服务端代码。
控件的display:none和visibility:hidden都能实现隐藏,区别是:display:none不占空间
页面中的IsValid属性用来判断所有验证控件是否验证完成
控件的CausesVilidation属性为false则该控件不能被验证控件验证。
Get通过url显式传递参数,参数传递长度有限
Post隐式传递,可以传递数据量较大的数据
表单只可提交有name 的input 、select、textarea的value。对于不能提交value的,例如div。可以用hidden类型的input代替传送。这就是ASP.NET的viewstate机制的由来。
大量的数据不能存储在hidden或者viewstate中,会增加上传流量,导致网页速度变慢。同时表单中不能存储机密数据,会造成数据欺骗。
后台变量不能保存B端的值,对此引用session机制与cookie。Session是B端用户相关信息与S端内存的对应关系。Cookie将这些信息数据保存在本地。Session中不能存储过大的数据,并且超过一段时间会自动清除。例如在线编辑文章,编辑时间过长导致提交时出现文章提交失败,超时或者丢失。优化网页案例:网站主站域名与音乐站,图像站等大流量子站域名区分开,防止cookie的大量提交更新。
每一个请求都会new一个实现了IHttpHandler接口的类的实例进行处理,用完后就GC,不会保留。
JS作为客户端校验能方便用户,但js被禁用后会引起不必要的麻烦,所以数据限制等功能还要在服务端做处理。
asp:Button标签中 OnClientClick为客户端点击事件,onclick是服务端点击事件。
VirtrualPathUtility虚拟路径方法:
ToAbsolute(“/ex.aspx”) 将虚拟路径/ex.aspx转换为绝对路径
AppendTrailingSlash(“”) 判断虚拟路径最后是否有/,如果没有就加上
Combine(“”,””) 合并两路径,需要注意路径一的末尾如果没有/就找到最后一个/处进行合并,例如Combine(“/a/b”,”c.html”)合并为/a/c.html