سؤال

أنا باستخدام التعليمات البرمجية التالية إلى استدعاء 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);

ومع ذلك أنا على الاستثناء "غير قادر على العثور على نقطة إدخال اسمه 'TaskDialogIndirect' في DLL 'ComCtl32'."

أخذت هذا الرمز.أنا أستخدم ويندوز 7 إلى x64 (RC).

ما الخطأ الذي فعلته ؟

هل كانت مفيدة؟

المحلول

لا شيء ما عدا هذا هو فيستا ميزة

تحديث:هذا probem كان علي القيام به مع جانب الجمعيات:هذه الوظائف موجودة فقط في comctl32.dll الإصدار 6 ، ولكن لأسباب التوافق, Vista تحميل إصدار سابق إلا إذا كنت تقول خلاف ذلك.نهج معظم الناس (بما فيهم أنا) وقد أخذ هو استخدام واضح.هذا وقد ثبت أن تكون صعبة و قد لا يكون الحل الصحيح على أي حال ، خاصة إذا ما كنت تكتب مكتبة:كنت لا تريد بالضرورة أن القوة التطبيق بالكامل استخدام عناصر التحكم الشائعة 6.

الحل الصحيح هو لدفع التفعيل الجديد السياق عند استدعاء أحد فيستا فقط واجهات برمجة التطبيقات.تفعيل سياق استخدام الإصدار الصحيح من comctl32.dll بينما تترك بقية التطبيق وحده ولا يعبر هو مطلوب.

لحسن الحظ, هذا من السهل القيام به.بعض الكامل رمز موجود بالفعل MS المعرفة.رمز من المادة (KB 830033) لا حيلة كما هو.

البديل مدارة API:كامل المجمع فيستا TaskDialog & TaskDialogIndirect يمكن العثور عليها هنا:

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

من أجل استخدام WPF التالية:

تحميل 'VistaBridge مكتبة عينة من http://code.msdn.microsoft.com/VistaBridge تحميلها مرة واحدة ، ثم نبني عليه (إذا كنت تريد أن ننظر من خلال كل رمز ، دراسة الملفات في \المكتبة أو \Interop مجلدات).يمكنك الآن أن تتخذ DLL من VistaBridge\bin\debug\ ثم إضافة مرجع إلى ذلك في المشروع الخاص بك ، يجب إضافة باستخدام بيان لكل من مختلف VistaBridge وحدات.على سبيل المثال:

باستخدام Microsoft.SDK.العينات.VistaBridge.إمكانية التشغيل المتداخل أو .المكتبة أو .أو خصائص .خدمات - اعتمادا على الاحتياجات الخاصة بك.

على VistaBridge ويشمل المشروع API أخرى كثيرة Vista الميزات (مثل TaskDialog, Vista OpenFile و SaveFile الحوارات ، وبالطبع ايرو زجاج الآثار) في محاولة هذه ، تشغيل VistaBridge المشروع.

نصائح أخرى

واستخدام الحوار المهام يتطلب الإصدار 6 من Windows العامة عناصر DLL (COMCTL32.DLL)! لأسباب التوافق، التطبيقات لا ربط هذا الإصدار بشكل افتراضي. طريقة واحدة لربط الإصدار 6 هي وضع ملف البيان جنبا إلى جنب مع تنفيذ الخاص بك (يسمى YourAppName.exe.manifest)، مع المحتوى التالي:

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

وهذا واضح ويمكن أيضا أن تكون جزءا لا يتجزأ كمورد Win32 وداخل قابل للتنفيذ الخاص بك (مع اسم RT_MANIFEST وID تعيينها إلى 1)، إذا كنت لا ترغب في الحصول على ملف مستقل إضافية. البصرية ستوديو يمكن القيام بهذا العمل بالنسبة لك، إذا كنت ربط ملف البيان الخاص بك في خصائص المشروع الخاص بك.

وبناء على الجواب almog.ori (التي حصلت على بعض الروابط اليتامى) I إجراء تغيير صغير إلى رمز مرتبط، أنا في حيرة حول عدة أيام:

MS قاعدة المعرفة ساعد (<لأ href = "HTTPS: //web.archive. غزاله / الإنترنت / 20100302114123 / HTTP: //support.microsoft.com/kb/830033 "يختلط =" نوفولو noreferrer "> أرشيف )، وقانون كامل مع التبني التي قدمها لي:

using System.Runtime.InteropServices;
using System;
using System.Security;
using System.Security.Permissions;
using System.Collections;
using System.IO;
using System.Text;

