← Назад

QuikTerminal.Login exception

Собственно теперь вываливается следующее: "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена." Насколько помню, до 4.0.6 было нормально.

Комментарии (29)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

У меня все ок. Пример так же не работает?

Supervisor
Supervisor Автор

Пример с той же ошибкой

Mikhail Sukhov
Mikhail Sukhov

Supervisor: Пример с той же ошибкой

Приведите полный стек трейс.

Supervisor
Supervisor Автор

Хотел, но что-то до него дело не доходит

Mikhail Sukhov
Mikhail Sukhov

Supervisor: Хотел, но что-то до него дело не доходит

Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений.

Supervisor
Supervisor Автор

Mikhail Sukhov:

Supervisor: Хотел, но что-то до него дело не доходит

Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений. Спасибо за совет, изучаю всё в процессе работы, пока навыков отладки хватало, вот:

   в System.StubHelpers.ValueClassMarshaler.ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT)
   в Ecng.Interop.WinApi.GetMenuItemInfo(IntPtr hMenu, UInt32 uItem, Boolean fByPosition, MenuItemInfo& lpmii)
   в Ecng.Interop.ManagedWinApiHelper.GetMenuItems(IntPtr hMenu, SystemWindow window)
   в Ecng.Interop.SystemMenu..ctor(IntPtr hMenu, SystemWindow window)
   в Ecng.Interop.ManagedWinApiHelper.GetMenu(SystemWindow window)
   в StockSharp.Quik.QuikTerminal.Logout()
   в IronTrader.Core.LogoutQuik() в C:\Users\user_197\Desktop\Trader\Trader\Classes\Core.cs:строка 421
   в IronTrader.Views.MainWindow.LogoutQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\Trader\Trader\Views\MainWindow.xaml.cs:строка 240
   в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   в System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   в System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   в System.Windows.Input.InputManager.ProcessStagingArea()
   в System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   в System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   в System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   в System.Windows.Forms.Integration.WindowsFormsHost.ActivateWindowListener.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   в System.Windows.Application.RunDispatcher(Object ignore)
   в System.Windows.Application.RunInternal(Window window)
   в System.Windows.Application.Run(Window window)
   в System.Windows.Application.Run()
   в Trader.App.Main() в C:\Users\user_197\Desktop\Trader\Trader\obj\x86\Debug\App.g.cs:строка 0
   в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   в System.Threading.ThreadHelper.ThreadStart()

Mikhail Sukhov
Mikhail Sukhov

Supervisor:

Mikhail Sukhov:

Supervisor: Хотел, но что-то до него дело не доходит

Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений. Спасибо за совет, изучаю всё в процессе работы, пока навыков отладки хватало, вот:

в StockSharp.Quik.QuikTerminal.Logout() в IronTrader.Core.LogoutQuik() в C:\Users\user_197\Desktop\Trader\Trader\Classes\Core.cs:строка 421 в IronTrader.Views.MainWindow.LogoutQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\Trader\Trader\Views\MainWindow.xaml.cs:строка 240


Еще не плохо бы показывать стек трейс по первоначальным ошибкам.
Supervisor
Supervisor Автор

Mikhail Sukhov: http://stocksharp.com/forum/1331/Attempted-to-read-or-write-protected-memory/ В той теме предлагается решение - перейти на S# 3.0 😀

Mikhail Sukhov
Mikhail Sukhov

Supervisor:

Mikhail Sukhov: http://stocksharp.com/forum/1331/Attempted-to-read-or-write-protected-memory/ В той теме предлагается решение - перейти на S# 3.0 😀

Нужно всю ветку прочитать.

Alexander
Alexander

Вставил в Quik\Sample\MainWindow.xaml.cs после this.Trader = new QuikTrader(this.Path.Text); строчку с подключением:

Trader.Terminal.Login("мой логин", "мой пароль");

всё сработало как надо - подключение произошло.

Как вы модифицировали Sample, что у вас стало падать?

Supervisor
Supervisor Автор

Alexander Mukhanchikov: Вставил в Quik\Sample\MainWindow.xaml.cs после this.Trader = new QuikTrader(this.Path.Text); строчку с подключением:

Trader.Terminal.Login("мой логин", "мой пароль");

> 
> всё сработало как надо - подключение произошло.
> 
> Как вы модифицировали Sample, что у вас стало падать?
Sample не модифицировал вообще, и на нем точно так же падает. Скрин выше - из моей программы. Возможно какая-то проблема в моем компьютере, позже попробую на других это сделать, отпишусь.
Alexander
Alexander

Supervisor:

Alexander Mukhanchikov: Вставил в Quik\Sample\MainWindow.xaml.cs после this.Trader = new QuikTrader(this.Path.Text); строчку с подключением:

Trader.Terminal.Login("мой логин", "мой пароль");

> >
> > всё сработало как надо - подключение произошло.
> >
> > Как вы модифицировали Sample, что у вас стало падать?
> Sample не модифицировал вообще, и на нем точно так же падает. Скрин выше - из моей программы. Возможно какая-то проблема в моем компьютере, позже попробую на других это сделать, отпишусь.

Что за Sample использовался?
Где там делается Terminal.Login? 
Supervisor
Supervisor Автор

Alexander Mukhanchikov: Что за Sample использовался? Где там делается Terminal.Login? SampleQuikStartStop

Supervisor
Supervisor Автор

Да, ошибка одинаковая по обоим методам, вот по логину:


   в System.StubHelpers.ValueClassMarshaler.ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT)
   в Ecng.Interop.WinApi.GetMenuItemInfo(IntPtr hMenu, UInt32 uItem, Boolean fByPosition, MenuItemInfo& lpmii)
   в Ecng.Interop.ManagedWinApiHelper.GetMenuItems(IntPtr hMenu, SystemWindow window)
   в Ecng.Interop.SystemMenu..ctor(IntPtr hMenu, SystemWindow window)
   в Ecng.Interop.ManagedWinApiHelper.GetMenu(SystemWindow window)
   в StockSharp.Quik.QuikTerminal.Login(String login, String password, IPEndPoint address)
   в IronTrader.Core.LoginQuik(String login, String pass) в C:\Users\user_197\Desktop\IronTrader\IronTrader\Classes\Core.cs:строка 406
   в IronTrader.Views.MainWindow.LoginQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\IronTrader\IronTrader\Views\MainWindow.xaml.cs:строка 235
   в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
   в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   в System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   в System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   в System.Windows.Input.InputManager.ProcessStagingArea()
   в System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
   в System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   в System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
   в System.Windows.Forms.Integration.WindowsFormsHost.ActivateWindowListener.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   в System.Windows.Application.RunDispatcher(Object ignore)
   в System.Windows.Application.RunInternal(Window window)
   в System.Windows.Application.Run(Window window)
   в System.Windows.Application.Run()
   в IronTrader.App.Main() в C:\Users\user_197\Desktop\IronTrader\IronTrader\obj\x86\Debug\App.g.cs:строка 0
   в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   в System.Threading.ThreadHelper.ThreadStart()

Supervisor
Supervisor Автор

Mikhail Sukhov:

Maxim: Вопрос как его устранить? И считаете ли Вы это багом?

Устранить - использовать S# 3.0. И да, конечно же это баг. Получается этот баг не был исправлен в S# 3.0) Так или иначе, нашел причину: сделал окно с портфелем на QPILE не на весь экран и все заработало.

Mikhail Sukhov
Mikhail Sukhov

Supervisor: Так или иначе, нашел причину: сделал окно с портфелем на QPILE не на весь экран и все заработало.

Ну вот видите что делает терпение и труд с багами. И сами находятся, и сами устраняются. Кстати, вашу ошибку я нашел через Гугл, который меня привел обратно на S# форум. Заняло буквально 5 минут. Еще 5 минут на чтение топика. Еще 15 минут на эсперименты. Итого, такие проблемы оптимально решать за 25 минут.😉

Alexander
Alexander

Будет фикс в 4.0.11 Поломалось из-за перехода на .Net 4.0

MCTuTeJ|19951995
MCTuTeJ|19951995

Такой вопрос - в какой момент меняется состояние QuikTerminal с IsConnected = false на IsConnected =true ? Просто при вызове terminal.Login(login.pw,server) это состояние вроде как меняется сразу, даже если не получается подключиться. Просто проблема в следующем: Для квмка есть три сервера, к которым он может подключиться. На момент запуска робота два из трех серверов заняты, но робот не знает какие именно. Он пытается перебрать все три сервера примерно так:


                
                if (!terminal.IsConnected)
                {   
                    var adresses = terminal.Addresses;
                    foreach (var ipEndPoint in adresses)
                    {
                        terminal.Login(login, password, ipEndPoint);


                        if (terminal.IsConnected) break;

                    }
                }

Но так не получается, потому что на после terminal.Login() terminal.IsConnected всегда получается true в не зависимости от результата подключения. Не подскажите куда копать надо ? Спасибо.

Alexander
Alexander

Не так. QuikTerminal.IsConnected - это если что-то есть в статус баре в квике, тогда считаем что как минимум подключаемся

