Prebuild事件在Windows 7中有效,在XP中失败

时间:2011-06-21 20:49:25

标签: delphi windows-xp delphi-2009

我有一个预构建事件,用于生成嵌入我的exe中的版本/内部版本号。该事件包括对批处理文件的调用,该批处理文件执行实际工作(参数传递给批处理文件)。批处理文件在我尝试过的所有计算机上都能正常工作,包括Windows XP计算机。它也可以在运行Windows 7的3台计算机上作为预构建事件运行良好。但是,预构建事件在Windows XP上失败。 Delphi返回一个错误代码,我似乎找不到任何地方的引用,“20018”。

我尝试了多种方式来调用批处理文件而没有任何运气。有没有人知道发生了什么?

构建事件如下:

call "..\..\Build Tools\PreBuild.bat" "$(PROJECTDIR)"

更新: 我删除了批处理文件的来源,因为它与实际问题无关。

2 个答案:

答案 0 :(得分:2)

你提供的信息很少,我很想投票结束。相反,我会冒险猜测。您应该在构建后步骤中发布命令。

如果您不知道哪条线路出现故障,请单独尝试第一条线路,然后移除其余线路,看看是否通过。

例如,我经常在后期构建步骤中使用XCOPY命令在XP机器上遇到问题,而这些命令通常会导致我无法诊断或确定其含义的奇怪错误代码。因此,如果你有一个XCOPY命令,你应该在构建环境内外尝试XCOPY,看看它是否适用于那个Windows XP盒子。

您可以在Rad Studio IDE的“输出”选项卡中以宏的扩展形式复制运行时的命令,将它们粘贴到记事本中,将它们作为批处理文件运行,并尝试弄清楚为什么他们不能在Windows XP上工作。

以下是使用XCOPY的变通方法示例。如果在XP上失败,我会调整它直到它起作用:

 XCOPY  SourceDir DestDir

我不得不这样修理它:

 XCOPY.exe  SourceDir DestDir

在另一个案例中,我发现我必须以这种方式修复它:

 call XCOPY SourceDir DestDir

您还提到您只是运行一个神秘的批处理文件而您没有提及它的作用。让我们看看,我们可以采用不同的方式从后期构建步骤运行批处理文件....当我运行这样的批处理文件时,我有时会在XP上遇到问题,如下所示:

batchfilename.cmd

但是当我以不同的方式运行它时,我发现它在XP上运行,但我丢失了命令行输出:

call batchfilename.cmd

在IDE中运行后构建步骤时似乎发生了一些奇怪的事情,这可以通过以各种形式在IDE外部尝试命令来解决。

你提到的数字(20018)是google搜索的一个愚蠢的东西,它可能是你在批处理文件中运行的任何工具的ERRORLEVEL(命令shell的返回值)。既然你没有告诉我们你正在运行什么工具,我想知道你是否已经完成了基本步骤,看看当你在那台XP机器上运行IDE批处理文件时会发生什么。我的猜测是,如果它不是来自你自己的批处理文件,它来自MSBUILD本身的内部深处,这是很少有德尔福人会知道源代码的东西(甚至Delphi团队本身也在使用来自Microsoft的二进制文件,用于提供MSBUild功能)。我注意到MSBUILD用于执行构建后和预构建步骤的内置任务是IDE的一个需要改进的领域,特别是在调试这样的问题时。但是,您可以在IDE外部运行它们,看看它们是否以这种方式工作,并且您可以尝试一些内容,如上所述。

如果this是您的批处理文件...我建议由于依赖性问题,您可能不希望使用这种批处理文件技术来修改RC文件,因为它可能会暴露一些奇怪的依赖性问题。带有RAD / Delphi构建任务的MSBUILD。我也看到了一些奇怪的BRCC32故障,在XP上我无法重现。

答案 1 :(得分:2)

好的,我终于找到了答案: http://delphi.about.com/od/devutilities/a/pre_post_build.htm

问题是要调用批处理文件的路径中的空格。显然这不是Windows 7中的问题。

删除构建工具目录中的空间并将预构建事件更改为以下内容解决了问题:

call ..\..\BuildTools\PreBuild.bat "$(PROJECTDIR)"

以下是链接中的重要信息:

  

命令行:这是所有人中最棘手的,但是在你完成一个工作后,他们都很容易。这里的诀窍是不要在程序名称上使用引号,而是使用Windows SFN(短文件名)。原因是,如果您需要使用引号来封闭文件的路径,IDE会因为引用太多而混淆。所以,这些是在上面添加命令行的错误方法:

     

C:\ Program Files \ SoftwarePassport \ Armadillo.exe D:\ Dev \ My Prog \ Prot.arm / P

     

“C:\ Program Files \ SoftwarePassport \ Armadillo.exe”D:\ Dev \ My Prog \ Prot.arm / P

     

C:\ Program Files \ SoftwarePassport \ Armadillo.exe“D:\ Dev \ My Prog \ Prot.arm”/ P

     

“C:\ Program Files \ SoftwarePassport \ Armadillo.exe”“D:\ Dev \ My Prog \ Prot.arm”/ P

     

如果IDE不与它混淆,那么最后一个应该可以工作。那么,它们的作用是什么:   C:\ Progra~1 \ Softwa~1 \ Armadillo.exe“D:\ Dev \ My Prog \ Prot.arm”/ P

     

C:\ Progra~1 \ SoftwarePassport \ Armadillo.exe“D:\ Dev \ My Prog \ Prot.arm”/ P