namespace MyOfficeNetAddin
{
    /// <devdoc>
    ///     This class is intended to use with the C# 'using' statement in
    ///     to activate an activation context for turning on visual theming at
    ///     the beginning of a scope, and have it automatically deactivated
    ///     when the scope is exited.
    /// </devdoc>

[SuppressUnmanagedCodeSecurity]
internal class EnableThemingInScope : IDisposable
{
   // Private data
   private IntPtr cookie; // changed cookie from uint to IntPtr
   private static ACTCTX enableThemingActivationContext;
   private static IntPtr hActCtx;
   private static bool contextCreationSucceeded = false;

   public EnableThemingInScope(bool enable)
   {
     if (enable)
     {
       if (EnsureActivateContextCreated())
       {
         if (!ActivateActCtx(hActCtx, out cookie))
         {
           // Be sure cookie always zero if activation failed
           cookie = IntPtr.Zero;
         }
       }
     }
  }

  // Finalizer removed, that could cause Exceptions
  // ~EnableThemingInScope()
  // {
  //    Dispose(false);
  // }

  void IDisposable.Dispose()
  {
     Dispose(true);
     GC.SuppressFinalize(this);
  }

  private void Dispose(bool disposing)
  {
     if (cookie != IntPtr.Zero)
     {
        if (DeactivateActCtx(0, cookie))
        {
           // deactivation succeeded...
           cookie = IntPtr.Zero;
        }
     }
  }

  private bool EnsureActivateContextCreated()
  {
   lock (typeof(EnableThemingInScope))
   {
    if (!contextCreationSucceeded)
    {
     // Pull manifest from the .NET Framework install
     // directory

     string assemblyLoc = null;

     FileIOPermission fiop = new FileIOPermission(PermissionState.None);
     fiop.AllFiles = FileIOPermissionAccess.PathDiscovery;
     fiop.Assert();
     try
     {
        assemblyLoc = typeof(Object).Assembly.Location;
     }
     finally
     { 
        CodeAccessPermission.RevertAssert();
     }

     string manifestLoc = null;
     string installDir = null;
     if (assemblyLoc != null)
     {
        installDir = Path.GetDirectoryName(assemblyLoc);
        const string manifestName = "XPThemes.manifest";
        manifestLoc = Path.Combine(installDir, manifestName);
     }

     if (manifestLoc != null && installDir != null)
     {
         enableThemingActivationContext = new ACTCTX();
         enableThemingActivationContext.cbSize = Marshal.SizeOf(typeof(ACTCTX));
         enableThemingActivationContext.lpSource = manifestLoc;

         // Set the lpAssemblyDirectory to the install
         // directory to prevent Win32 Side by Side from
         // looking for comctl32 in the application
         // directory, which could cause a bogus dll to be
         // placed there and open a security hole.
         enableThemingActivationContext.lpAssemblyDirectory = installDir;
         enableThemingActivationContext.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID; 

         // Note this will fail gracefully if file specified
         // by manifestLoc doesn't exist.
         hActCtx = CreateActCtx(ref enableThemingActivationContext);
         contextCreationSucceeded = (hActCtx != new IntPtr(-1));
     }
    }

    // If we return false, we'll try again on the next call into
    // EnsureActivateContextCreated(), which is fine.
    return contextCreationSucceeded;
   }
  }

  // All the pinvoke goo...
  [DllImport("Kernel32.dll")]
  private extern static IntPtr CreateActCtx(ref ACTCTX actctx);

  // changed from uint to IntPtr according to 
  // https://www.pinvoke.net/default.aspx/kernel32.ActiveActCtx
  [DllImport("Kernel32.dll", SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  private static extern bool ActivateActCtx(IntPtr hActCtx, out IntPtr lpCookie);

  // changed from uint to IntPtr according to 
  // https://www.pinvoke.net/default.aspx/kernel32.DeactivateActCtx
  [DllImport("Kernel32.dll", SetLastError = true)]
  [return: MarshalAs(UnmanagedType.Bool)]
  private static extern bool DeactivateActCtx(int dwFlags, IntPtr lpCookie);

  private const int ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID = 0x004;

  private struct ACTCTX 
  {
     public int       cbSize;
     public uint      dwFlags;
     public string    lpSource;
     public ushort    wProcessorArchitecture;
     public ushort    wLangId;
     public string    lpAssemblyDirectory;
     public string    lpResourceName;
     public string    lpApplicationName;
  }
 }
}

وبعد ذلك استخدم الأمر على هذا النحو:

using (new EnableThemingInScope(true))
{
    // The call all this mucking about is here for.
    VistaUnsafeNativeMethods.TaskDialogIndirect(ref config, out result, out radioButtonResult, out verificationFlagChecked);
 }

وفي TaskDialogInterop.cs المنصوص عليها في WPF المهام حوار التفاف على جيثب

لمزيد من المعلومات حول SEHExceptions ممكن في Finalizer من EnableThemingInScope رؤية هذا <وأ href = "https://stackoverflow.com/questions/26514954/registration-free-com-interop-deactivating-activation-context-in-finalizer -thro "> سؤال عن SO

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top