我正在用 VB6 编写一个项目。我正在使用 Win7-32 位并且项目有问题,这个项目是多年前写的,现在我正在重新编译它。当我发出 Make xxx.exe 命令时,VB6 开始编译并冻结并创建超过 10,000 个 *.tmp 文件,几分钟后它关闭 IDE 并且没有任何结果。我的错误在哪里?
5 回答
对我在编译大型可执行项目时遇到 VB6 冻结问题有效的方法是将 VB 应用程序的 CPU 内核限制为只有一个内核(即 VB6 进程的关联掩码设置为 1)。
请注意,这仅在 VB6 进程以关联掩码设置为 1 的情况下才对我有效,而不仅仅是在 VB 进程启动后强制执行关联掩码(在任务管理器中)。要在关联掩码设置为 1 的情况下启动 VB6,请使用以下快捷方式(分别适用于 64 位和 32 位操作系统)并以管理权限启动它:
C:\Windows\System32\cmd.exe /C start "VisualBasic6" /D "C:\Program Files (x86)\Microsoft Visual Studio\VB98" /AFFINITY 1 "C:\Program Files (x86)\Microsoft Visual Studio \VB98\VB6.EXE"
C:\Windows\System32\cmd.exe /C start "VisualBasic6" /D "C:\Program Files\Microsoft Visual Studio\VB98" /AFFINITY 1 "C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE "
如果这不起作用,请尝试使用上述方法在 VB6 IDE 之外创建您的项目。例如,假设您需要在路径 C:\MyProjects\TestProj 中构建一个名为 testproj.vbp 的项目,请在提升的命令提示符中使用以下命令(分别适用于 64 位和 32 位操作系统):
开始 "VisualBasic6" /D "C:\Program Files (x86)\Microsoft Visual Studio\VB98" /AFFINITY 1 "C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE" /make "C: \MyProjects\TestProj\testproj.vbp" /outdir "C:\MyProjects\TestProj"
开始 "VisualBasic6" /D "C:\Program Files\Microsoft Visual Studio\VB98" /AFFINITY 1 "C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE" /make "C:\MyProjects\TestProj\testproj .vbp" /outdir "C:\MyProjects\TestProj"
不幸的是,VB6 并没有给出编译完成的指示,所以您需要在任务管理器中跟踪 VB6 进程(当编译完成时,VB6 进程将终止)。
仅供参考,我在带有 2 个 Intel Xeon 四核 CPU 的 Windows Server 2012 上运行 VB。
我(令人惊讶地)以前遇到过类似的问题。
最好的解决方案是开始更改您的项目设置。
右键单击您的项目并转到属性。在“编译”选项卡下,转到高级优化。关闭“假定无别名”可能是您最好的选择。但是,如果该按钮被禁用,请尝试从 P-Code 切换到 Native Code。
如果上述更改不起作用,并且您尚未使用 P-Code,请尝试 P-Code。
最后,如果您真的想坚持使用 Native Code,请尝试选择 No Optimization。
如果事情似乎仍然不起作用,只需通过设置并取消选中不同的优化。
如果您在所有这些之后仍然遇到问题,请尝试打开项目中的每个表单和其他文件,并查看特定文件是否只是损坏,这可能导致突然退出。至少通过这种方式,您可以将其跟踪到文件。
如果这一切都失败了,请尝试在不同的操作系统上编译它——但我真的怀疑它会达到那个程度。
祝你好运!
我尝试了每个 PhoeniX_2 建议。他们都没有工作。我不知道是什么让我尝试这个,但我上次编译时,我创建了一个新的 exe 文件名,而不是我以前版本中使用的文件名。谢天谢地,它奏效了。我不明白为什么。这不是权限问题或锁定文件问题。我认为这可能是因为新的编译覆盖了以前编译的 exe 文件。在 2 天的故障排除期间,计算机还重新启动了几次。
因此,如果 Phoenix 的建议都不适合您,那么请尝试编译一个新的 exe 文件名,而不是使用您之前的编译创建的文件名。
我已经找到了我们的原因。我们有用户控件在 Initialize 事件期间尝试连接到数据库。这是一个非常糟糕的主意,因为此事件在编译期间以及 IDE 加载期间运行。它挂了很长时间试图连接到不存在的数据库,然后使编译过程崩溃,因此没有生成 Exe(尽管没有可见的迹象)。
解决方案是在从表单 Load 事件调用的公共方法中执行 db 连接和其他启动代码。似乎没有任何可靠的方法来使用 Initialise。
就个人而言,我在 Windows XP 及更高版本中遇到了 VB6 IDE 的各种问题。
我保留了一个运行 Windows 2000 的虚拟机,并在其中进行任何 VB6 工作。
我几乎没有问题。如果有任何奇怪之处,我只需将 VM 恢复为基线安装。