高手坐镇(3)
数字职场
修改文件生成日期
高手:曾虹云
题目难度:★★★★★
适用人群:软件开发工程师
读者来信:我的程序运行后会在C:\system32中创建一个abc.mdb文件,由于此文件会执行重要任务,我不想这个文件被人注意,因此我想将文件的生成日期改为“2003-04-15”,这样如果有人使用系统的日期搜索就找不出这个文件了,请问这个想法怎么实现?
曾虹云:使用TfileStream文件流可以实现你的这个想法。TFileStream.Create(getPath,fmOpenRead)中的参数getPath是路径,参数fmOpenRead是打开模式中的只读打开(fmOpenWrite是只写打开模式,fmOpenReadWrite是读写打开模式)。在Delphi中定义一个过程:
procedure TForm1.ModifyFileDate(const ASourceFile:string);
var
LSourceStream: TFileStream;
FT : FILETIME;
ST : SYSTEMTIME;
begin
LSourceStream := TFileStream.Create(ASourceFile, fmOpenReadWrite);//读写打开
try
FileTimeToSystemTime(FT,ST);//设置时间
ST.wYear :=2009;
ST.wMonth :=10;
ST.wDay :=10;
SystemTimeToFileTime(ST,FT);
SetFileTime(LSourceStream.Handle,@FT,@FT,@FT);
finally
FreeAndNil(LSourceStream);
end;
end;
然后在创建文件时调用这个过程来修改文件的创建日期:ModifyFileDate('c:inntystem32bc.mdb')。
输出系统服务
高手:小恐龙
题目难度:★★★★★
适用人群:软件开发工程师
开发QQ群:如何用VB输出系统服务?要包含服务运行状态和服务路径。
小恐龙:使用WMI类库读取系统服务然后输出是个比较简单的方法,使用for循环枚举Win32_Service, 示例代码如下:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\" & strComputer & "ootimv2")
Set colRunningServices = objWMIService.ExecQuery _
("Select * from Win32_Service")
For Each objService in colRunningServices
Wscript.Echo objService.DisplayName & VbTab & objService.State
Next
显示当前时间
高手:小恐龙
题目难度:★★★
适用人群:软件开发工程师
开发QQ群:在程序(VB2008或VC2008)上显示当前时间是用Timer不断获取好,还是获取一次后用加法计数好?哪个更省资源?
小恐龙:显示当前时间用Timer不断获取的方式比用加法计数好。 因为不同的电脑,有可能加法的速度不一样。有的电脑会很快,有的电脑可能很慢,而用Timer的话就不存在这个问题。此外加法是六十进制,代码复杂。
字符串转换为字节数组
高手:阿木
题目难度:★★★★
适用人群:软件开发工程师
读者来信:我要做一个通讯程序,需要把字符串转换为字节数组,可是不知道应该怎么操作,请问有什么办法可以实现?
阿木:使用Asc函数就可以实现,不过Asc函数只可以转换一个字符或者一个字符串的第一个字符。下面我们在VB窗体中添加一个text、一个Command、一个List。在Command的Click事件中写入:
Dim aa As Variant
aa = allasc(Text1.Text)//调用函数
For i = 1 To UBound(aa)
List1.AddItem aa(i)
Allasc的函数定义如下:
Public Function allasc(ByVal s As String) As Variant
Dim xx() As Long
ReDim xx(1 To Len(s)) As Long//重新定义xx数组的长度为Text1的字符串长度
For i = 1 To Len(s)
xx(i) = Asc(Mid(s, i, 1))//调用Asc函数,一个字节一个字节的转换
Next i
allasc = xx//返回函数的值
End Function