C++ 尝试写入.rc文件的VBS脚本返回错误

C++ 尝试写入.rc文件的VBS脚本返回错误,c++,vbscript,resources,C++,Vbscript,Resources,我试图找到一个进程,通过它编辑和写入resource.rc文件;我尝试使用中列出的示例代码 但两个示例中的最后一行返回了相同的错误(fso.OpenTextFile(rcfile,2.Write rctext): 我修改了脚本,将其写入.txt文件,效果很好,但我不知道是什么原因导致写入.rc文件时出现问题。来自链接示例(简化) 想法是读取所有文件,只要没有变量保存对已打开文件的引用,就将其关闭,然后更改需要更改的内容并再次打开文件,现在进行写入,并将更改的内容写入文件 而且,通常情况下,它是有

我试图找到一个进程,通过它编辑和写入resource.rc文件;我尝试使用中列出的示例代码 但两个示例中的最后一行返回了相同的错误(fso.OpenTextFile(rcfile,2.Write rctext):

我修改了脚本,将其写入.txt文件,效果很好,但我不知道是什么原因导致写入.rc文件时出现问题。

来自链接示例(简化)

想法是读取所有文件,只要没有变量保存对已打开文件的引用,就将其关闭,然后更改需要更改的内容并再次打开文件,现在进行写入,并将更改的内容写入文件

而且,通常情况下,它是有效的。但有时打开读取的文件关闭速度不够快,无法在以后打开进行写入

要确保文件已关闭,然后可以打开进行写入,请将读取代码更改为

set f = fso.OpenTextFile(rcfile)
rctext = f.ReadAll
f.Close
作为你的台词

fso.OpenTextFile(rcfile, 2).Write rctext 
做三件事(访问fso、打开文件、写入文件),有很多事情可能会出错。有关前两个操作的问题,请参阅。另一个问题是写作

在您的情况下,证据-与a.txt一起使用,但与b.rc不一起使用-使得文件的打开不太可能是罪魁祸首(因此.Close不会保存您)。我怀疑.rc包含textstream无法编码的Unicode(UTF-8/UTF-16)数据


因此,要么使用参数读/写,要么使用UTF-16编码打开文件,要么使用UTF-8打开文件。

我的问题的答案似乎需要两个答案(@MC ND和@Ekkehard.Horner);此外,当我更改vbs脚本以Unicode格式打开并写入.rc文件(我不知道为什么必须这样做)后,脚本就能够无误地执行

以下是最终形式的vbs脚本:

Const ForReading = 1, ForWriting = 2
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const DoNotCreate = false

rcFile  = "C:\Path\To\RC\File.rc"
major   = 4
minor   = 3
maint   = 2
build   = 1
version = major & "," & minor & "," & maint & "," & build

Set fso     = CreateObject("Scripting.FileSystemObject")
Set fileObj = fso.OpenTextFile(rcFile, ForReading, DoNotCreate, TristateTrue)
rcText      = fileObj.ReadAll
fileObj.Close

Set regex     = New RegExp
regex.Global  = True
regex.Pattern = "(PRODUCTVERSION|FILEVERSION) \d+,\d+,\d+,\d+"
rcText        = regex.Replace(rcText, "$1 " & version)

regex.Pattern = "(""(ProductVersion|FileVersion)"",) ""\d+, \d+, \d+, \d+"""
rcText        = regex.Replace(rcText, "$1 """ & Replace(version, ",", ", ") & """")

Set fileObj = fso.GetFile(rcFile)
Set textStream = fileObj.OpenAsTextStream(ForWriting, TristateTrue)
textStream.Write rcText
textStream.Close
唯一似乎不起作用的是用于替换ProduceVersion | FileVersion值的正则表达式,但希望我能在合理的时间内解决这个问题

fso.OpenTextFile(rcfile, 2).Write rctext 
Const ForReading = 1, ForWriting = 2
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const DoNotCreate = false

rcFile  = "C:\Path\To\RC\File.rc"
major   = 4
minor   = 3
maint   = 2
build   = 1
version = major & "," & minor & "," & maint & "," & build

Set fso     = CreateObject("Scripting.FileSystemObject")
Set fileObj = fso.OpenTextFile(rcFile, ForReading, DoNotCreate, TristateTrue)
rcText      = fileObj.ReadAll
fileObj.Close

Set regex     = New RegExp
regex.Global  = True
regex.Pattern = "(PRODUCTVERSION|FILEVERSION) \d+,\d+,\d+,\d+"
rcText        = regex.Replace(rcText, "$1 " & version)

regex.Pattern = "(""(ProductVersion|FileVersion)"",) ""\d+, \d+, \d+, \d+"""
rcText        = regex.Replace(rcText, "$1 """ & Replace(version, ",", ", ") & """")

Set fileObj = fso.GetFile(rcFile)
Set textStream = fileObj.OpenAsTextStream(ForWriting, TristateTrue)
textStream.Write rcText
textStream.Close