发博文
个人资料
nationphone
nationphone
  • 博客等级:
  • 博客积分:4
  • 博客访问:321
  • 关注人气:0
访客
加载中…
好友
加载中…
评论
加载中…
留言
加载中…
分类
博文
标签:

杂谈

之前的是2005、2006年间在msn空间上的部分blog,觉得也许能作参考,所以搬过来了。这里打个标记。

 

顺便说一下msn空间,先是我的帐号失效了,后来又看到空间要关闭(因为帐号已经失效,我的空间本来也是无主空间了),记得当时与同事一起用spaces时就是看它是微软搞的,总不致于关闭,结果。。。

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

近来试验着重写一个C++的委托功能,就是.net里的delegate关键字描述的东东,似乎C++里喜欢说是成员函数closure,记不太清楚了。
原来的实现跟loki库里的思路差不多,就是利用虚函数描述委托函数的原型,这个原型与具体实现类无关,子类实现函数的功能,实现
里可以记住具体实现函数的类实例,现在看来没有什么很巧妙的东东了:

1、接口层,纯虚接口,与实现对象无关。
class IEvent
{
public:
virtual ~IEvent(){}
public:
virtual bool operator () (const EventArg& arg)=0;
};
2、实现层,利用模板参数化实现对象类型。
template<typename Obj>
class Event : public IEvent
{
 typedef bool (Obj::*Fptr)(const EventArg&);
public:
 Event(Obj* pObj,Fptr fptr)
 {
  mObj=pObj;
  mFunc=fptr;
 }
 bool operator () (const EventArg& arg)
 {
  return (mObj->*mFunc)(arg);
 }
private:
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

做了一个小的试验,一个DataGridView,一个BindingSource,然后用List<T>作实际的数据源。

当T为struct时,编辑功能失效,修改完按enter,cell里的内容立即恢复为初始值。
大致看了一下DataGridView的操作过程,
1、DataGridView用户操作的事件处理,比如按键、鼠标等;
2、DataGridView.CommitEdit方法;
3、DataGridViewCell.SetValue方法;
5、PropertyDescriptor.SetValue方法。
以前在用PropertyGrid时曾经研究过像PropertyDescriptor这一类.net设计时架构的关键元素,依稀记得对于struct与对object的处理有很大
的不同,于是试了试将T由struct改为class,再试,编辑功能正常。
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

本来以为很简单的,结果费了一番周折,为了防止下次重蹈覆辙,记个笔记。

一开始的想法:
1、用impdef或dumpbin生成一个ntdll.dll的模块定义文件ntdll.def;
2、用lib /def:ntdll.def生成ntdll.lib;
3、按网上hacker给出的函数原形写个头文件ntdll.h.
结果编译时说无法链接_LdrLoadDll@16,看起来是__stdcall调用约定修饰名的原因,但是找不到办法将链接时的_LdrLoadDll@16转换到DLL实际输出的名称LdrLoadDll,查def文件格式时有EXPORTS部分的写法:
entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]
以为可以用这种方法换名,于是改def文件:
重新生成ntdll.lib后程序编译通过,但是运行提示找不到
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

.NET框架库里包含了对MS推出的几个语言的完整编译支持,所以这些语言理论上都可以用来作脚本,不过脚本是随手写的,还是动态语言作为脚本比较合适,我指的这个动态语言就是jscript,在.NET库里对编译的支持集中在一个抽象类System.CodeDom.Compiler.CodeDomProvider,编译与装入一个脚本的写法如下:

CodeDomProvider cdp=new JScriptCodeProvider();
CompilerParameters args = new CompilerParameters();
args.GenerateExecutable = false;
args.GenerateInMemory = true;
args.ReferencedAssemblies.Add('System.dll');
args.ReferencedAssemblies.Add('System.Data.dll');
args.ReferencedAssemblies.Add('System.Web.dll');
args.ReferencedAssemblies.Add('System.Windows.Forms.dll');
//执行编译,字符串参数scriptCode为脚本内容
CompilerResults res = cdp.CompileAssemblyFromSource(args, scriptCode);
if (res.Output.Count > 0)
    &nbs
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

只要在应用中使用PropertyGrid控件来提供对应用中的对象模型实例的特性编辑,这便已经是兼容了.NET设计时架构了,不过我发现一个问题,

