如题,要求是模块。
superdoctor 回复于:2005-01-04 11:00:23
恕我直言,楼主的说法着实过火,论坛上其他人并没有解答你问题的义务,尽管你的问题简单
freeand 回复于:2005-01-04 14:39:41
很抱歉!
我一心想着把问题说得简单明了,不好意思了。。。
我找过好多模块,都只是列出日期,或许是做日期的列表,好像都没法更改系统的日期和时间。。。不知谁有过经验的,麻烦说说,谢了~
superdoctor 回复于:2005-01-04 14:49:46
引用:原帖由 "freeand" 发表: 很抱歉!
我一心想着把问题说得简单明了,不好意思了。。。
我找过好多模块,都只是列出日期,或许是做日期的列表,好像都没法更改系统的日期和时间。。。不知谁有过经验的,麻烦说说,谢了~
没关系,有问题大家帮着看一下也没有问题的
WINDOWS下的
use Win32::OLE::Variant;
my $v = Variant(VT_DATE, "April 1 99 2:23 pm");
print $v->;Date("ddd',' MMM dd yy"), "\n";
print $v->;Time("hh.mm.ss tt"), "\n";
输出:
Thu, Apr 01 99
02.23.00 PM
freeand 回复于:2005-01-04 16:14:31
我就是这个问题啊,和你这个例子差不多,只能显示日期,不能应用修改到winxp系统啊。。。
superdoctor 回复于:2005-01-04 16:23:45
这个我没有试过,临时找到的
那你使用system ("time xxxxxx")就可以啦在DOS/WINXP下 :roll:
freeand 回复于:2005-01-04 16:34:26
my $cmd=`date 日期 && time 时间`;
这样是可以的。。。但是,这样在程序里调用,会弹出一个dos窗口。。。
所以,我想用模块方式实现,想避免任何窗口的弹出。。。
freeand 回复于:2005-01-04 16:37:03
use Win32;
use Win32::Process;
$CreateOptions=NORMAL_PRIORITY_CLASS | DETACHED_PROCESS;
Win32::Process::Create($ProcessObj,'C:\WINDOWS\system32\cmd.exe',"cmd time 时间",0,DETACHED_PROCESS,".");
$ProcessObj->;Wait(INFINITE);
$ProcessObj->;GetExitCode($ExitCode);
这样也不行~~~
superdoctor 回复于:2005-01-04 17:04:33
WINDOWS确实比较讨厌,你到其他WINDOWS的论坛去问问,这里是CHINAUNIX,老实说大家的WINDOWS经验不是太丰富的 :lol:
freeand 回复于:2005-01-04 17:26:26
:oops: 关于perl的论坛越来越少了。。。哎~
flw 回复于:2005-01-04 18:33:35
引用:原帖由 "superdoctor"]WINDOWS确实比较讨厌,你到其他WINDOWS的论坛去问问,这里是CHINAUNIX,老实说大家的WINDOWS经验不是太丰富的 :lol: 发表: 不许撵人家走!
楼主别灰心,
让我帮你去试试, 看有没有什么好办法.
freeand 回复于:2005-01-04 18:47:39
引用:原帖由 "flw" 发表: 恍砟烊思易?
楼主别灰心,
让我帮你去试试, 看有没有什么好办法.
:em16: 谢谢!
superdoctor 回复于:2005-01-05 10:54:49
引用:原帖由 "flw" 发表: 恍砟烊思易!
楼主别灰心,
让我帮你去试试, 看有没有什么好办法.
知道了,大人
目前确实没有好的办法去找到一个摸块,刚在turbo c下给你拼了一个
/*******************************************************************/
/*FUNCTION: */
/* Change date and time under windows platfarm and avoid DOS */
/* prompt */
/* */
/*USAGE: */
/* "a.out 0 2005-01-05" to change current date to 20050105; */
/* "a.out 1 12:00:00" to change time time to 12:00; */
/* */
/* Use Perl system function when call this program under perl */
/* scripts,and will not pop_up DOS prompt; */
/*******************************************************************/
#include <stdlib.h>;
#define DATE 0
#define TIME 1
int main(int argc, char *argv[])
{
char cmd[50];
int ret,cmdtype;
if(argc < 3)exit(-2);
memset(cmd,0,50);
cmdtype=atoi(argv[1]);
if( cmdtype == DATE)
{
strcpy(cmd, "date ");
strcat(cmd,argv[2]);
ret = system(cmd);
return(ret);
}
if( cmdtype == TIME)
{
strcpy(cmd, "time ");
strcat(cmd,argv[2]);
ret = system(cmd);
return(ret);
}
}
临时解决办法吧
bytewolf 回复于:2005-01-05 12:08:32
use Win32::Job;
my $job = Win32::Job->;new;
$job->;spawn("cmd", q{cmd /C "date 2005-01-06"});
$job->;spawn("cmd", q{cmd /C "time 12:07:12"});
$job->;run(10);
superdoctor 回复于:2005-01-05 13:03:48
bytewolf,你的这个会不会弹出dos窗口?
freeand 回复于:2005-01-05 14:39:35
引用:原帖由 "bytewolf"] 发表:
有两个窗口弹出来。。。
bytewolf 回复于:2005-01-05 20:40:53
奇怪了...在我的winxp上,除了运行该程序打开的一个cmd窗口外,运行中不会再弹出新的窗口啊....
flw 回复于:2005-01-05 21:06:52
折腾了一晚上,终于搞定楼主的问题了:
#!/usr/bin/perl -w
# 2005.01.05 习作于武汉 writed by flw
use strict;
use Win32::API;
use Tk;
my $ret;
Win32::API::Struct->;typedef( 'TIMESTRUCT' =>; qw(
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
) ) || die "typedef struct TIMESTRUCT failed: [$!]\n";
$ret = Win32::API->;Import( 'Kernel32.dll', 'VOID GetLocalTime( LPTIMESTRUCT time )' );
die "Import Win32API GetLocalTime failed: [$!]\n" unless $ret;
$ret = Win32::API->;Import( 'Kernel32.dll', 'BOOL SetLocalTime( LPTIMESTRUCT time )' );
die "Import Win32API SetLocalTime failed: [$!]\n" unless $ret;
my $win = new Tk::MainWindow( '-title' =>; 'flw' );
my $labelText = 'Press OK to set local time';
$win->;Label( '-textvariable' =>; \$labelText )->;pack();
$win->;Button( '-text' =>; 'OK', '-command' =>; \&OnOK )->;pack();
sub OnOK{
my $timeVar = Win32::API::Struct->;new( 'TIMESTRUCT' );
$timeVar->;align(0);
GetLocalTime( $timeVar );
$timeVar->;{ 'wYear' } = 2005;
$timeVar->;{ 'wMonth' } = 1;
$timeVar->;{ 'wDay' } = 23;
my $ret = SetLocalTime( $timeVar );
$labelText = "ret: [$ret] ".($ret ? 'success' : "failed: [$!]");
}
MainLoop();
flw 回复于:2005-01-05 21:10:40
主要思路是利用 Win32::API 模块来调用 windows SDK 提供的功能,
按照这个思路可以调用所有的 SDK API。
至于怎么不弹出窗口来,
我想用 CreateProcess 应该可以的。
system 肯定是不行的,因为 system 要激活一个 cmd 进程。
我用 WinExec( "cmd /c date 2005-01-20", SW_HIDDEN ) 试过,按思路讲应该是可以实现的,不过始终报错“找不到命令文件”,不知道是我哪里搞错了,改天再折腾折腾。
flw 回复于:2005-01-05 21:12:58
Win32::API 可以用 ppm 下载下来。
哈哈!现在我总算是基本掌握了扩展 Perl 和嵌入 Perl 两种技术。
从而可以实现 Perl/C 混合编程了。
freeand 回复于:2005-01-05 21:59:57
谢谢flw!!!!!成功啦~~~
superdoctor 回复于:2005-01-06 11:58:17
引用:原帖由 "flw" 发表: Win32::API 可以用 ppm 下载下来。
哈哈!现在我总算是基本掌握了扩展 Perl 和嵌入 Perl 两种技术。
从而可以实现 Perl/C 混合编程了。
flw确实强
建议加精,这个例子对WIN下vs的程序员平滑过渡到perl程序员非常有启发意义啊
加精吧,flw
flw 回复于:2005-01-06 19:25:47
to 楼上:
我正准备等融会贯通之后,写一些 Perl/C 混合编程的系列文章呢。
我准备分成三部分:
1,利用 C 语言编制模块来扩展 Perl 的功能。
2,在 Perl 中调用 C 语言书写好的动态/静态链接库(就是这个帖子中的例子了)
3,在 C 语言中嵌入 Perl 解释器
大家也可以考虑考虑。
至于加精华,因为我说过是不要精华的,所以就暂时先不加了。
freeand 回复于:2005-01-07 10:29:11
http://www.chinaunix.net/forum/viewtopic.php?t=474265&show_type=&sid=003f38f0d1e5e74cfd3ef66cd0ea7326
请问如何改啊?或者有什么更好的可以用在linux和windows下的定时器?谢谢了~
superdoctor 回复于:2005-01-07 10:51:13
引用:原帖由 "flw" 发表: to 楼上:
我正准备等融会贯通之后,写一些 Perl/C 混合编程的系列文章呢。
我准备分成三部分:
1,利用 C 语言编制模块来扩展 Perl 的功能。
2,在 Perl 中调用 C 语言书写好的动态/静态链接库(就是这个帖子中..........
有一本书叫做<Perl 语言技术内幕>;,有中译本卖,里面有比较详细介绍PERL与C协同的章节,呵呵,我有这本书,但是没有电子版的,不然就共享出来了
|