c# - 在 C# 中使用 TaskDialog 时出现 EntryPointNotFoundException

标签 c# windows-7 pinvoke taskdialog

我正在使用以下代码来调用 TaskDialog。

    [DllImport("ComCtl32", CharSet = CharSet.Unicode, PreserveSig = false)]
    internal static extern void TaskDialogIndirect(
        [In] ref TASKDIALOGCONFIG pTaskConfig,
        [Out] out int pnButton,
        [Out] out int pnRadioButton,
        [Out] out bool pfVerificationFlagChecked);

但是,我收到异常“无法在 DLL 'ComCtl32' 中找到名为 'TaskDialogIndirect' 的入口点。”

我拿了this code .我使用的是 Windows 7 x64 (RC)。

我做错了什么?

最佳答案

除了这是一个 vista 功能之外别无其他

更新: 这个问题与并排程序集有关:这些功能仅存在于 comctl32.dll 版本 6 中,但是,出于兼容性原因,Vista 将加载早期版本,除非您另有说明。大多数人(包括我)一直采用的方法是使用 list 。这已被证明是棘手的,并且可能不是正确的解决方案,尤其是如果您正在编写的是一个库:您不一定要强制整个应用程序使用公共(public)控件 6。

正确的解决方案是推送 new activation调用其中一个仅限 Vista 的 API 时的上下文。激活上下文将使用正确版本的 comctl32.dll,同时保留应用程序的其余部分,并且不需要 list 。

幸运的是,这很容易做到。一些完整的代码已经存在MS Knowledgebase .文章 (KB 830033) 中的代码按原样执行此操作。

替代托管 API: 可以在此处找到 Vista 的 TaskDialog 和 TaskDialogIndirect 的完整包装器:

http://code.msdn.microsoft.com/WindowsAPICodePack

对于 WPF 使用以下内容:

http://code.msdn.microsoft.com/VistaBridge 下载“VistaBridge 示例库”下载后,打开项目然后构建它(如果要查看所有代码,请检查\Library 或\Interop 文件夹中的文件)。您现在可以从 VistaBridge\bin\debug\获取 DLL 并在您的项目中添加对它的引用,同时您必须为每个不同的 VistaBridge 模块添加一个 using 语句。例如:

使用 Microsoft.SDK.Samples.VistaBridge.Interop 或 .Library 或 .Properties 或 .Services - 取决于您的需要。

VistaBridge 项目包括用于许多其他 Vista 功能(例如 TaskDialog、Vista OpenFile 和 SaveFile 对话框,当然还有 Aero Glass Effects)的 API,以运行 VistaBridge 项目来尝试这些功能。

关于c# - 在 C# 中使用 TaskDialog 时出现 EntryPointNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1612351/

相关文章:

c# - 确定窗口是否在最顶层

C# 和 C++,从 C# 调用 C++ dll 时出现运行时错误

c# - 如何将 PHP cURLcode 转换为 C# HttpWebRequest?

c# - 尽管已添加到我的项目中但无法使用 Bootstrap

CMD 上不显示 JAVA 版本

c# - StreamWriter 打开时修改日期不会更新

c# - 在 .NET Web 应用程序中使用 C 库

c# - 从 appsettings.json 获取 Nlog 值

c# - 了解数据绑定(bind)如何在 UserControl 的 DependencyProperty 及其宿主应用程序的属性之间工作

Windows 上的 Git : "I don' t handle protocol 'git clone http' "