当我们需要一次性编辑许多对象的时候,量变引起质变,此时严重的性能问题会让我们怀疑是不是不该使用PropertyGrid了(这种量变引起质变的现象在使用第三方库的时候好象经常碰到,大概原因在于库的设计者当初定位的使用环境是常规的,而量变到一个程度时,问题已经不再是常规的了,这好象与库的设计是否可伸缩无关。另一个例子,一般情况动态数组可以容下足够多的东东,我们无需关心它的存储问题,但如果元素数目非常非常多,比如100G的数目,这时就必须要自己考虑了[呵呵,这个例子有点夸张了]。),然而介于.NET设计时架构的良好设计的吸引,实在不愿意就此放弃,所以我想看看如何改造一下PropertyGrid来适应这种新情况新问题。
前面提到的性能问题主要是PropertyGrid在编辑一组对象时是在循环中依次修改各个对象,数目大的时候,这个循环需要很长的时间(这个没办法改变,时间不大可能变少),此时应用界面会失去响应,这在WIN32 GUI里的解决办法是在循环中插入消息处理,顺便加上一个进
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

这几天为Ollydbg的插件OllyHtml加了一个快速搜索反汇编代码的API,起因是因为在jscript脚本里逐语句的查找太慢了,然而搜索条件又不方便简单的利用函数参数表示,最后我想到了Lambda表达式,感觉在为脚本提供的库中使用Lambda表达式来提高某些操作的效率与灵活性还是比较有用的。(算了,今天写的太多了,手酸了,直接贴代码了)

LAMBDA表达式实现,主要用于构造逻辑表达式,表达式中的基本数据来自ollydbg插件SDK的结构t_disasm:
#pragma once
#include 'stdafx.h'
#include 'resource.h'
#include 'Plugin.h'
#include <vector>
#include <map>
class ConditionExpression
{
public:
 virtual bool operator () (t_disasm* p)=0;
public:
 Conditionexpression_r_r()
 {
  TotalObjectsRef()++;
  refCount=1;
 }
 virtual ~Conditionexpression_r_r(void)
 {}
public:
 virtual void AddRef(void)
 {
  
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

 
对象仓库=>对象查询语言(OQL)=>对象操作脚本语言=>神经网络+模糊逻辑+遗传算法
 
本来我以为这样的系统应该既具灵活性,也有足够的智能,不过我现在不这样看了,智能方面我对神经网络类的仿生办法的通用性很是怀疑,这种智能太像'能做任何事的智能'了,而'什么都能做'<=>'什么都不能做',我看通用智能还是不要追求的好,做软件还是要老实的去理解问题域,然后再针对性的想解决办法,企图找到能解决任何问题的方案是根本不可能的.
 
  
 
类------------------------|
                &n
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

前一阵子探讨一个项目,甲方说这个功能很简单的,只要你实现数据库表的创建就可以了,回来我一想,觉得有点不对劲,没理由只提供新建的功能的,哪里只让加,不让修改与删除的?你既然允许添加,那就意味着可以加错,错了还不让改吗?当然也就可以加多,多了还不让删吗?如此看来,增删改的功能是一体的,进一步,有了增删改,暗含着就需要提供浏览的功能了.

 
现在从形式化一些的角度来看,
                  增加 => 删除 | 修改
反过来
                  删除 => 增加 | 修改
                  修改 => 增加 | 删除
 
换句话说,这几个功能是对称的,并且是传递的,这样一来就很接近于等价关系了,当然,功能是个很泛的说法,没有数学上的关系那么精确,不过我确实感觉到这三个功能事实上形成
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

杂谈

近来做项目时发现一个继承关系失效的情形,感觉应该还是比较常见的。

我们的项目中有一个水利上要用的点、线、面的概念,它们是在传统的几何所说的点、线、面的基础上扩充了相关的水利方面的属性,从概念上粗略看,带有水利属性的点也是一个几何意义上的点,带有水利属性的线也是一个几何意义上的线,带有水利属性的面也是一个几何意义上的面,似乎是很合适的继承关系,所以一开始我也就这么认为了,结果在细化时遇到了麻烦,麻烦出在研究点、线、面的关系的时候。
我们首先按继承考虑,所以有一个几何意义上的点、线、面层次,也有一个水利意义上的点、线、面层次,后者分别是前者的子类,现在来看横向的关系,在几何意义上线由点组成,面由线组成,所以存在一个组合关系,我们为几何意义层次的点、线、面加上这些关系:
几何意义层面的类:
class Point
{
}
class Line
{
    Point[2] points;
}
class Plane
{
    Line[] lines;
}
水利意义层面的类:
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有