`
wuhuizhong
  • 浏览: 686531 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

PB 11 使用windows api CreateProcess 调用其他程序

阅读更多

from:http://hi.baidu.com/lzycsd/blog/item/60ac860fce5fe0e7ab6457d5.html

 

在网上搜了搜大部分是这个方法

但是我发现在pb9中可以用,在pb11中不可以用

又查了查 原因是字符问题

把下面例子中的CreateProcessA换成 CreateProcessW即可

createprocess,createprocessA,createprocessW的区别http://hi.baidu.com/lzycsd/blog/item/41ef76e7224d3424b93820cd.html

CreateProcess api的用法见

http://hi.baidu.com/lzycsd/blog/item/204f730f388dcc206059f3e6.html

返回错误码见

http://hi.baidu.com/lzycsd/blog/item/54053f95be1119027bf4801c.html

pb调用其他程序总结

前言
在pb中经常需要运行第三方程序,例如打开计算器,记事本等,外部程序调用方法不外乎以下三种:
1、直接用run;
   优点是使用简单方便,pb自带函数,缺点跟优点一样明显,无法隐藏执行窗口,无法控制程序执行过程等(当然也可以用findwindow等方式判断,总体来说不是很合理);
2、调用api,ShellExecute;
   把程序执行方式交给操作系统处理,简单来说,例如操作系统里文本文件默认用记事本打开,网址文件用ie打开,运行网址文件,系统会自动调用ie打开网址;
3、调用api,CreateProcess;
   优点:配合其他api,可以控制程序的执行过程,也可以隐藏执行,可以设置标题等;
   缺点:使用复杂,需要定义一大堆api函数;
方法一、方法二网上资料很多,唯独方法三资料比较少,而且错误百出;综合很多网友的资料,查了msdn,反复实践,总算总结出来,下面开始罗列;
正文
一、定义api
Function 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命令,就可以在后台实现很多操作;
public function boolean create_process_wait (string as_executable, string as_commandparm, boolean ab_yield, boolean ab_show);
//====================================================================
// 事件: nvo_ftp.Properties - nvo_ftp inherited from nonvisualobject()
//--------------------------------------------------------------------
// 描述:
//--------------------------------------------------------------------
// 参数:
// 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
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 IF
sinfo.cbreserved2 = 0
sinfo.lpReserved2 = 0
sinfo.hStdInput = 0
sinfo.hStdOutput = 0
sinfo.hStdError = 0
Boolean bRet
bRet = CreateProcess(as_executable,as_executable + " " + as_commandparm,0,0,False,32,0,0,sinfo,pinfo)
//bRet = CreateProcess(NULL,cmd,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&TStartupInfo,&TProcessInformation);
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
三、实用案例
1、利用rar.exe在后台生成压缩文件
// 控制台下命令如下: rar.exe a 2007.rar *.txt
String ls_command,ls_comm_para,ls_curr_path
String as_targetfile ,as_sourcefile,as_targetpath
as_targetfile = "test.rar"
as_sourcefile = "*.txt"
as_targetpath = ".\rarfile"
ls_command = "rar.exe " // 这个文件在winrar的安装目录里有,到处都能找到
ls_comm_para= " a " +as_targetpath+'\'+as_targetfile +" "+as_sourcefile
if create_process_wait(ls_command,ls_comm_para,true,FALSE) = TRUE then
if fileexists(as_targetpath+'\'+as_targetfile ) then
   return TRUE
else
   return FALSE // 生成压缩文件失败
end if
else
return FALSE // 调用api返回失败
end if
结合脚本,其实可以做很多很多事情,大家自己发挥吧,例如创建目录,删除目录等。
总结
本文相比别的方法,解决了两大关键问题,一是隐藏执行,不会弹出讨厌的控制台窗口;二是主程序会等待被调用程序执行结束;
分享到:
评论

相关推荐

    PB中的常用WINDOWS API 调用

    标题 "PB中的常用WINDOWS API调用" 涉及到的是使用PowerBuilder(PB)这一编程工具进行Windows API函数的调用技术。PowerBuilder是一种基于事件驱动的可视化的应用程序开发环境,尤其适合于构建数据库应用系统。在PB...

    PB控制运行其他程序(源码)

    标题中的“PB控制运行其他程序(源码)”指的是使用PowerBuilder(PB)开发的应用程序能够启动和管理外部程序的执行。在PowerBuilder中,通过调用操作系统级别的API函数或者使用特定的库函数,可以实现这样的功能。这...

    pb调用api函数详解

    PB(PowerBuilder)是一款...总之,PB调用API函数是提高程序功能和灵活性的重要手段,理解API调用机制及常见API的使用方法对于PB开发者来说至关重要。通过不断实践和学习,开发者可以更好地利用API实现各种复杂的功能。

    非常难得的VB-PB之API例程示例,非常全面,API例程是开发PB程序的进阶。

    在VB(Visual Basic)和PB(PowerBuilder)编程中,使用API函数可以实现许多原生控件无法完成的功能,如系统级别的操作、硬件交互等。这些API例程对于开发者来说是非常宝贵的资源,能够帮助他们提升编程技能,解决...

    pb10-API.rar_PowerBuilder_界面

    在PowerBuilder中,可能使用的系统API包括ShellExecute用于执行外部程序,GetModuleFileName获取运行程序的完整路径,CreateProcess用于启动新的进程等。 5. PB调用API实践: 在实际开发中,开发者可能需要编写...

    PB Win32API 使用例子

    而Win32 API(应用程序接口)是微软Windows操作系统的核心接口,提供了丰富的系统功能调用,使得开发者可以实现更底层的操作,比如文件操作、窗口管理、网络通信等。 标题"PB Win32API 使用例子"指出,这是一个关于...

    一个CREATEPROCESS()的实例

    创建进程实例,使用CreateProcess()函数打开一个程序的实例 CreateProcess()函数是Windows操作系统中用于创建新进程的API函数。该函数可以用来创建一个新的进程实例,并指定其执行的命令行参数、安全性设置、...

    【PB代码】获取和结束进程

    在Windows系统中,我们可以使用各种API函数来管理和控制进程,如`CreateProcess`、`TerminateProcess`等。 在PB 11.5中,我们通常通过以下步骤来获取和结束进程: 1. **导入API函数**: 在PB中使用系统API,需要...

    所有API函数使用下载

    在你提到的"所有API函数使用下载"资源中,我们重点关注的是PB8(PowerBuilder 8)程序的API。PB8是Sybase公司开发的一种面向对象的快速应用开发工具,它允许开发人员创建基于Windows的应用程序。这里的API主要是针对...

    面向VB,PB的经典实用的API资料集锦.rar

    这些API的使用极大地扩展了VB和PB的原生功能,使得开发者能够构建功能更强大、性能更优化的应用程序。不过,使用API时也需要注意兼容性和安全性问题,避免潜在的内存泄漏、权限滥用等问题。此外,随着.NET Framework...

    PBWin32API基础卷

    PBWin32API则是将这些API函数引入到PowerBuilder中的方式,让PB程序能够调用Windows的系统功能,如文件操作、窗口管理、网络通信等。 1. **API函数调用**:在PowerBuilder中,使用PBWin32API通常涉及声明API函数、...

    Powerbuilder API函数大全

    PowerBuilder API函数大全是针对PowerBuilder开发环境的一份详尽的参考资源,它包含了PowerBuilder应用程序在编程过程中可能用到的各种API函数。API(Application Programming Interface)函数是操作系统或者库提供...

    pb实例好用

    标题中的“pb实例好用”很可能是指PowerBuilder(PB)的实例代码或应用程序,PowerBuilder是一种流行的、基于事件驱动的编程环境,主要用于开发企业级的Windows应用。它以其图形化的用户界面(GUI)构建工具和数据...

    转:pb12 开发 webservice 注意事项

    ### 转:PB12 开发 WebService 注意事项 #### 概述 在将一个传统的C/S(客户端/服务器)MIS系统改造为基于WebService的C/S/S架构的过程中,会遇到一系列技术挑战与注意事项。以下内容是针对这一转换过程中所记录的...

    WinCE开发问题集锦.pdf

    16. API的调用,比如GetModuleFileName()、ShellExecuteEx()和CreateProcess(),这些API的使用对于文件操作、启动进程等开发任务至关重要。 17. 针对特定文件格式的处理,如POCKETWORD*.dat的处理方法,这涉及到...

    E53_2_S53_v0.3.rar_汇编语言_Windows_Unix_

    Windows使用stdcall调用约定,而Unix系统通常使用cdecl。这意味着在编写系统调用时,函数参数的传递顺序和清理方式会有所不同。 2. **文件系统**:两个操作系统使用不同的文件路径表示法。Windows使用反斜杠(\),...

Global site tag (gtag.js) - Google Analytics