Question

Je veux intégrer une fenêtre c personnalisée n forme (ou WPF) contrôle utilisateur dans une vue de perspectives. J'utilise Outlook 2003 et Visual Studio 2008.

Je l'ai télécharger un exemple pour Outlook 2007 ici:

http://blogs.msdn.com/e2eblog/archive/2008/01/09/outlook-folder-homepage-hosting-wpf-activex-and-windows-forms-controls.aspx

et aussi ici:

http://msdn.microsoft.com/en-us/library /aa479345.aspx

Je l'ai testé et en 2007 il fonctionne, mais pour 2003 je reçois l'erreur suivante quand je veux ouvrir la vue:

Impossible de terminer l'opération en raison d'une erreur 80131509

Je peux commencer à partir de Visual Studio, il enregistre le dossier très bien, le débogage fonctionne et tout cela. Il crée une page HTML qui contient mon type comme paramètre d'objet -. Mais la méthode Initialize qui devrait être appelée est pas présent (non représenté par JS) ou il a quelques erreurs

Les points d'arrêt pour RegisterSafeForScripting sont jamais touchés -. Peut-être lié à cette

Était-ce utile?

La solution 2

Tout d'abord merci AMissico - et je vais examiner la description et des liens que vous avez fournis ainsi. Le code follwinng a fait pour moi l'affaire (mais les boutons de contrôle et d'autres ont cassé la mise en page - mais le PAM travaille donc je vais utiliser WPF). Je dois factoriser le code mais il était la version de travail pour moi ...

L'exemple j'ai finalement trouvé qui fonctionnait après peaufinage un peu pour moi: http://www.microsoft. com / downloads / Details.aspx? = familyid 078124E9-1E88-4F51-8C98-3C1999CFE743 & displaylang = fr

Le fichier suivant est plus ou moins pris de l'exemple ci-dessus

using System;
using System.IO;
using System.Collections.Generic;
using MSOutlook = Microsoft.Office.Interop.Outlook;
using System.Runtime.InteropServices;

namespace Outlook2003KnowledgeBaseAddIn.Setup
{
    public sealed class FolderHomePage
    {
        /// <summary>
        /// List of web view files that have been written out during this Outlook intance
        /// </summary>
        private static List<string> listWebViewFiles = new List<string>();

        /// <summary>
        /// Registers a specific managed type as a folder home page. Returns a file path for the folder home page
        /// </summary>
        /// <param name="viewType">Type of the home page control. 
        /// Control must be ComVisible should be registered safe for scripting</param>
        /// <returns>file path to the folder home page</returns>
        public static string RegisterType(Type viewType)
        {
            if (viewType == null)
                return null;

            //TODO: ensure that viewType inherits from System.Windows.Forms.Control

            //Create the Local App Data directory for the Web view files to reside in
            string webViewDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), Properties.Resources.WebViewDirectoryName);
            if (Directory.Exists(webViewDirectory) == false)
                Directory.CreateDirectory(webViewDirectory);

            //Create the web view file name based on the viewType guid in the web view directory
            string webViewFile = Path.Combine(webViewDirectory, viewType.GUID.ToString("N") + ".htm");

            //if the file has been written out already in this session, return
            if (listWebViewFiles.Contains(webViewFile))
                return webViewFile;

            //If the file exists, delete it (for versioning reasons)
            if (File.Exists(webViewFile))
                File.Delete(webViewFile);

            //Open a file stream and text writer for the Web view stream
            FileStream stm = new FileStream(webViewFile, FileMode.Create, FileAccess.Write);
            TextWriter writer = new StreamWriter(stm, System.Text.Encoding.ASCII);

            //Look to see if the viewType has an init method that takes a single Outlook App parameter
            System.Reflection.MethodInfo initInfo = viewType.GetMethod("Initialize", new Type[] { typeof(MSOutlook.Application) });

            //If the viewType doesn't have an Init method, just write out the html page header
            //TODO move HTML code to resource strings
            if (initInfo == null)
            {
                writer.WriteLine("<html><body rightmargin = '0' leftmargin ='0' topmargin ='0' bottommargin = '0'>");
            }
            //If the viewType does have an Init method, write script to trap the Body.OnLoad event and call the Init method
            //passing in the window.external.OutlookApplication object as the parameter
            else
            {
                writer.WriteLine("<html><body rightmargin = '0' leftmargin ='0' topmargin ='0' bottommargin = '0' onload='OnBodyLoad()'>");
                writer.WriteLine("<script>\n\tfunction OnBodyLoad()\n\t{\n\t\tvar oApp = window.external.OutlookApplication;");
                writer.WriteLine("\t\t{0}.Initialize(oApp);", viewType.Name);
                writer.WriteLine("\t}\n</script>");
            }

            //Write out an object tag that loads up the viewType as a com object via its class id
            writer.WriteLine("<object classid='clsid:{0}' ID='{1}' VIEWASTEXT width='100%' height='100%'/>", viewType.GUID, viewType.Name);
            writer.WriteLine("</body></html>");

            //Close the file
            writer.Close();
            stm.Close();

            //save this file name so we don't write it out multiple times per outlook session
            listWebViewFiles.Add(webViewFile);

            return webViewFile;
        }

        private const string CATID_SafeForScripting = "7DD95801-9882-11CF-9FA9-00AA006C42C4";
        private const string CATID_SafeForInitializing = "7DD95802-9882-11CF-9FA9-00AA006C42C4";

        /// <summary>
        /// Registers a managed type that's exposed for COM interop as safe for initializing and scripting
        /// </summary>
        /// <param name="comType"></param>
        public static void RegisterSafeForScripting(Type comType)
        {
            Guid clsid = comType.GUID;
            Guid interfaceSafeScripting = new Guid(CATID_SafeForScripting);
            Guid interfaceSafeForInitializing = new Guid(CATID_SafeForInitializing);

            ICatRegister reg = (ICatRegister)new ComComponentCategoriesManager();
            reg.RegisterClassImplCategories(ref clsid, 1, new Guid[] { interfaceSafeScripting });
            reg.RegisterClassImplCategories(ref clsid, 1, new Guid[] { interfaceSafeForInitializing });
        }

        /// <summary>
        /// Unregisters a managed type that's exposed for COM interop as safe for initializing and scripting
        /// </summary>
        /// <param name="comType"></param>
        public static void UnregisterSafeForScripting(Type comType)
        {
            Guid clsid = comType.GUID;
            Guid interfaceSafeScripting = new Guid(CATID_SafeForScripting);
            Guid interfaceSafeForInitializing = new Guid(CATID_SafeForInitializing);

            ICatRegister reg = (ICatRegister)new ComComponentCategoriesManager();
            reg.UnRegisterClassImplCategories(ref clsid, 1, new Guid[] { interfaceSafeScripting });
            reg.UnRegisterClassImplCategories(ref clsid, 1, new Guid[] { interfaceSafeForInitializing });
        }

    }


    [ComImport(), Guid("0002E005-0000-0000-C000-000000000046")]
    class ComComponentCategoriesManager
    {
    }

    [ComImport(), Guid("0002E012-0000-0000-C000-000000000046")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface ICatRegister
    {
        void RegisterCategories(int cCategories, IntPtr rgCategoryInfo);

        void UnRegisterCategories(int cCategories, IntPtr rgcatid);

        void RegisterClassImplCategories(
                [In()] ref Guid rclsid,
                int cCategories,
                [In(), MarshalAs(UnmanagedType.LPArray)] Guid[] rgcatid);

        void UnRegisterClassImplCategories(
                [In()] ref Guid rclsid,
                int cCategories,
                [In(), MarshalAs(UnmanagedType.LPArray)] Guid[] rgcatid);

        void RegisterClassReqCategories(
            [In()] ref Guid rclsid,
            int cCategories,
            [In(), MarshalAs(UnmanagedType.LPArray)] Guid[] rgcatid);

        void UnRegisterClassReqCategories(
            [In()] ref Guid rclsid,
            int cCategories,
            [In(), MarshalAs(UnmanagedType.LPArray)] Guid[] rgcatid);
    }

}

