← Zurück

QuikTerminal.Login exception

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (29)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

Supervisor
Supervisor Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Supervisor
Supervisor Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

Supervisor
Supervisor Autor

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 Autor

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 Autor

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 Autor

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

Supervisor
Supervisor Autor

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


   в 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 Autor

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 я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.