лучше смотреть на QuikTrader.IsConnected он смотрит совсем другое и как раз то, что нужно

Maxim K. Supervisor
Maksim Chertkov
Maksim Chertkov

Александр, вдогонку еще один похожий вопрос по запуску. Такой трабл - если запускать терминал из программы с помощью метода QuikTerminal.Launch() событие IsLaunched остается в состоянии false. Но стоит его запустить его с рабочего стола или из проводника, то все ок - событие возвращает true. Подскажите в чем может быть глюк? Не, конечно можно из программы и запуск из проводника сымитировать, просто мож вы знаете в чем дело и удастся это сделать культурно? Система Win7.

Alexander
Alexander

Mach342: Александр, вдогонку еще один похожий вопрос по запуску. Такой трабл - если запускать терминал из программы с помощью метода QuikTerminal.Launch() событие IsLaunched остается в состоянии false. Но стоит его запустить его с рабочего стола или из проводника, то все ок - событие возвращает true. Подскажите в чем может быть глюк? Не, конечно можно из программы и запуск из проводника сымитировать, просто мож вы знаете в чем дело и удастся это сделать культурно? Система Win7.

Зачем вам IsLaunched?

Посмотрите на SystemProcess и SystemProcess.HasExited под дебагом. Чему они равны?

Maxim K.
Maxim K.

Здравствуйте ! QuikTerminal.IsConnected выставляется в true, если окно сообщений содержит хотя бы одну (не важно какую) запись. Это утверждение истинно или ложно ? Если ложно, не могли бы вы сказать как Quikterminal узнает, IsConnected он или нет ? Спасибо.

Alexander
Alexander

Maxim K.: Здравствуйте ! QuikTerminal.IsConnected выставляется в true, если окно сообщений содержит хотя бы одну (не важно какую) запись. Это утверждение истинно или ложно ? Если ложно, не могли бы вы сказать как Quikterminal узнает, IsConnected он или нет ? Спасибо.

Зачем вам QuikTerminal.IsConnected? Используйте QuikTrader.IsConnected

Вот для QuikTerminal:

		public bool IsConnected
		{
			get { return !StatusBar.GetText().IsEmpty(); }
		}
Maxim K.
Maxim K.

Alexander Mukhanchikov: Зачем вам QuikTerminal.IsConnected? Я уже писал, но повторюсь: Роботу периодически необходимо запускать другие квики, помимо одного основного, к которому он всегда подключен и с которого получает все необходимые данные. после запуска квика, необходимо его подключить. И вот тут возникает проблема: В этих квиках, по мимо робота, могут еще и люди работать, но на других компьютерах. В квике есть три сервера, и какой из них свободен заранее не известно. Сейчас я сделал так: перебираю все возможные сервера и остаюсь на том, к которму первым подключились. Сделал так:


                            foreach (var ipEndPoint in adresses)
                            {
                                terminal.Login(login, password, ipEndPoint);
                                while (terminal.GetMessages() == null) ;
                                var msg = terminal.GetMessages();
                                if (!(msg.Last().Contains("error") || msg.Last().Contains("уже")))
                                {
                                    break;
                                }
             
                            }


Вы предлагаете сделать так:


                            foreach (var ipEndPoint in adresses)
                            {
                                terminal.Login(login, password, ipEndPoint);
                                var trader = new QuikTrader{Path = path, DdeServer = "ANOTHERDDESERVER", DllName="TRANS2QUIK1.DLL"}; 
                                bool f = false;
                                trader.ConnectionError+=error=>{f=true;};
                                trader.Connected+=()=>{f=true; };
                                trader.Connect();      
                                while(!f);  
                                if(trader.IsConnected)break; 
                            }

Или что-то наподобии. Я правильно понял ?

Alexander
Alexander

Выкину этот метод в 4.1 от греха подальше, он нафиг не нужен.

Maxim K.
Maxim K.

То есть если терминал не подключен к серверу, мы создаем трейдера и пишем trader.Connect(), потом смотрим trader.IsConnected - он должен быть false. Если же терминал подключен, то при таких же условиях trader.IsConnected будет true. Так ?

Alexander
Alexander

QuikTerminal.IsConnected не используется ни в первом, ни во втором участке кода

Maxim K.
Maxim K.

Да, я в курсе, потому что он не совсем адекватно работает на мой взгляд - в случае если сервер занят и подключиться не удалось, он будет выставлен в true, хотя долден быть false. первый фрагмент кода - это кривой костыль, временно приделанный чтобы хоть как то работало. Как использовать QuikTrader.IsConnected я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.