2010年12月 存档

你可以分配多大的内存?

2010年12月7日,星期二

《C专家编程》中的一个程序,觉得挺有意思,记录一下。

运行下列程序,看看在你的进程中可以分配多大的内存。

#include <stdio.h>
#include <stdlib.h>
main() {
    int Mb = 0;
    while ( malloc(1<<20)) ++Mb;
    printf("Allocated %d Mb total\n", Mb);
}

总共分配的内存量取决于交换区和你的系统配置中的进程限制。如果实际分配的内存块小于1M字节,你实际得到的内存是否比这要多一些?为什么?

为了让这个程序能够在有内存限制的MS-DOS上运行,把每次分配的单元从1MB改为1KB(就是把1<<20改为1<<10,并用KB代替MB)。

在我的系统物理内存为2GB,可以分配的内存大概是1880MB,你的系统呢?

另,在Windows系统中把1<<20改为1<<10会有很神奇的事情发生哦~

伪造电子邮件发送时间

2010年12月6日,星期一

今天发短信问同学才知道经济法(开学到现在只去过两次)有小论文布置,而且老师要求在12月3日之前把论文的电子版发到他的邮箱,否则平时成绩按0分处理。

天啊,今天可是12月6日!平时成绩可是30分啊!没有平时成绩的话基本是不可能及格了!怎么办?根据爱因斯坦的相对论,时间是不可能倒流的,但是这并不表示我们不能向“过去”发邮件。在网络的世界,时间只不过是0和1罢了。

Const Email_From = "still.demon@gmail.com"
Const Password = "password"
Const Email_To = "jingjifa@163.com" '只是假想的邮箱
Set CDO = CreateObject("CDO.Message")
CDO.Subject = "From The Future"
CDO.From = Email_From
CDO.To = Email_To
CDO.TextBody = "Hello world!"
Const schema = "http://schemas.microsoft.com/cdo/configuration/"
With CDO.Configuration.Fields
    .Item(schema & "sendusing") = 2
    .Item(schema & "smtpserver") = "smtp.gmail.com"
    .Item(schema & "smtpauthenticate") = 1
    .Item(schema & "sendusername") = Email_From
    .Item(schema & "sendpassword") = Password
    .Item(schema & "smtpserverport") = 465
    .Item(schema & "smtpusessl") = True
    .Item(schema & "smtpconnectiontimeout") = 60
    .Update
End With
CDO.Send

把系统时间改成12月3日,用上面的代码发送邮件(理论上用邮件客户端也行,但是我没有测试),在163邮箱显示的发送时间是12月3日哦。幸好老师的邮箱是163的~

TLI.TLIApplication,被遗忘的COM组件

2010年12月5日,星期日

TLI.TLIApplication是一个能获取COM组件Type Library Information(类型库信息)的COM组件。曾经一直很好奇VbsEdit的代码自动补全是怎么实现的,现在看来,大约的确用的就是这个COM。

比如我想知道scrrun.dll(提供fso对象的dll)这个COM组件提供了哪些接口,可以用下面的代码:

'By Demon
'https://demon.tw
Set tli = CreateObject("TLI.TLIApplication")
Set Info = tli.TypeLibInfoFromFile("scrrun.dll")
For Each Interface In Info.Interfaces
    WScript.Echo Interface.Name 
Next

或者我忘记了fso对象有哪些属性和方法,而又没有参考文档,可以用下面的代码:

'By Demon
'https://demon.tw
Dim fso
Set fso = CreateObject("scripting.filesystemobject")
Set tli = CreateObject("TLI.TLIApplication")
Set Info = tli.ClassInfoFromObject(fso)
For Each Member In Info.DefaultInterface.Members
    WScript.Echo Member.Name 
Next

时间和篇幅有限,举的例子比较简单,更详细的请查阅文档(参考链接2为下载地址)。

参考链接:

  1. RunTime COM Object Inspection
  2. FILE: Tlbinf32.exe : Help Files for Tlbinf32.dll
  3. Visual Basic: Inspect COM Components Using the TypeLib Information Object Library

用VBS创建环境变量

2010年12月3日,星期五

今天和一个高手讨论了一下WMI里WQL查询的时间问题,无果。Google时无意中搜到这段代码,mark一下。

strComputer = "."
Set objWMIService = GetObject _
("winmgmts:\\" & strComputer & "\root\cimv2")
Set objVariable = objWMIService._
Get("Win32_Environment").SpawnInstance_
objVariable.Name = "TestValue"
objVariable.UserName = "System"
objVariable.VariableValue = "This is a test"
objVariable.Put_

参考链接:如何使用脚本创建环境变量?

各浏览器禁止内容选中的方式

2010年12月2日,星期四

今天在Linkanyway博客看到《Javascript之禁止右键禁止选取》,高手都喜欢装菜鸟。

禁用右键确实没什么难度,虽然oncontextmenu事件是HTML5里面的,但是现在主流的浏览器都支持。

<script type="text/javascript">
document.oncontextmenu = function(e) {
    return false;
}
</script>

禁止内容选中相对就比较复杂了,标准中没有定义,各浏览器对禁止内容选中,各有各自的办法:

  • Firefox Chrome Safari都有私有CSS样式控制
  • IE通过标签属性和标签方法控制
  • Opera通过标签属性控制

至于具体代码,请查看参考链接。

参考链接:BX2050: 各浏览器禁止内容选中的方式不同