avec ce fichier:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Policy;
using System.Security;
using Outlook2003KnowledgeBaseAddIn.Setup;
using Outlook2003KnowledgeBaseAddIn.UI;
using Outlook2003KnowledgeBaseAddIn.UI.OutlookIntegration;

namespace Outlook2003KnowledgeBaseAddIn
{
    [System.ComponentModel.RunInstaller(true)]
    public class Installer : System.Configuration.Install.Installer
    {
        public Installer()
        {
        }

        public override void Install(System.Collections.IDictionary stateSaver)
        {
            base.Install(stateSaver);

            try
            {
                ConfigureSecurityPolicy();
                RegisterFolderHomePages();
            }
            catch (Exception ex)
            {
                throw new System.Configuration.Install.InstallException("Custom Installer Failed", ex);
            }
        }

        public override void Uninstall(System.Collections.IDictionary savedState)
        {
            base.Uninstall(savedState);

            try
            {
                DeleteSecurityPolicy();
                UnregisterFolderHomePages();
            }
            catch (Exception ex)
            {
                throw new System.Configuration.Install.InstallException("Custom Installer Failed", ex);
            }
        }

        private void RegisterFolderHomePages()
        {
            //Utility.FolderHomePage.RegisterSafeForScripting(typeof(FolderHomePages.AccountToday));
            FolderHomePage.RegisterSafeForScripting(typeof(WebViewControl));
        }

