首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

配合DOS命令实现后台执行,但是提示有异常,请大家帮助

2012-06-14 
配合DOS命令实现后台执行,但是提示有错误,请大家帮助!一、定义apiFunction BOOLEAN GetExitCodeProcess( LO

配合DOS命令实现后台执行,但是提示有错误,请大家帮助!
一、定义apiFunction BOOLEAN GetExitCodeProcess( LONG hProcess,REF ULONG lpExitCode ) LIBRARY "KERNEL32.DLL" 
Function ULONG GetLastError() Library "KERNEL32.DLL"Function BOOLEAN CreateProcess ( STRING lpApplicationName, & 
STRING lpCommandLine, & 
ULONG lpProcessAttributes, & 
ULONG lpThreadAttributes, & 
BOOLEAN bInheritHandles, & 
ULONG dwCreationFlags, & 
ULONG lpEnvironment, & 
ULONG lpCurrentDirectory, & 
REF STARTUPINFO lpStartupInfo, & 
REF PROCESS_INFORMATION lpProcessInformation ) & 
LIBRARY "KERNEL32.DLL" Alias for "CreateProcessA" 
FUNCTION ulong WaitForSingleObject(ulong hHandle,ulong dwMilliseconds) LIBRARY "kernel32.dll"

二、结构定义如下:

type startupinfo from structure
unsignedlong cb 
unsignedlong lpreserved 
unsignedlong lpdesktop 
unsignedlong lptitle 
unsignedlong dwx 
unsignedlong dwy 
unsignedlong dwxsize 
unsignedlong dwysize 
unsignedlong dwxcountchars 
unsignedlong dwycountchars 
unsignedlong dwfillattribute 
unsignedlong dwflags 
unsignedlong wshowwindow
unsignedlong cbreserved2 
unsignedlong lpreserved2 
unsignedlong hstdinput 
unsignedlong hstdoutput 
unsignedlong hstderror 
end type

type process_information from structure
long hprocess 
long hthread 
unsignedlong dwprocessid 
unsignedlong dwthreadid 
end type

三、实现代码

配合一些dos命令,就可以在后台实现很多操作

function boolean create_process_wait()

//====================================================================
// 描述:
//--------------------------------
// 参数:
// value string as_executable 执行命令
// value string as_commandparm 命令参数
// value boolean ab_yield 等待返回时,是否释放cpu
// value boolean ab_show 是否显示执行窗口 
//--------------------------------
// 举例:
// create_process_wait(ls_command,ls_comm_para,TRUE,FALSE)
//--------------------------------
// 返回: (none)
//--------------------------------
// 作者: Joshua Zou 日期: 2008年02月18日
//--------------------------------
// Copyright (c) 2002-2007 , All rights reserved.
//--------------------------------
// 修改历史:
//
//====================================================================
STARTUPINFO sinfo
PROCESS_INFORMATION pinfo

Constant Long SW_HIDE =0
Constant Long SW_NORMAL =1


sinfo.cb = 4 * 17
sinfo.lpReserved = 0 // NULL 
sinfo.lpDesktop = 0 // NULL 
sinfo.lpTitle = 0 // NULL 
sinfo.dwX = 0
sinfo.dwY = 0
sinfo.dwXSize = 0
sinfo.dwYSize = 0
sinfo.dwXCountChars = 0
sinfo.dwYCountChars = 0
sinfo.dwFillAttribute = 0
sinfo.dwFlags = 1
IF ab_show THEN
sinfo.wShowWindow = SW_NORMAL
ELSE
sinfo.wShowWindow = SW_HIDE // 默认隐藏执行窗口
END IFsinfo.cbreserved2 = 0
sinfo.lpReserved2 = 0
sinfo.hStdInput = 0
sinfo.hStdOutput = 0
sinfo.hStdError = 0Boolean bRet
bRet = CreateProcess(as_executable,as_executable + " " + as_commandparm,0,0,False,32,0,0,sinfo,pinfo)
IF Not bRet THEN
MessageBox("警告", "创建子进程错误,错误码:"+String(GetLastError()))
RETURN False
END IF
ULong lpExitCode
DO
// 等待结束
WaitForSingleObject(pinfo.hProcess,0)
bRet = GetExitCodeProcess ( pinfo.hProcess, lpExitCode )
IF ab_yield THEN Yield() //等待返回循环中,释放cpu
LOOP Until ( bRet = True And lpExitCode <> 259 )RETURN True



四、测试

create_process_wait(‘del’,‘ /s /f /q d:\ishow' ,true , false)

用这种方法最大的好处是可以后台执行一些DOS命令,不出现窗口。

测试的时候总是提示“创建子进程错误,错误代码2”
请问大家那里错了?谢谢!

[解决办法]
GetLastError()错误含义:

〖0〗-操作成功完成。
〖1〗-功能错误。
〖2〗-系统找不到指定的文件。
〖3〗-系统找不到指定的路径。
〖4〗-系统无法打开文件。
〖5〗-拒绝访问。
〖6〗-句柄无效。
〖7〗-存储控制块被损坏。
〖8〗-存储空间不足,无法处理此命令。
〖9〗-存储控制块地址无效。
〖10〗-环境错误。
〖11〗-试图加载格式错误的程序。
〖12〗-访问码无效。
〖13〗-数据无效。
〖14〗-存储器不足,无法完成此操作。
〖15〗-系统找不到指定的驱动器。
〖16〗-无法删除目录。
〖17〗-系统无法将文件移到不同的驱动器。
〖18〗-没有更多文件。
〖19〗-介质受写入保护。
〖20〗-系统找不到指定的设备。 

[解决办法]
很久以前好象做过这个,记得这句要改改的,不太确定,LZ自已查查吧
bRet = CreateProcess(as_executable,as_executable + " " + as_commandparm,0,0,False,32,0,0,sinfo,pinfo

热点排行