Windows编程
文章平均质量分 73
__dazhi
这个作者很懒,什么都没留下…
展开
-
线程消息通信
线程间的消息通信主要采用PostThreadMessage函数来实现,主线程通过该函数来实现消息的发送,副线程则采用消息循环机制来驱动程序,当副线程无GUI时,就不能调用TranslateMessage,DispatchMessage之类的函数,因为该函数无法将消息派发至对应的窗口,这样的话,对于副线程中的MessageBox等有关窗口的消息就不能捕获,转而必须通过线程级别的钩子来实现消息处理。另原创 2014-03-30 20:08:19 · 574 阅读 · 0 评论 -
MVC连接SQL Server2008遇到的问题
登录报错:异常错误:无法打开登录所请求的数据库 "db_test"。登录失败。用户 'CCB-PC\CCB'登录失败。创建一个用户,Integerated Security:Yes:Windows当前用户登陆认证;No:用户名密码认证设置用户名、密码中注意取消密码设置策略,选择用户SQL身份验证登录。设置连接字符串原创 2016-03-10 14:48:13 · 849 阅读 · 0 评论 -
VS2010 Coredump文件生成
在VS2010中系统通过调试产生的exe文件,通过项目属性->调试->启用非托管代码调试功能来调试程序。生成exe后,如出现异常终止,通过任务管理器创建转储文件:然后通过VS2010打开该转储文件,点击调试就会看到异常的代码了。原创 2016-04-14 09:08:02 · 1481 阅读 · 0 评论 -
C# 反射功能
C#中的反射使用主要集中在System.Reflection命名空间中,通过获取对象的属性和方法并创建对象来调用对应的函数等功能,方法主要集中在如下类:MethodInfo:获取类的方法Type:获取类的类型ConstructInfo:获取该类的构造方法用于创建对象。完整的示例如下:class A { public void TestMethod1(st原创 2016-04-16 12:21:10 · 318 阅读 · 0 评论 -
C# 中的泛型与重载
C#中如泛型与重载有相同类型(类型等价),普通函数会优先调用,而且在决议过程中,泛型函数中的where条件未计入考虑。测试程序如下:class A{ public override string ToString() { return "Class A"; } } interface ITest {原创 2016-07-28 17:20:34 · 2018 阅读 · 0 评论 -
远端线程注入
在编写进程注入程序中最常见的部分就是远端线程注入:将本地的程序(一般为动态链接库)注入目的进程,以实现本地程序在目的进程空间执行。这里面有两个关键点:1) 远端进程中创建远端线程在Windows中提供对应的API(CreateRemoteThread)来创建远端线程,远端线程执行的函数必须为目的进程空间,但进程地址空间独立,一般选择为系统默认函数以此函数为基点运行我们的程序,这里选择加载原创 2016-12-26 11:16:04 · 313 阅读 · 0 评论 -
API函数拦截
在Windows中,我们有时需要拦截系统提供的API来实现某些特殊的功能,如针对不同的进程实现API权限控制或者监听用户输入输出,而API函数拦截就是实现这些功能的基础。其通过将系统函数替换为我们提供的函数,当进程内调用该函数时,系统自动调用我们替换后的函数,这样我们就可以实现不同的返回结果,但注意的是需要与系统函数相同的参数签名,否则会引起进程崩溃。关键技术点如下:1) 根据MSD原创 2016-12-26 11:18:44 · 866 阅读 · 0 评论 -
标签与模板的应用
C#支持标签操作,当与模板及类型反射结合时,具有很大的实用价值。这里介绍一个典型的数据库操作应用,编写一个通用的数据库操作ORM,方法如下:1. 通过反射获取模型类中的成员信息,使用Type类实现;2. 通过标签获取该模型类与数据库之间的关系,使用AttributeUsage实现;3. 通过模板实现数据库表之间的操作,利用数据库操作基类DbDataRead原创 2017-02-11 14:25:11 · 294 阅读 · 0 评论 -
sharepoint 2013 安装问题记录
独立安装SharePoint2013碰到的"SDDL"问题及解决方法参考 http://www.cnblogs.com/huaen/p/3770297.htmlException: System.ArgumentException: TheSDDL string contains an invalid sid or a sid that cannot be translated.原创 2017-04-12 14:32:59 · 1058 阅读 · 0 评论 -
Windows交互服务
在Windows中服务与桌面分别位于不同的会话中,服务与桌面交互主要有以下方法:1. 在用户会话中创建进程,服务与该进程交互,实现服务与桌面交互。这种方法可以实现复杂的交互,但首先需要解决的是获取当前用户的会话,利用CreateProcessAsUser函数来创建进程。2. 通过函数WTSSendMessage实现弹窗提醒。这里将展示第一种方法,在创建服务函数CreateServi原创 2017-05-17 23:15:02 · 550 阅读 · 0 评论 -
C#调用C++函数
C#主要通过命名空间System.Runtime.InteropSerivces中的关键字DllImport关键字来实现调用C++函数,参数的引用传递则通过序列化来实现(ref/out关键字及IntPtr指针类型),结构体的序列化采用StructLayout标签。1. 使用DllImport关键字来调用C++函数,所声明的函数必须为static exten类型:[DllImport("us原创 2017-09-27 12:29:01 · 826 阅读 · 0 评论 -
学习yield关键字
当使用yield关键字时,这就意味着该函数返回的是一个迭代器(iterator),不用自己维护一个迭代器内部的状态管理(比如C++中的itereator,或实现C#中实现的接口IEmuerator),其使用模式如下:yield return ;yield break;其中第二种用于for循环终止。这样的模式也就实现了Linq的查询,但注意yield使用要求如下:1. 迭代原创 2017-10-01 09:59:57 · 209 阅读 · 0 评论 -
C#中的域与属性
C#中类成员变量的定义分为两种:域(field)与属性(property),属性为公有变量,以get,set访问器进行访问,域多为私有变量,非get、set访问器进行访问,如以下类的的域为成员name,而属性为val. class Customer { #region fields public string name; #endregion #原创 2015-11-09 08:30:32 · 475 阅读 · 0 评论 -
C#与IronScheme交互
IronScheme为C#版本的Scheme编译器,通过它可以实现scheme与C#之间的相互调用,scheme编写为库,C#直接调用scheme库函数,这样就可以动态加载scheme代码,完成调用。Scheme也可以调用C#中的库函数或自定义类,具体方法可见官方文档。下面讨论的是C#调用scheme函数。1. 编写scheme库函数;Define a function wr原创 2015-10-20 12:54:44 · 850 阅读 · 0 评论 -
模板约束
与C++模板不同,C#模板增加了对于泛化类的约束问题,泛化类约束共计4中类型:基类约束:要求泛化类必须继承至某个基类。接口约束:要求泛化类必须实现某个接口。构造函数约束:要求泛化类必须提供默认的构造函数。值/引用数据类型约束:要求泛化类只能为值类型或引用类型。1. 基类约束,当出现多个约束时,基类约束必须放在最前面,基类约束中的基类不能是sealed class(密封类)和非值原创 2015-08-20 09:40:09 · 1222 阅读 · 0 评论 -
COM学习笔记(二)
一个简单COM的应用开发实例中为一个动态链接库文件,需要导出一系列函数:extern “C” HRESULT __stdcall DllCanUnloadNow(void)extern “C” HRESULT __stdcallDllRegisterServer()extern “C” HRESULT __stdcallDllUnRegisterServer()ext原创 2014-03-25 11:04:36 · 814 阅读 · 0 评论 -
基于VC++的Solidworks 插件开发
Solidworks插件开发中,通过VC++自动生成所有的模板文件后,主要添加一些逻辑代码及菜单,就可以进行直接的开发:1. 添加符号表,处理函数原创 2014-05-13 18:39:08 · 6276 阅读 · 1 评论 -
COM学习笔记三--聚合
在开发过程中,当一个COM B需要调用另一个COM A时,这时有两种方法来实现该操作:包含,聚合。前一种直接保存A的对象指针,所有的操作均在B中进行封装,涉及到A操作方法,利用A对象指针完成调用;而聚合在初始化期间保存对象A的指针,在运行过程中,所有涉及到A操作的方法无需封装,直接调用A的方法,将对象A的指针直接暴露给用户,让用户自己调用。包含则只暴露给用户B对象的指针,聚合同时暴露给用户对象原创 2014-07-03 15:26:46 · 709 阅读 · 0 评论 -
C++ 中[]操作符重载
在实际程序中遇到一操作符问题,记录下来方便以后查询。在写HashTable数据结构中,遇到操作符[]重载问题,具体需求如下:1. a[x] = b; //如果a[x]为空,则添加记录2. b = a[x]; //如果a[x]为空,则提示出错对[]操作符重载之后发现根本不能解决问题,查找一些资料后发现该问题为重载后的读写问题,一个重载解决不了问题。上面两点展开如下:原创 2015-05-06 15:45:28 · 367 阅读 · 0 评论 -
C#中的多态特性
C#中的多态特征与C++类似也存在相同的隐藏与运行时多态,但在C#中,隐藏特征需要通过关键字显示指明。在C#中,多态关键字有三个:virtual: 如基类方法增加该关键字,则表明子类可重写此方法,重写分为两种:隐藏和多态。new: 隐藏此方法,当进行类型赋值”slice”特征时,不进行多态调用,默认方式。override: 重载(扩展)此方法,实现虚表多态性。原创 2015-07-19 11:34:31 · 913 阅读 · 0 评论 -
C#判断对象相等
C#语言中,由于内存为系统自动管理,且重载Equals方法形参为Object基类,加上C#建议实现GetHashCode方法来加快判断,这样在判断相等方面就多了几步:1. 判断两个对象是否对象相等;2. 判断两个对象类型是否相等;3. 判断两个对象GetHashCode方法是否相等;4. 判断基类对象是否相等;5. 判原创 2015-08-13 20:59:08 · 1158 阅读 · 0 评论 -
C#中的装箱与拆箱
C#中数据类型分为两种:数值类型和引用类型,两种类型相互转换过程中就涉及到装箱与拆箱操作,当数值类型转换为引用类型就称之为装箱,相反过程为拆箱。装箱操作为:1. 在堆上分配一块内存,用于保存数值类型中的数据。2. 将数值类型中的数据复制到目的内存中。3. 引用变量指向该内存位置。装箱操作是一个隐式操作,拆箱操作为一个显示操作,需要进行类型的强制转原创 2015-08-14 10:23:54 · 437 阅读 · 0 评论 -
Linq 延迟执行
使用Linq时,其中一个重要概念就是延迟执行,所有的谓词求值需要等到触发时才会被调用。在声明时,它们是不执行的,除非调用Lambda表达式,造成其中的代码开始执行,否则不会被执行。如果Lambda表达式执行的代价比较高(如调用数据库,密集计算等),那么为了优化代码,通过使用”ToXXX”方法来转换为集合方式,减少Lambda表达式的执行。但转换后会造成整个结果都加载到内存(在此之前可能驻留在一个数原创 2015-08-29 13:51:32 · 409 阅读 · 0 评论 -
协变(Covariance)与逆变(Contravariance)
协变与逆变是类型系统中一个常见的问题,基类与子类之间类型变换时的定义要求。协变:模板参数实例化中的子类赋值给基类,保留类型的顺序,从具体类型到抽象类型。IEnumerable base =IEnumerable 逆变:与协变相反,基类赋值给子类,从抽象类型到具体类型。 IEnumerable derived =IEnumerable原创 2015-09-02 18:20:48 · 580 阅读 · 0 评论 -
添加Linq支持
C#中添加Linq支持,只需添加一个迭代器就完成支持。迭代器模式是面向对象语言一个常见设计模式,C#中无需像C++那样维护一个内部状态,通过关键字yield模式来实现,编译器通过自动生成一个内部类来维护迭代器中的状态。测试程序如下:public class EYield : IEnumerable { public IEnumerator GetEnumerator()原创 2015-09-09 10:07:14 · 624 阅读 · 0 评论 -
解析C#中reference与out关键字
C#中数据类型分为两种:值类型和引用类型,值类型为:基本类型(枚举、数值、布尔)、String、Struct类型,而其他均为引用类型。在引用类型中,reference标注是否对该类型无影响呢?测试程序如下: class A { public A() { Console.WriteLine("A::A()"); }原创 2018-01-14 19:05:46 · 2573 阅读 · 0 评论