        private void UnregisterFolderHomePages()
        {
            //Utility.FolderHomePage.UnregisterSafeForScripting(typeof(FolderHomePages.AccountToday));
            FolderHomePage.UnregisterSafeForScripting(typeof(WebViewControl));
        }

        private void ConfigureSecurityPolicy()
        {
            // Find the machine policy level
            PolicyLevel machinePolicyLevel = GetMachinePolicyLevel();

            // Get the install directory of the current installer
            string assemblyPath = this.Context.Parameters["assemblypath"];
            string installDirectory =
                assemblyPath.Substring(0, assemblyPath.LastIndexOf("\\"));

            if (!installDirectory.EndsWith(@"\"))
                installDirectory += @"\";

            installDirectory += "*";

            // Create the code group
            CodeGroup codeGroup = new UnionCodeGroup(
                new UrlMembershipCondition(installDirectory),
                new PolicyStatement(new NamedPermissionSet("FullTrust")));
            codeGroup.Description = Properties.Resources.CasPolicyDescription;
            codeGroup.Name = Properties.Resources.CasPolicyName;

            // Add the code group
            machinePolicyLevel.RootCodeGroup.AddChild(codeGroup);

            // Save changes
            SecurityManager.SavePolicy();
        }

        private static void DeleteSecurityPolicy()
        {
            PolicyLevel machinePolicy = GetMachinePolicyLevel();

            foreach (CodeGroup codeGroup in machinePolicy.RootCodeGroup.Children)
            {
                if (codeGroup.Name == Properties.Resources.CasPolicyName)
                    machinePolicy.RootCodeGroup.RemoveChild(codeGroup);
            }

            SecurityManager.SavePolicy();
        }

        private static PolicyLevel GetMachinePolicyLevel()
        {
            System.Collections.IEnumerator policyHierarchy = SecurityManager.PolicyHierarchy();

            while (policyHierarchy.MoveNext())
            {
                PolicyLevel level = (PolicyLevel)policyHierarchy.Current;
                if (level.Type == PolicyLevelType.Machine)
                    return level;
            }

            throw new ApplicationException("Could not find Machine Policy level. Code Access Security is not configured for this application.");
        }
    }
}

Cette méthode met en place l'affichage Web:

private void CreateWebViewFolders()
{
    MSOutlook.MAPIFolder root = Folder.GetRootFolder(Application.Session);

    MSOutlook.MAPIFolder webViewFolder = Folder.CreateFolder(root, Properties.Resources.WebViewFolderName);
    webViewFolder.WebViewURL = FolderHomePage.RegisterType(typeof(WebViewControl));
    webViewFolder.WebViewOn = true;
}

Autres conseils

On dirait que vous devez créer un Runtime la politique de sécurité pour l'assemblage. Visual Studio / VSTO défini automatiquement. Vous pouvez vérifier cela en exécutant votre projet de Visual Studio puis ouvrez l'application de configuration Microsoft .NET Framework 2.0 sous Outils d'administration. Accédez à la politique de sécurité d'exécution et vérifier le code des groupes. projets VSTO sont sous Utilisateur> Groupes de code> All_Code> VSTOProjects.

Voici mes notes.

Classes code d'accès Politique de sécurité (caspol)

  • Créé à partir de Déploiement d'Office Solutions utilisant la version Windows Installer 3.
  • Renommé classe SetSecurity à CaspolSecurityPolicyInstaller.

outil Stratégie de sécurité (Caspol.exe)

L'outil code d'accès politique de sécurité permet aux utilisateurs et aux administrateurs de modifier la politique de sécurité pour le niveau de la politique de la machine, le niveau de stratégie utilisateur, et le niveau de la politique d'entreprise.

Déploiement

Déploiement Visual Studio 2005 Tools pour Office System Solutions S'Utilisation Windows Installer (partie 1 de 2)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top