请问vb.net如何调用任务对话框(TaskDialogIndirect)

上次的VB.net调用TaskDialog已经自己弄好了,但是现在有个TaskDialogIndirect是真的不会,弄了半天总是显示“
System.ArgumentNullException:“值不能为 null。
Arg_ParamName_Name”
”,麻烦懂行的高人指点一下,感激不尽(如果有需要,我可以提供源代码以及错误信息)
有关任务对话框(TaskDialogIndirect),参见
https://learn.microsoft.com/zh-cn/windows/win32/api/commctrl/nf-commctrl-taskdialogindirect

函数原型有没有错

<DllImport("comctl32.dll", ExactSpelling:=True, CharSet:=CharSet.Unicode)>
Private Shared Function TaskDialogIndirect(
    ByRef pTaskConfig As TASKDIALOGCONFIG,
    ByRef pnButton As Integer,
    ByRef pnRadioButton As Integer,
    <MarshalAs(UnmanagedType.Bool)> ByRef pfverificationFlagChecked As Boolean
) As UInteger
End Function

参考下 https://www.pinvoke.net/default.aspx/comctl32.taskdialogindirect

是否有可以重现问题的最小示例代码?你也可以尝试查参考这里的解决方案对你是否有帮助,其中有链接提到了vb中的用法。

Imports System.Runtime.InteropServices

Public Class Form2
    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
    Public Structure TASKDIALOGCONFIG
        Public cbSize As UInteger
        Public hwndParent As IntPtr
        Public hInstance As IntPtr
        Public dwFlags As TASKDIALOG_FLAGS
        Public dwCommonButtons As TASKDIALOG_COMMON_BUTTON_FLAGS
        Public pszWindowTitle As String
        Public dwMainIcon As IntPtr
        Public pszMainInstruction As String
        Public pszContent As String
        Public cButtons As UInteger
        Public pButtons As IntPtr
        Public nDefaultButton As Integer
        Public cRadioButtons As UInteger
        Public pRadioButtons As IntPtr
        Public nDefaultRadioButton As Integer
        Public pszVerificationText As String
        Public pszExpandedInformation As String
        Public pszExpandedControlText As String
        Public pszCollapsedControlText As String
        Public dwFooterIcon As IntPtr
        Public pszFooter As String
        Public pCallback As IntPtr
        Public lpCallbackData As IntPtr
        Public cxWidth As UInteger
    End Structure

    <Flags>
    Public Enum TASKDIALOG_FLAGS
        TDF_ENABLE_HYPERLINKS = &H1
        TDF_USE_HICON_MAIN = &H2
        TDF_USE_HICON_FOOTER = &H4
        TDF_ALLOW_DIALOG_CANCELLATION = &H8
        TDF_USE_COMMAND_LINKS = &H10
        TDF_USE_COMMAND_LINKS_NO_ICON = &H20
        TDF_EXPAND_FOOTER_AREA = &H40
        TDF_EXPANDED_BY_DEFAULT = &H80
        TDF_VERIFICATION_FLAG_CHECKED = &H100
        TDF_SHOW_PROGRESS_BAR = &H200
        TDF_SHOW_MARQUEE_PROGRESS_BAR = &H400
        TDF_CALLBACK_TIMER = &H800
        TDF_POSITION_RELATIVE_TO_WINDOW = &H1000
        TDF_RTL_LAYOUT = &H2000
        TDF_NO_DEFAULT_RADIO_BUTTON = &H4000
        TDF_CAN_BE_MINIMIZED = &H8000
        TDF_SIZE_TO_CONTENT = &H10000
        TDF_ICON_MAIN = &H20000
        TDF_ICON_FOOTER = &H40000
        TDF_USER_PREFERENCE = &H40000
        TDF_NO_SET_FOREGROUND = &H80000
        TDF_REVERSE_BUTTON_ORDER = &H100000
    End Enum

    <Flags>
    Public Enum TASKDIALOG_COMMON_BUTTON_FLAGS
        TDCBF_OK_BUTTON = &H1
        TDCBF_YES_BUTTON = &H2
        TDCBF_NO_BUTTON = &H4
        TDCBF_CANCEL_BUTTON = &H8
        TDCBF_RETRY_BUTTON = &H10
        TDCBF_CLOSE_BUTTON = &H20
    End Enum

    Public Delegate Function TaskDialogCallback(ByVal hwnd As IntPtr, ByVal msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr, ByVal lpRefData As IntPtr) As Integer
    <DllImport("Comctl32.dll", CharSet:=CharSet.Unicode, PreserveSig:=False)>
    Public Shared Function TaskDialogIndirect(ByVal pTaskConfig As IntPtr, ByRef pnButton As Integer, ByRef pnRadioButton As Integer, ByRef pfVerificationFlagChecked As Boolean) As Integer
    End Function
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim config As New TASKDIALOGCONFIG()
        config.cbSize = CUInt(Marshal.SizeOf(config))
        config.hwndParent = Me.Handle ' 设置父窗口句柄
        config.hInstance = IntPtr.Zero ' 设置实例句柄
        config.dwFlags = TASKDIALOG_FLAGS.TDF_ENABLE_HYPERLINKS Or TASKDIALOG_FLAGS.TDF_ALLOW_DIALOG_CANCELLATION
        config.dwCommonButtons = TASKDIALOG_COMMON_BUTTON_FLAGS.TDCBF_OK_BUTTON Or TASKDIALOG_COMMON_BUTTON_FLAGS.TDCBF_CANCEL_BUTTON ' 设置常用按钮
        config.pszWindowTitle = "Title"
        config.dwMainIcon = IntPtr.Zero ' 设置主图标句柄
        config.pszMainInstruction = "Main Instruction"
        config.pszContent = "Content"
        config.cButtons = 2 ' 设置按钮数量
        config.pButtons = Marshal.StringToHGlobalUni("Button 1" & vbNullChar & "Button 2") ' 设置按钮文本
        config.nDefaultButton = 1 ' 设置默认按钮索引
        config.cRadioButtons = 2
        config.pRadioButtons = Marshal.StringToHGlobalUni("Button 3" & vbNullChar & "Button 4") ' 设置按钮文本
        config.nDefaultRadioButton = 1
        config.pszVerificationText = " "
        config.pszExpandedInformation = " "
        config.pszExpandedControlText = " "
        config.pszCollapsedControlText = " "
        config.dwFooterIcon = 65543
        config.pszFooter = "e"
        config.pCallback = 0
        config.lpCallbackData = 0
        config.cxWidth = 0
        Dim pConfig As IntPtr = IntPtr.Zero
        Marshal.StructureToPtr(config, pConfig, False)
        Dim buttonResult As Integer = 0
        Dim radioButtonResult As Integer = 0
        Dim verificationFlagChecked As Boolean = False

        TaskDialogIndirect(pConfig, buttonResult, radioButtonResult, verificationFlagChecked)
        Marshal.FreeHGlobal(pConfig)
    End Sub
End Class

源代码在这,大家可以拿去分析一下,这个是C知道写的