Perl 模块 XML::Expat 无法在 IIS 7 和 Windows 2008 下动态加载

Perl 模块 XML::Expat 无法在 IIS 7 和 Windows 2008 下动态加载

我们正在将旧的 Perl/CGI 应用程序内部迁移到新系统,但遇到了问题。当我运行:

 perl -MXML::Parser -e 1

从命令行来看,一切都很好。然而,当我从 CGI 脚本中运行它时use XML::Parser,一切都变得一团糟:

无法为模块 XML::Parser::Expat 加载“C:/strawberry/perl/site/lib/auto/XML/Parser/Expat/Expat.dll”:load_file:在 C:/strawberry/perl/lib/DynaLoader.pm 第 200 行,第 55 行找不到指定的模块。在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 18 行,在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 18 行,第 55 行,require 中编译失败。BEGIN 失败 - 编译在 C:/strawberry/perl/site/lib/XML/Parser.pm 第 22 行,第 55 行中止。在 (eval 43) 第 1 行,第 55 行,require 中编译失败。BEGIN 失败 - 编译在 (eval 43) 第 1 行,第 55 行中止。

添加到 perl 安装上的其他模块工作正常(MD5、WIn32::ODBC 等...)但这个 Expat 模块却出现问题。

该服务器是 IIS 7(对于我们这个应用程序来说是新的),x64 Win2008(对于我们来说也是新的)。

编辑:

经过一段时间的折腾,我发现这并不是唯一一个无法加载的模块。XML::Simple 也一样。几乎是同样的错误。Perl 声称不存在的 DLL 却存在得很好。而且从命令行也可以正常工作。

有什么建议吗?

答案1

Windows 版 Perl 发行版的 Cwd.pm 中有一个错误。请参阅https://rt.cpan.org/Public/Bug/Display.html?id=56225了解详情。

对我有用的修复方法是替换此行:

if (eval 'defined &DynaLoader::boot_DynaLoader') {

if (eval { defined &DynaLoader::boot_DynaLoader; }) {

sub _win32_cwd

我还在这里找到了更多相关信息:www.epic-ide.org/faq.php#debug

答案2

抱歉,我自己回答了这个问题,但是我偶然发现了这一点......

经过几个小时的摸索,问题出在 IIS 应用程序池设置上。如果您加载用户配置文件设置错误的然后 PerlDynaloader本身就会崩溃,什么都不起作用——而且没有特别有用的消息。我不知道哪个是默认值,但是如果默认值为 false 则会导致一切失败。

现在一切运行良好,以下是应用程序池中的设置:

32 位:已启用用户:应用程序池加载用户配置文件:True

我尝试让 CGI 程序以真实用户身份运行(我在命令行中使用的用户),并注意到即使我设置了正确的用户,我也没有获得我想要的环境,从而发现了这一点。拨动此开关使一切正常。最终我回到使用应用程序池,但确认这个开关是原因。

相关内容