CreateProcess执行批处理文件
CreateProcess to execute batch file
在我创建的Windows应用程序中,我试图运行指向.vbs的批处理文件。它运行vbs脚本,但不根据需要修改注册表。但是,如果我手动运行批处理文件,它会正常工作。有人知道问题出在哪里吗?我认为这是权限,但为什么它会重要,如果我手动点击批处理文件或如果我的程序打开它?无论如何,我已经修改了批处理文件,试图以管理员身份运行,但似乎没有任何在线工作。
它没有说CreateProcess可以运行批处理文件。由于批处理文件不是程序,CreateProcess不能对它做任何事情。执行批处理文件。
你应该通过测试返回值和阅读文档知道这一点。
从帮助
返回值
如果函数成功,返回值非零。
如果函数失败,返回值为零。要获取扩展的错误信息,请调用GetLastError。
也来自Help
要运行批处理文件,必须启动命令解释器;"lpApplicationName"设置为"cmd.exe","lpCommandLine"设置为批处理文件名。
这就是你做错的地方
1。你的程序设计真奇怪。
任何程序都可以提示用户输入并写入注册表。您正在编写一个程序,该程序将至少有四种不同的方式来编写注册表。. Net、wash、wmi、api)。然后运行有两种方式写入注册表的批处理(WMI和reg.exe)。然后一个vbs文件有两种方式(WMI, WSH)。
2。不测试错误
你必须测试错误。唯一可以访问错误的人是YOU. 错误说明发生了什么。您必须修复错误或崩溃。如果没有错误编号、错误来源、它试图做什么和参数,那么询问是没有意义的。
错误是预料之中的。用户可以删除或移动文件,例如。
3。您必须阅读文档
在编程时必须打开。它解释了你需要告诉它什么,它才能以某种方式表现出来。只是输入随机命令(这里的许多命令当然是无效的)或输入随机参数(就像你一样)不起作用。如果你不读它们,你就不知道它们是什么意思。
4。在无助的
当你被告知答案时,你去查找文档中的所有内容,然后谷歌它。
你不回复一个可悲的"它没有工作"。您可以发布错误编号、错误来源、试图执行的操作和参数。
这是如何解码错误
<解码错误/strong>
-2147220978样式的数字是32位有符号整数,用计算器转换为十六进制。
Windows错误(小数字)和COM HResults(通常,但有例外,以8开头,如0x80040154)在WinError.h中定义,除了8007nnnn,您可以查找它包含的窗口错误号。
作为一般规则Windows错误小于65,535 (0xFFFF)。0x80000001开头的错误是COM (Component Object Model) HResults。以0xC0000001开头的错误为NTStatus结果。以0xD0000001开头的错误也是HResult返回的NTStatus值。
NTStatus错误(通常以C开头,如0xC0000022)在NTStatus.h中定义。
.h文件是最好的源代码,因为它包含错误的符号名称,可以提供诸如错误来源之类的线索。FormatMessage不提供符号名,只提供描述。
你可以通过下载平台SDK获得这些文件(它是gb)http://www.microsoft.com/en-us/download/details.aspx%3Fid%3D8279& sa = U& ei = w2IrULDDLsHFmAWbmIHoBg& ved = 0 cbwqfjaa&美国= AFQjCNHZn9-4f2NnuN9o3UWUsOF3wL7HBQ
如果你只想要这两个文件,我把它们放在我的skydrive上,这样我可以在任何地方引用它们。https://skydrive.live.com/redir?resid=E2F0CE17A268A4FA !121
注意internet错误(12,000 - 12,999)是windows错误,但在wininet.h中指定,上面也有。
在其他。h文件中定义了错误。但99%是以上三种。
HResults和NTStatus代码的结构
HResults中的最高位和NTStatus中的两个最高位设置为error。因此,Hresults在出错时启动8,NTStatus在出错时启动C。接下来的14或15位是保留的,其中一些指定了设备——错误在哪个区域。这是读取十六进制时的第三和第四个数字。EG 0xnn07nnnn - HResult设施代码7是一个正常的Windows错误(从COM程序返回-因此它作为HResult返回)。设备代码在Winerror.h中定义为HResults,在NTStatus.h中定义为NTStatus代码。它们是不同的。
解码0x8003nnnn错误
设施代码为3的HResults表示HResult包含OLE结构化存储错误(0x0到0xff)。这些与Dos错误代码相同。这些似乎不在Windows的头文件中,代码列表在这篇文章的末尾。
解码0x8004nnnn错误
设备代码4的HResults意味着HResult包含OLE错误(0x0到0x1ff),而范围的其余部分(0x200起)是组件特定的错误,因此来自一个组件的20e与来自另一个组件的20e具有不同的含义。
这就是为什么错误的来源对于0x80040200以上的错误是特别重要的。
解码0x8007nnnn错误
设备代码为7的HResults表示HResult包含Windows错误代码。你必须查找Windows的错误代码,而不是HResult。
解码0x80070002。0x表示它是一个十六进制数,8表示错误,前7表示它是windows错误,数字的其余部分,2,是实际的windows错误。
要查找错误,我们需要它的十进制格式。启动计算器(开始-所有程序-附件-计算器),选择"查看菜单-科学",然后选择"查看菜单-十六进制"。输入2。然后查看菜单-十进制。它会显示2.
启动命令提示符(开始-所有程序-附件-命令提示符)并键入
net helpmsg 2
然后显示
The system cannot find the file specified.
或在winerror.h
中查找//
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
// The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND 2L
解码0x8019nnnn错误
h设施0x19的结果是HTTP错误。16384 (0x4000)下的代码与HTTP错误相同,例如HTTP状态404:请求的URL不存在于服务器上是0x80190194 (0x194 = 404)。代码16,384及以上是BITS特有的。
解码0xDnnnnnnn错误
从0xD开始的HResults是带有NTStatus值的HResult。只需将引线D更改为C并将其视为NTStatus (Hresult = NTStatus或0x10000000)。
Dos错误码(用于0x8003nnnn错误)
Code Message
01 Invalid function number
02 File not found
03 Path not found
04 Too many open files (no handles left)
05 Access denied
06 Invalid handle
07 Memory control blocks destroyed
08 Insufficient memory
09 Invalid memory block address
0A Invalid environment
0B Invalid format
0C Invalid access mode (open mode is invalid)
0D Invalid data
0E Reserved
0F Invalid drive specified
10 Attempt to remove current directory
11 Not same device
12 No more files
13 Attempt to write on a write-protected diskette
14 Unknown unit
15 Drive not ready
16 Unknown command
17 CRC error
18 Bad request structure length
19 Seek error
1A Unknown media type
1B Sector not found
1C Printer out of paper
1D Write fault
1E Read fault
1F General failure
20 Sharing violation
21 Lock violation
22 Invalid disk change
23 FCB unavailable
24 Sharing buffer overflow
25 Reserved
26 Unable to complete file operation (DOS 4.x)
27-31 Reserved
32 Network request not supported
33 Remote computer not listening
34 Duplicate name on network
35 Network name not found
36 Network busy
37 Network device no longer exists
38 NetBIOS command limit exceeded
39 Network adapter error
3A Incorrect network response
3B Unexpected network error
3C Incompatible remote adapter
3D Print queue full
3E No space for print file
3F Print file deleted
40 Network name deleted
41 Access denied
42 Network device type incorrect
43 Network name not found
44 Network name limit exceeded
45 NetBIOS session limit exceeded
46 Temporarily paused
47 Network request not accepted
48 Print or disk redirection is paused
49-4F Reserved
50 File already exists
51 Reserved
52 Cannot make directory entry
53 Fail on INT 24
54 Too many redirections
55 Duplicate redirection
56 Invalid password
57 Invalid parameter
58 Network device fault
59 Function not supported by network (DOS 4.x)
5A Required system component not installed (DOS 4.x)
Facility Codes
NTStatus Facilities HResults Facilities
Common status values 0x0 Null 0x0
Debugger 0x1 Rpc 0x1
Rpc_runtime 0x2 Dispatch 0x2
Rpc_stubs 0x3 Storage 0x3
Io_error_code 0x4 Itf 0x4
Various drivers 0x5-0xf Win32 0x7
Ntwin32 0x7 Windows 0x8
Ntsspi 0x9 Sspi 0x9
Terminal_server 0xa Security 0x9
Faciltiy_mui_error_code 0xb Control 0xa
Usb_error_code 0x10 Cert 0xb
Hid_error_code 0x11 Internet 0xc
Firewire_error_code 0x12 Mediaserver 0xd
Cluster_error_code 0x13 Msmq 0xe
Acpi_error_code 0x14 Setupapi 0xf
Sxs_error_code 0x15 Scard 0x10
Transaction 0x19 Complus 0x11
Commonlog 0x1a Aaf 0x12
Video 0x1b Urt 0x13
Filter_manager 0x1c Acs 0x14
Monitor 0x1d Dplay 0x15
Graphics_kernel 0x1e Umi 0x16
Driver_framework 0x20 Sxs 0x17
Fve_error_code 0x21 Windows_ce 0x18
Fwp_error_code 0x22 Http 0x19
Ndis_error_code 0x23 Usermode_commonlog 0x1a
Hypervisor 0x35 Usermode_filter_manager 0x1f
Ipsec 0x36 Backgroundcopy 0x20
Maximum_value 0x37 Configuration 0x21
State_management 0x22
Metadirectory 0x23
Windowsupdate 0x24
Directoryservice 0x25
Graphics 0x26
Shell 0x27
Tpm_services 0x28
Tpm_software 0x29
Pla 0x30
Fve 0x31
Fwp 0x32
Winrm 0x33
Ndis 0x34
Usermode_hypervisor 0x35
Cmi 0x36
Windows_defender 0x50
- 如何在 c++ 窗口中将参数和返回的退出值传递到批处理文件/从批处理文件获取返回的退出值
- 从之前添加的批处理文件中删除单词
- 无法从C++ Windows 服务执行批处理文件
- 如何将批处理文件的输出读取到C 中的字符串中
- cmake:生成批处理文件调用cl.exe
- 如何运行批处理文件和读取输出
- GetCommandLine():无法从批处理文件(GCC-Compiler)传递多行参数
- exe文件不被识别为内部或外部命令,可操作的程序或批处理文件在C++
- 您如何使用System()调用带有引号的参数的批处理文件
- 重命名批处理文件(删除名称中的一些符号)(python/matlab/shell)
- 对桌面进行了更改.ini使用批处理文件,但文件夹图标不会更改
- 如何将字符串转换为批处理文件中的整数
- 为什么我不能在Windows Server 2008中使用System()从服务启动批处理文件
- c++ 使用创建过程执行批处理文件
- CreateProcess执行批处理文件
- QT批处理文件未执行
- 使用路径中的空格从C++执行批处理文件
- 如何执行批处理文件从C/ c++ w/o控制台窗口
- 是批处理文件,不像shell脚本那样可执行
- 系统()调用批处理可执行流文件使程序在windows上重置