using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.ServiceProcess; using System.Threading; using System.Windows.Forms; using Fleck; using KGIS.Framework.Core.Services; using KGIS.Framework.Platform; using KGIS.Framework.Platform.Interface; using KGIS.Framework.Utils; using KGIS.Framework.Utils.Helper; using Kingo.PluginServiceInterface; using Microsoft.Win32; using UIShell.OSGi; namespace Kingo.BuildDB { static class Program { internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll", EntryPoint = "FindWindow")] private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern int ShowWindow(IntPtr hwnd, int nCmdShow); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId); [DllImport("User32.dll", CharSet = CharSet.Auto)] internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); [DllImport("USER32.DLL")] public static extern bool SetForegroundWindow(IntPtr hWnd); public static bool v = false; /// /// 应用程序的主入口点。 /// [STAThread] static void Main(string[] agrs) { string SystemName = "数 据"; agrs = new string[] { "NDBG" }; Platform.Instance.SystemType = SystemTypeEnum.NDBGJK; SystemName = "年 度 变 更"; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Process curr = Process.GetCurrentProcess(); List process = Process.GetProcessesByName(curr.ProcessName).ToList(); if (process != null && process.Count > 0) { foreach (Process item in process) { if (item.Id == curr.Id) continue; ShowWindow(item.MainWindowHandle, 1); SetForegroundWindow(item.MainWindowHandle); Application.Exit(); return; } } try { GdalConfiguration.ConfigureGdal(); GdalConfiguration.ConfigureOgr(); } catch (Exception ex) { LogAPI.Debug("Gdal注册失败!"); LogAPI.Debug(ex); } try { ServiceController sc = new ServiceController("ArcGIS License Manager"); if (!KGIS.Framework.AE.AELicense.AoInit(true) || sc.Status == ServiceControllerStatus.Stopped) { MessageHelper.Show("ArcGIS授权服务未启动或已到期,请检查ArcGIS授权!"); return; } } catch (Exception ex) { MessageHelper.Show("ArcGIS授权服务未启动或已到期,请检查ArcGIS授权!"); LogAPI.Debug(ex.Message); return; } using (var bundleRuntime = new BundleRuntime()) { #region int loadedBundleCount = 0; Action action = null; IAsyncResult asyncResult = null; IPluginStart startPlugin = null; List bundles = new List(); //插件状态发生改变事件,用来加载启动插件的进度 EventHandler bundleStateChangeEventHandler = (sender, e) => { if (e.CurrentState != BundleState.Starting || e.Bundle.Name == "SystemBundle") return; if (startPlugin == null) startPlugin = bundleRuntime.GetFirstOrDefaultService(); string[] Name_ID = e.Bundle.Name.Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries); if (startPlugin != null) { startPlugin.SetTitle(string.Format(ConfigurationManager.AppSettings.Get("APPName"), SystemName)); startPlugin.SetSystemType(SystemTypeEnum.NDBGJK.ToString()); if (!startPlugin.IsShow) { action = (ar) => { if (ar) { startPlugin.ShowDialog(); } }; asyncResult = action.BeginInvoke(true, null, null); //等待启动界面打开 while (!startPlugin.IsShow) { Thread.Sleep(50); } loadedBundleCount++; startPlugin.SetPercent(loadedBundleCount, bundleRuntime.Framework.Bundles.Count - 1, Name_ID[0]); } else { loadedBundleCount++; startPlugin.SetPercent(loadedBundleCount, bundleRuntime.Framework.Bundles.Count - 1, Name_ID[0]); } } }; #if DEBUG v = true; //Kingo.PluginServiceInterface.Helper.AuthorizationVerification.ValidityLic(bundleRuntime, false, 6); #else v = Kingo.PluginServiceInterface.Helper.AuthorizationVerification.ValidityLic(bundleRuntime, false, 6); #endif if (!v) return; //注册插件状态事件 bundleRuntime.Framework.EventManager.AddBundleEventListener(bundleStateChangeEventHandler, true); //开始启动插件 bundleRuntime.Start(); //取消插件状态的事件 bundleRuntime.Framework.EventManager.RemoveBundleEventListener(bundleStateChangeEventHandler, true); if (!v) { GC.Collect(); Application.Exit(); return; } LogAPI.Debug("系统初始化..."); //建库版本类型_GIS版本_授权类型_版本号_版本发布时间 LogAPI.Debug($"{string.Format(ConfigurationManager.AppSettings.Get("VersionInformation"), GetArcGISVersion())}"); #endregion var platform = bundleRuntime.GetFirstOrDefaultService(); if (platform != null) { Platform.Instance.Open(); platform.InitUI(null); startPlugin?.CloseForm(); ExtensionShowWindow.MainWinForm = platform.Instance; Platform.Instance.OutputMsg("系统初始化完成。"); Platform.Instance.UpdateStateBar("系统初始化完成"); WebsocketHelper.Instance.ConnectionCallback = (s) => { WebsocketHelper.Instance.Conn = s as IWebSocketConnection; { (s as IWebSocketConnection).OnOpen = () => { }; } }; WebsocketHelper.Instance.Start(7080); Application.Run(platform.Instance); RunIDService.Dispose(); } else { LogAPI.Debug("IPlatformService接口获取失败!"); } } } /// /// 获取ArcGSI版本 /// /// static string GetArcGISVersion() { string registryKey64 = @"SOFTWARE\WOW6432Node\ESRI\ArcGIS 10.2 License Manager"; // 适用于64位系统 string registryKey32 = @"SOFTWARE\ESRI\ArcGIS 10.2 License Manager";// 适用于32位系统 string registryPath = Environment.Is64BitOperatingSystem ? registryKey64 : registryKey32; try { using (RegistryKey key = Registry.LocalMachine.OpenSubKey(registryPath)) { if (key != null) { object realVersion = key.GetValue("RealVersion");//10.2.2 //realVersion = key.GetValue("Installer"); //"Administrator" //realVersion = key.GetValue("ProductName");//ArcGIS 10.2.2 License Manager if (realVersion.ToString() == "10.2.2") { return $"ArcGIS{realVersion}"; } } } } catch (Exception ex) { LogAPI.Debug($"获取ArcGIS版本错误:{ex.Message}"); } return "AGVF"; } } }