Что нового

Не работает DllCall в Callback функциях?

kodges

Новичок
Сообщения
42
Репутация
0
Здравствуйте.
Подключаю стороннюю trans2quik.dll, подключаюсь к ней нормально, регистрирую Callback функцию, она успешно вызывается, НО одно из переданных значений в Callback функцию является указателем который можно использовать в дополнительных функциях DLL вызываемых из Callback функции. И вот эти доп функции у меня не работают (((
DLL подключается к программе QUIK и получает информацию о сделках и не только, но мне надо только инфу о сделках. Часть инфы которая сразу передается в колбек функцию я получаю нормально, а дополнительную инфу которую надо получать через доп функции из колбека я почему-то получить не могу (((
Описание CallBack функции тут https://euvgub.github.io/quik_user_manual/ch6_9_12.html
Сама Dll и примеры реально работающие с этой DLL на C++ есть тут https://arqatech.com/upload/iblock/80a/Trans2QuikAPI_1.3_x64.zip
Код:
Local Const $sPathQuik = "C:\Market\Quik\"
Local $tErrMessage = DllStructCreate("char[1024]")
Local $hDll = DllOpen(@ScriptDir & "\trans2quik.dll")
;-- Connect
DllCall($hDll, "long", "TRANS2QUIK_CONNECT", "str", $sPathQuik, "long*", 0, "ptr", DllStructGetPtr($tErrMessage), "dword", DllStructGetSize($tErrMessage))
;-- reg callback
Local $CallbackStatusOrder = DLLCallbackRegister("pfnOrderStatusCallback", "ptr", "long;INT64;INT64;str;str;double;INT64;double;long;INT64")
;-- subscribe trades
DllCall($hDll, "long", "TRANS2QUIK_SUBSCRIBE_TRADES", "str", "", "str", "")
;-- start trades callback
Local $Result = DllCall($hDll, "long", "TRANS2QUIK_START_TRADES", "ptr", DllCallbackGetPtr($CallbackStatusOrder))

Func pfnOrderStatusCallback($nMode, $dNumber, $dOrderNumber, $ClassCode, $SecCode, $dPrice, $nQty, $dValue, $nIsSell, $tDescriptor)
    Local $date = DllCall($hDll, "long", "TRANS2QUIK_TRADE_DATE", "INT64", $tDescriptor)
    ConsoleWrite($date & @CRLF)
    ConsoleWrite($nMode &'|'& $dNumber &'|'& $dOrderNumber &'|'& $ClassCode &'|'& $SecCode &'|'& $dPrice &'|'& $nQty &'|'& $dValue &'|'& $nIsSell &'|'& $tDescriptor & @CRLF)
EndFunc

; pfnOrderStatusCallback успешно выводит второй вывод в консоль вида (1|1925034003111410835|1925034003112524676|SPBFUT|RIH1|145400|1|215055.32|0|660600664), 
; но не выводит первый вывод из переменной $date. В чем проблема не понимаю. Уже два дня мучаюсь, голову сломал... ПАМАГИТЕ!!!

Sleep(1000)

DllCall($hDll, 'long', 'TRANS2QUIK_UNSUBSCRIBE_TRADES')
DllCallbackFree($CallbackStatusOrder)
DllCall($hDll, 'long', 'TRANS2QUIK_DISCONNECT', 'long*', 0, 'ptr', DllStructGetPtr($tErrMessage), 'dword', DllStructGetSize($tErrMessage))
DllClose($hDll)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
203
Код:
ConsoleWrite($date & @CRLF)
; но не выводит первый вывод из переменной $date. В чем проблема не понимаю. Уже два дня мучаюсь, голову сломал... ПАМАГИТЕ!!!
Значение элемента массива так не получить. 2 дня мучаетесь и не смотрели пример в справке?

DllCall
Справка сказал(а):
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
Значение элемента массива так не получить. 2 дня мучаетесь и не смотрели пример в справке?

DllCall
Я конечно извиняюсь но где там массив ? Там отдельная функция для получения каждого отдельного доп параметра которая вызывается из колбека и возвращает либо строковое значение либо числовое. Я же на описание функции ссылку дал. Или я чего-то не понимаю?
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
203
Или я чего-то не понимаю?
Да.

Я конечно извиняюсь но где там массив ?
DllCall при успехе возвращает массив, первая ячейка которого содержит возвращаемое функцией значение, последующие ячейки содержат значения переданных параметров. Посмотрите справку, пример или хотя бы прочитайте то что написано скриншотах из справки к DllCall, которые я прикрепил. Ибо я повторяю то что уже написал.
 
Автор
kodges

kodges

Новичок
Сообщения
42
Репутация
0
DllCall при успехе возвращает массив, первая ячейка которого содержит возвращаемое функцией значение, последующие ячейки содержат значения переданных параметров. Посмотрите справку, пример или хотя бы прочитайте то что написано скриншотах из справки к DllCall, которые я прикрепил. Ибо я повторяю то что уже написал.
Бога ради, простите мою тупизну и криворукость. Все получилось )) Спасибо Вам большое!
 
Верх