kodges
Новичок
- Сообщения
- 42
- Репутация
- 0
Моя программа подключается к программе Quik через trans2quik.dll для получения транзакций. Соединение устанавливается все нормально, регистрируются колбек функции, запускается импорт транзакций из Quik в мою программу, но проблема в том что там импорт идет потоком и для импорта 50 транзакций соответственно колбек функция вызывается 50 раз. Раз 10-15 отрабатывается корректно, а потом скрипт падает с ошибкой. Время выполнения колбек функции менее секунды. Ошибка в подключенной библиотеке:
"C:\Program Files (x86)\AutoIt3\Include\WinAPIGdiInternals.au3" (458) : ==> Variable used without being declared.:
При том что в указанной строке переменная нормально объявлена с помощью Local.
Вывод в консоль получается такой:
Почему программа падает?
"C:\Program Files (x86)\AutoIt3\Include\WinAPIGdiInternals.au3" (458) : ==> Variable used without being declared.:
При том что в указанной строке переменная нормально объявлена с помощью Local.
Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <DateTimeConstants.au3>
#include <WinAPI.au3>
#include <Date.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1) ; Включает режим OnEvent (по событию)
Opt("MustDeclareVars", 1) ; Явное объявление переменных
Global $DEBUG_INFO = True
Local $ErrMessage = DllStructCreate("char[1024]")
Local $hDll = DllOpen(@ScriptDir & "\trans2quik.dll")
Local $QuikConnectStatus = False, $ImportQuikConnectLabel
local $TradeArray[0]
Local $DLLResult
;-- Регистрируем колбек функции
Local $CallbackStatusOrder = DllCallbackRegister("pfnOrderStatusCallback", "ptr", "long;INT64;INT64;str;str;double;INT64;double;long;INT64")
Local $CallbackStatusConnect = DllCallbackRegister("pfConnectionStatusCallback", "ptr", "long;long;str")
_ConnectToQuik()
Sleep(5000)
Exit
While 1
Sleep(10)
WEnd
;-- Функция подключения к Quik
Func _ConnectToQuik()
__DEBUG__("_ConnectToQuik", "START")
If $QuikConnectStatus = True Then
__DEBUG__("_ConnectToQuik", "END")
Return
EndIf
Local $PathQuik = "C:\Market\Quik"
;-- Устанавливаем соединение
__DEBUG__("Устанавливаем соединение с Quik", "")
$DLLResult = DllCall($hDll, "long", "TRANS2QUIK_CONNECT", "str", $PathQuik, "long*", 0, "ptr", DllStructGetPtr($ErrMessage), "dword", DllStructGetSize($ErrMessage))
If Not $DLLResult[0] = 0 Then
GUICtrlSetData($ImportQuikConnectLabel, "Подключение отсутствует")
GUICtrlSetBkColor($ImportQuikConnectLabel, 0xffcfad)
ConsoleWrite("Не удалось подключиться к Quik. Res:" & $DLLResult[0] & "; ErrCode:" & $DLLResult[2] & "; ErrMess:" & DllStructGetData($ErrMessage, 1) & @CRLF)
AdlibRegister("_ConnectToQuik", 5000)
$QuikConnectStatus = False
__DEBUG__("Не удалось установить соедиенение с Quik", "")
Else
;-- Устанавливаем колбек статуса соединения
$DLLResult = DllCall($hDll, "long", "TRANS2QUIK_SET_CONNECTION_STATUS_CALLBACK", "ptr", DllCallbackGetPtr($CallbackStatusConnect), "long*", 0, "str", DllStructGetPtr($ErrMessage), "dword", DllStructGetSize($ErrMessage))
If Not $DLLResult[0] = 0 Then
ConsoleWrite("Не удалось установить колбек статуса соединения. Res:" & $DLLResult[0] & "; ErrCode:" & $DLLResult[2] & "; ErrMess:" & DllStructGetData($ErrMessage, 1) & @CRLF)
ConsoleWrite("Отключаемся от Quik." & @CRLF)
DllCall($hDll, "long", "TRANS2QUIK_DISCONNECT", "long*", 0, "ptr", DllStructGetPtr($ErrMessage), "dword", DllStructGetSize($ErrMessage))
AdlibRegister("_ConnectToQuik", 5000)
$QuikConnectStatus = False
__DEBUG__("_ConnectToQuik", "END")
Return
Else
__DEBUG__("Колбек функция статуса соединения установлена успешно", "")
EndIf
;-- Подписываемся на получение трейдов
$DLLResult = DllCall($hDll, "long", "TRANS2QUIK_SUBSCRIBE_TRADES", "str", "", "str", "")
If Not $DLLResult[0] = 0 Then
ConsoleWrite("Не удалось подписаться на получение трейдов. Res:" & $DLLResult[0] & "; ErrCode:" & $DLLResult[2] & "; ErrMess:" & DllStructGetData($ErrMessage, 1) & @CRLF)
ConsoleWrite("Отключаемся от Quik." & @CRLF)
DllCall($hDll, "long", "TRANS2QUIK_DISCONNECT", "long*", 0, "ptr", DllStructGetPtr($ErrMessage), "dword", DllStructGetSize($ErrMessage))
AdlibRegister("_ConnectToQuik", 5000)
$QuikConnectStatus = False
__DEBUG__("_ConnectToQuik", "END")
Return
Else
__DEBUG__("Подписка на получение трейдов прошла успешно", "")
EndIf
;-- Устанавливаем колбек получение трейдов
$DLLResult = DllCall($hDll, "long", "TRANS2QUIK_START_TRADES", "ptr", DllCallbackGetPtr($CallbackStatusOrder))
If Not $DLLResult[0] = 0 Then
ConsoleWrite("Не удалось установить колбек получаение трейдов. Res:" & $DLLResult[0] & "; ErrCode:" & $DLLResult[2] & "; ErrMess:" & DllStructGetData($ErrMessage, 1) & @CRLF)
ConsoleWrite("Отключаемся от Quik." & @CRLF)
DllCall($hDll, "long", "TRANS2QUIK_DISCONNECT", "long*", 0, "ptr", DllStructGetPtr($ErrMessage), "dword", DllStructGetSize($ErrMessage))
AdlibRegister("_ConnectToQuik", 5000)
$QuikConnectStatus = False
__DEBUG__("_ConnectToQuik", "END")
Return
Else
__DEBUG__("Колбек функция получения трейдов установлена успешно", "")
EndIf
GUICtrlSetData($ImportQuikConnectLabel, "Подключение установлено")
GUICtrlSetBkColor($ImportQuikConnectLabel, 0xcdffad)
AdlibUnRegister("_ConnectToQuik")
$QuikConnectStatus = True
__DEBUG__("Соединение с Quik установлено", "")
EndIf
__DEBUG__("_ConnectToQuik", "END")
EndFunc ;==>_ConnectToQuik
;-- Колбек функция получения информации о сделках
Func pfnOrderStatusCallback($nMode, $dNumber, $dOrderNumber, $ClassCode, $SecCode, $dPrice, $nQty, $dValue, $nIsSell, $tDescriptor)
__DEBUG__("pfnOrderStatusCallback", "START")
Local $hTimer = TimerInit()
Local $tArray[14]
Local $date = DllCall($hDll, "long", "TRANS2QUIK_TRADE_DATE", "INT64", $tDescriptor)[0]
Local $time = DllCall($hDll, "long", "TRANS2QUIK_TRADE_TIME", "INT64", $tDescriptor)[0]
$date = StringMid($date, 1, 4) & "-" & StringMid($date, 5, 2) & "-" & StringMid($date, 7, 2)
$time = StringMid($time, 1, 2) & ":" & StringMid($time, 3, 2) & ":" & StringMid($time, 5, 2)
Local $Operation = ($nIsSell == 0) ? 1 : 0
$tArray[0] = $date & " " & $time
$tArray[1] = $dNumber
$tArray[2] = DllCall($hDll, "str", "TRANS2QUIK_TRADE_ACCOUNT", "INT64", $tDescriptor)[0]
$tArray[3] = $ClassCode
$tArray[4] = $SecCode
$tArray[5] = $Operation
$tArray[6] = $nQty
$tArray[7] = $dPrice
$tArray[8] = $dValue
$tArray[9] = $dValue / ($dPrice * $nQty)
$tArray[10] = DllCall($hDll, "double", "TRANS2QUIK_TRADE_TS_COMMISSION", "INT64", $tDescriptor)[0]
$tArray[11] = DllCall($hDll, "str", "TRANS2QUIK_TRADE_BROKERREF", "INT64", $tDescriptor)[0]
$tArray[12] = DllCall($hDll, "str", "TRANS2QUIK_TRADE_CURRENCY", "INT64", $tDescriptor)[0]
$tArray[13] = DllCall($hDll, "long", "TRANS2QUIK_TRADE_KIND", "INT64", $tDescriptor)[0]
_ArrayAdd($TradeArray, _ArrayToString($tArray, ";"))
ConsoleWrite($nMode & "|"& $dNumber & @CRLF)
Local $iDiff = TimerDiff($hTimer)
ConsoleWrite("время работы: "& $iDiff & @CRLF)
__DEBUG__("pfnOrderStatusCallback", "END")
EndFunc ;==>pfnOrderStatusCallback
;-- Колбек функция проверки подключения к Quik
Func pfConnectionStatusCallback($nConnectionEvent, $pnExtendedErrorCode, $lpstrErrorMessage)
__DEBUG__("pfConnectionStatusCallback", "START")
Switch $nConnectionEvent
Case 8
ConsoleWrite("Соединение между терминалом QUIK и сервером установлено. Res:" & $nConnectionEvent & "; ErrCode:" & $pnExtendedErrorCode & "; ErrMess:" & $lpstrErrorMessage & @CRLF)
Case 9
ConsoleWrite("Соединение между терминалом QUIK и сервером разорвано. Res:" & $nConnectionEvent & "; ErrCode:" & $pnExtendedErrorCode & "; ErrMess:" & $lpstrErrorMessage & @CRLF)
Case 10
ConsoleWrite("Соединение между DLL и терминалом QUIK установлено. Res:" & $nConnectionEvent & "; ErrCode:" & $pnExtendedErrorCode & "; ErrMess:" & $lpstrErrorMessage & @CRLF)
Case 11
ConsoleWrite("Соединение между DLL и терминалом QUIK разорвано. Res:" & $nConnectionEvent & "; ErrCode:" & $pnExtendedErrorCode & "; ErrMess:" & $lpstrErrorMessage & @CRLF)
AdlibRegister("_ConnectToQuik", 5000)
EndSwitch
__DEBUG__("pfConnectionStatusCallback", "END")
EndFunc ;==>pfConnectionStatusCallback
;-- Функция вывода дебаг информации в консоль
Func __DEBUG__($_Func = "", $_Status = "")
If $DEBUG_INFO = True Then
Local $Date ;= @YEAR & "-" & @MON & "-" & @MDAY & " "
Local $Time = @HOUR & ":" & @MIN & ":" & @SEC & "." & @MSEC
ConsoleWrite($Date & $Time & ' - ' & $_Func & '(): ' & $_Status & @CRLF)
EndIf
EndFunc ;==>__DEBUG__
Вывод в консоль получается такой:
Код:
....
16:23:44.241 - pfnOrderStatusCallback(): START
1|1925034015996323417
16:23:44.241 - pfnOrderStatusCallback(): END
время работы: 0.3866
16:23:44.241 - pfnOrderStatusCallback(): START
1|1925034015996323418
16:23:44.242 - pfnOrderStatusCallback(): END
время работы: 0.3299
16:23:44.242 - pfnOrderStatusCallback(): START
"C:\Program Files (x86)\AutoIt3\Include\WinAPIGdiInternals.au3" (458) : ==> Variable used without being declared.:
Local $aResult = DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWnd, "struct*", $tRECT, "handle", $hRegion, "uint", $iFlags)
Local $aResult^ ERROR
16:23:44.242 - pfnOrderStatusCallback(): END
!>16:23:44 AutoIt3.exe ended.rc:-1073741819
+>16:23:44 AutoIt3Wrapper Finished.
>Exit code: 3221225477 Time: 2.809
Почему программа падает?