6

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

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

同样的代码在其他 Vista 机器上也能正常工作。出于某种原因,这台特定的 Vista 机器总是抛出这个异常。

我们如何解决这个问题?

4

4 回答 4

10

我遇到了这个问题和 Naughter 的免费XTaskDialog API,通过仿真在 Windows XP 机器上获得回退机制,使这个对话框实现更加有用。:)

就我而言,这是一个激活上下文问题,如本博客条目中所述。

或者,在这里引用,以防有一天博客文章在网络空间中丢失(适用于 Visual Studio):

  1. 在解决方案资源管理器中打开您的项目属性,
  2. 在安全选项卡上,选中启用 ClickOnce 安全设置,
  3. 现在您可以看到 app.manifest 文件出现在解决方案的 Properties 文件夹中,打开它,
  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>
于 2009-12-14T14:48:30.457 回答
1

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

其他要检查的事项:

  • 不工作的机器有没有可能有Vista的预发布版本?
  • 是否有可能将非 Vista 版本的 comctl32.dll 复制到机器上并被应用程序拾取?(Visual Studio 附带的 Depends 实用程序在这里可能会有所帮助。)
  • 是否有可能是病毒或蠕虫(或其他什么)取代了 comctl32.dll?

这篇关于激活上下文的文章可能也值得阅读。

于 2009-04-05T17:26:57.547 回答
1

如果您用来运行该程序的其他机器使用的是 Vista x86,那么您的代码中可能存在导致问题的 PInvoke。您可能想尝试将编译器目标体系结构设置为 x86,以强制您的程序在 x64 Vista 上的 WoW64 中运行。默认情况下,Visual Studio 使用设置以与体系结构无关的方式构建程序集。这意味着当您尝试在 64 位系统上运行 .NET 程序时,它应该由 CLR 的本机 x64 版本托管。尝试在该上下文中加载 32 位 DLL 将失败。相反,强制应用程序以模拟 x86 模式运行应该可以解决问题。

于 2009-04-05T17:27:20.027 回答
1

今天使用 ClickOnce 应用程序遇到了这个问题。

唯一有效的是这个解决方案:http: //support.microsoft.com/kb/830033

Internet 存档作为原始链接已变暗 https://web.archive.org/web/20110313122806/http://support.microsoft.com/kb/830033

于 2014-10-01T13:38:47.627 回答