Apache/Perl在没有CommonProgramFiles(x86)的情况下无法找到MDAC



我在使用Apache/Perl使用Microsoft数据访问组件(MDAC)访问Excel文件时遇到问题。不知怎的,我必须设置"CommonProgramFiles(x86)"系统环境变量才能使其工作。否则,我会不断收到以下错误消息:

System.InvalidOperationException:.Net Framework数据提供程序需要Microsoft数据访问组件(MDAC)。请安装Microsoft数据访问组件(MDAC)2.6版或更高版本。--->System.IO.FileNotFoundException:正在检索的COM类工厂CLSID为{2206CDB2-19C1-11D1-89E0-00C04FD7A829}的组件由于到以下错误:8007007e。

服务器配置为:

  • 64位中的Windows Server 2008 R2

  • 服务器安装了Microsoft Access数据库引擎2010

  • Apache 2.2.25(即32位)

  • Perl 5.12.3 v5(也是32位)

  • 我有我的Perl CGI脚本来调用我的C#程序(它是为"任何CPU"构建的)。

  • C#程序使用MDAC打开和读取Excel文件(不尝试启动Excel,只尝试从Excel文件中读取数据)。

我已经验证了服务器在以下两个文件夹中有可用的最新MDAC:

C:Program FilesCommon FilesSystemOle DB
C:Program Files (x86)Common FilesSystemOle DB

我还检查了注册表,它们看起来很好。无论如何,我在命令提示符下直接运行C#程序没有任何问题(它可以使用MDAC访问Excel文件)。只有当我使用Apache/Perl使用我的PerlCGI脚本来调用我的C#程序时(也就是说,当我在MDAC中遇到错误时),我才会遇到问题。

我可以通过在我的Perl CGI脚本中指定CommonProgramFiles(x86)来解决这个问题,如下所示:

$ENV{ "CommonProgramFiles(x86)" } = "C:\Program Files (x86)\Common Files";

我有一个问题:

  • 为什么我有这个问题?为什么设置CommonProgramFiles(x86)系统环境变量可以解决这个问题?为什么在我设置系统环境变量之前它是空的?这是否与我在64位的Windows操作系统中运行32位Apache/Perl有关

请帮助我理解这个问题。提前谢谢。

(这篇文章的原始版本有一个关于第二个问题的问题。原来这个问题与字符串中多了一个双引号有关。我解决了这个问题,这个问题已经消失了。这就是为什么我从帖子中删除了第二个问题)

我做了更多的研究,问题如下:在2.4.9版本之前,Apache启动例程已经映射了"公共程序文件(x86)";至";公共程序文件_x86_;除非你创建它,否则该变量在环境中不存在……我还没有测试过它,但创建该环境变量并使其指向与公共程序文件(x86)相同的位置可能也会解决这个问题。

由于编译后的Apache发行版只使用2.4.46版本,因此它们没有允许在环境变量中使用括号的修复程序。这就是为什么您仍然需要PassEnv指令来确保Apache将正确的值传递给32位CGI脚本。

以下帖子提供了一些有用的详细信息:https://bz.apache.org/bugzilla/show_bug.cgi?id=46751

我曾经在Apache 2.4中遇到过同样的问题,dBase编译的应用程序使用ADO-32位,因为dBase是32位的。最近发生了一些变化,可能是Windows 10 2004 20H2。我在2020年7-8月需要这个修复程序,但现在我没有,环境变量已经存在。由于我的Apache版本日期为2020年4月,所以这不能成为更改的原因。

我试图对此进行一些研究,但我所能发现的是,这些环境变量是至少自2017年以来存在的系统变量,所以我为什么需要设置这个var对我来说是个谜,但我想了解这一点,所以如果你发现了什么,请发布后续。。。

https://learn.microsoft.com/en-us/windows/deployment/usmt/usmt-recognized-environment-variables

相关内容

最新更新