在DLL文件'ComCtl32'中无法找到名为'TaskDialogIndirect'的入口点

7

我们有一台特定的Vista x64机器,在运行我们的C# WinForms应用程序时,显示以下错误:

System.EntryPointNotFoundException: 找不到名为'TaskDialogIndirect'的入口点, 在DLL“ComCtl32”中。

这段代码在其他Vista机器上运行良好。由于某种原因,这台特定的Vista机器总是抛出此异常。

我们该如何解决这个问题?

4个回答

10

我在使用Naughter的免费XTaskDialog API时遇到了问题,因为要借助模拟实现在Windows XP机器上实现降级功能,从而使此对话框实现更加有用。 :)

在我的情况下,这是一个激活上下文问题,正如这篇博客文章所提到的。

或者,如果博客文章有一天在网络上消失了(适用于Visual Studio):

  1. 在“解决方案资源管理器”中打开项目属性,
  2. 单击“安全性”选项卡,在其中选择“启用 ClickOnce 安全设置”,
  3. 现在您可以在解决方案的“属性”文件夹中看到 app.manifest 文件,打开它,
  4. 在 </trustInfo> 标记下面插入以下代码。
  5. 尝试构建可能会出现错误。为了修复它,请取消选中“启用 ClickOnce 安全设置”。

第4步要插入的代码:

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" 
        version="6.0.0.0" processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df" language="*" />
  </dependentAssembly>
</dependency>

我在一个dll库项目(Excel插件)中遇到了同样的问题。在VS studio中,库项目没有安全选项卡? - Niels Bosma
1
目前(VS 2012/2013),此解决方案不起作用:( 然而,这个解决方案非常好用:http://support.microsoft.com/kb/830033 - Sverrir Sigmundarson
虽然这是一个旧的帖子,但我想补充一下,现在你可以通过使用“项目”>“添加文件”命令来添加一个app.manifest文件。@jonas - 谢谢,你的答案帮助了我将近10年后。 ;) - Dax Pandhi

1

页面未找到 :-( - itsho

1

我建议比较工作和不工作的Vista机器上comctl32.dll的版本 - 即使它们报告相同的版本,也要比较它们的校验和。

其他需要检查的事项:

  • 非工作机器是否有预发布版本的Vista?
  • 是否可能将非Vista版本的comctl32.dll复制到计算机上,并被应用程序捕获?(附带Visual Studio的Depends实用程序可能会有所帮助。)
  • 是否可能病毒或蠕虫(或其他)已替换了comctl32.dll?

阅读这篇article关于激活上下文也是值得一试的。


谢谢,我们会看一下这个。如果它能帮助我们找到答案,我会接受你的回答为正确的。 - Judah Gabriel Himango

1
如果你之前运行程序的机器使用的是Vista x86,那么你的代码中可能有一个PInvoke引起了问题。你可以尝试将编译器目标架构设置为x86,强制程序在x64 Vista上的WoW64中运行。默认情况下,Visual Studio使用无架构方式构建程序集的设置。这意味着当你尝试在64位系统上运行.NET程序时,它应该由本地x64版本的CLR托管运行。在该上下文中尝试加载32位DLL将会失败。相反,强制应用程序在模拟的x86模式下运行应该就可以解决问题了。

谢谢,但我们已经将应用程序设置为编译为x86,因为我们使用了一些不支持x64的组件。 - Judah Gabriel Himango

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接