Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Использование MapX в программах на c# (Call to OS function failed)

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 08 Окт 2013 11:17    Заголовок сообщения: Использование MapX в программах на c# (Call to OS function failed) Ответить с цитатой

Иногда при использовании MapX в программах на C# возникает ошибка "Call to OS function failed".

Для исправления этой ситуации рекомендуем внести следующие изменения в проект на C#:

1. Включить в проект файл MapXHostScope.cs следующего содержания:
Код:
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Windows.Forms;

namespace MapXHosting
{
      [SuppressUnmanagedCodeSecurity]
      internal class MapXHostingScope : IDisposable
      {
         private static ACTCTX FActCtx;
         private static IntPtr FActCtxHandle;
         private static bool FActCtxCreationSucceeded = false;
         
         private uint FActCtxActivationCookie;

         public MapXHostingScope()
         {
            FActCtxActivationCookie = 0;
            if (!OSFeature.Feature.IsPresent(OSFeature.Themes)) {
               return;
            }
            if (!EnsureActivateContextCreated()) {
               return;
            }
            if (!ActivateActCtx(FActCtxHandle, out FActCtxActivationCookie)) {
               FActCtxActivationCookie = 0;
            }
         }

         ~MapXHostingScope()
         {
            Dispose(false);
         }

         void IDisposable.Dispose()
         {
            Dispose(true);
         }

         private void Dispose(bool disposing)
         {
            if (FActCtxActivationCookie == 0) {
               return;
            }
            if (DeactivateActCtx(0, FActCtxActivationCookie)) {
               FActCtxActivationCookie = 0;
            }
         }




         private static bool EnsureActivateContextCreated()
         {
            lock (typeof(MapXHostingScope)) {
               if (!FActCtxCreationSucceeded) {
                  string net_installation_location = null;

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

                  var install_dir = Path.GetDirectoryName(net_installation_location);
                  if(install_dir != null) {
                     const string manifest_name = "XPThemes.manifest";
                     var mscorlib_manifest_location = Path.Combine(install_dir, manifest_name);

                     FActCtx = new ACTCTX {
                        cbSize = Marshal.SizeOf(typeof (ACTCTX)),
                        lpSource = mscorlib_manifest_location,
                        lpAssemblyDirectory = install_dir,
                        dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID
                     };

                     FActCtxHandle = CreateActCtx(ref FActCtx);
                     FActCtxCreationSucceeded = (FActCtxHandle != new IntPtr(-1));
                  }
               }

               return FActCtxCreationSucceeded;
            }
         }

         [DllImport("Kernel32.dll")]
         private extern static IntPtr CreateActCtx(ref ACTCTX actctx);
         [DllImport("Kernel32.dll")]
         private extern static bool ActivateActCtx(IntPtr hActCtx, out uint lpCookie);
         [DllImport("Kernel32.dll")]
         private extern static bool DeactivateActCtx(uint dwFlags, uint 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;
         }
      }
}

2. В главной процедуре main обрамить вызов Application.Run следующим кодом:
Код:
using(new MapXHostingScope()) {
   Application.Run(new Form1());
}


После этого MapX должен работать под темами без ошибок.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB