Question

I have the TaskDialog source directly from the WindowsAPI Pack for .NET (The wrapper) but whenever I try and open a TaskDialog straight in the static void Main() area of my program it throws an EntryPointNotFoundException. However the TaskDialog spawns and shows perfectly fine later on in my code. Why's this?

The code that throws the EntryPointNotFoundException is

/// <summary>
/// TaskDialogIndirect taken from commctl.h
/// </summary>
/// <param name="pTaskConfig">All the parameters about the Task Dialog to Show.</param>
/// <param name="pnButton">The push button pressed.</param>
/// <param name="pnRadioButton">The radio button that was selected.</param>
/// <param name="pfVerificationFlagChecked">The state of the verification checkbox on dismiss of the Task Dialog.</param>
[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);

But what throws me is the fact that identical code in different places can work once but not at another time. It could be something to do with the program not loading references or something but it just blows my mind. The code at the entry point of my app is

try
{
    var taskDialog = new TaskDialog();
    taskDialog.WindowTitle = ".NET Update Notification";
    taskDialog.MainInstruction = "";

    taskDialog.MainIcon = TaskDialogIcon.Error;

    taskDialog.EnableHyperlinks = true;
    taskDialog.Content =
        "Your .NET Framework Version is out-of-date.\nPlease see <a href=\"***********\">the forums</a> for more info.\n\nSorry, but I can't continue without it.\n\n If you had the correct install this message wouldn't appear.";

    taskDialog.Callback =
        new TaskDialogCallback((ActiveTaskDialog _taskDialog, TaskDialogNotificationArgs _args, object _callbackData) =>
            {
                if (_args.Notification == TaskDialogNotification.HyperlinkClicked)
                {
                    Process.Start(_args.Hyperlink);
                }
                return false;
            });

    var doItButton = new TaskDialogButton();
    doItButton.ButtonId = 101;
    doItButton.ButtonText = "Quit";

    taskDialog.Buttons = new TaskDialogButton[] { doItButton };

    int result = taskDialog.Show(null);
    Application.Exit();
}
/*
* Handles the error message regarding ComCtl32.dll not being found.
* In the event of the beautiful TaskDialog above (which uses ComCtl32.dll)
* cannot be opened, fall back to an ugly as **** MessageBox with a '?' Help
* button in the title bar -.-
*/
catch (EntryPointNotFoundException)
{
    MessageBox.Show(
        "Your .NET Framework Version is out-of-date.\nTo find out how to get .NET 4.0 simply visit the forums at *********.\n\nSorry, but I can't continue without it :(",
        ".NET Update Notification", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Thanks for your time :)

Josh

Was it helpful?

Solution

Try this solution from MSDN -

Step 1: Right Click on your project in the solution explorer

Step 2: Select -> Add -> New Item

Step 3: Add an Application Manifest File which is app.manifest in VS 2010

Step 4: Uncomment the last xml section starting from the dependency tag upto /dependency

the Code should look something like this -

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top