Что нового

Проблема с DllCall()

Almas

Новичок
Сообщения
3
Репутация
0
Помогите, плиз. Не работает скрипт (не мой), перепробовал все (без структур), выдает всегда "0":
Код:
;Создаём структуры
$stExtErrCode = DllStructCreate("long")
$pnExtendedErrorCode = DllStructGetPtr($stExtErrCode)

$stErrMessage = DllStructCreate("str")
$lpstrErrorMessage = DllStructGetPtr($stErrMessage)

$dwErrorMessageSize = DllStructGetSize($stErrMessage)

$Path_Quik = "C:\QUICK_VTB24\" ;Определяю путь к программе quik
$dll = DllOpen("TRANS2QUIK.dll") ;Вызываю библиотеку

$result = DllCall($dll, "long", "TRANS2QUIK_CONNECT", _ ;Вызываю функцию TRANS2QUIK_CONNECT
    "str", $Path_Quik, _
    "ptr", $pnExtendedErrorCode, _
    "ptr", $stErrMessage, _
    "dword", $dwErrorMessageSize)

MsgBox(1, "Вывод", DllStructGetData($stErrMessage, 1)); Вывожу результат


$result = DllCall("trans2quik.dll", "str", "TRANS2QUIK_IS_DLL_CONNECT", _ ;Вызываю функцию TRANS2QUIK_CONNECT
    "ptr", $pnExtendedErrorCode, _
    "ptr", $stErrMessage, _
    "dword", $dwErrorMessageSize)

MsgBox(1, "Вывод", DllStructGetData($stErrMessage, 1)); Вывожу результат


Есть код на VBS EXEL - все работает. Что я делаю не так - не пойму.
Если кто заинтересовался, можно на мыло:[email protected]
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Almas
Я в DLL не очень понимаю...
Дождись Yashied, он поможет...
Я могу сделать только одно замечание:
в строках "C:\QUICK_VTB24\" и "TRANS2QUIK.dll"
по-разному написано слово QUICK, что очень странно...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
Ты не можешь задать в качестве параметра при создании структкры строку неопределенной длины.

Код:
$stErrMessage = DllStructCreate("str")


Cделай так:

Код:
$Path_Quik = "C:\QUICK_VTB24\"

$tExtErrCode = DllStructCreate("long")
$tErrMessage = DllStructCreate("char[1024]")

$hDll = DllOpen("TRANS2QUIK.dll")

$aResult = DllCall($hDll, "long", "TRANS2QUIK_CONNECT", _
		"str"  , $Path_Quik, _
		"ptr"  , DllStructGetPtr($tExtErrCode), _
		"ptr"  , DllStructGetPtr($tErrMessage), _
		"dword", DllStructGetSize($tErrMessage))

MsgBox(1, "Вывод", DllStructGetData($tErrMessage, 1))

$result = DllCall("trans2quik.dll", "str", "TRANS2QUIK_IS_DLL_CONNECT", _
		"ptr"  , DllStructGetPtr($tExtErrCode), _
		"ptr"  , DllStructGetPtr($tErrMessage), _
		"dword", DllStructGetSize($tErrMessage))

MsgBox(1, "Вывод", DllStructGetData($tErrMessage, 1))

DllClose($hDll)



Добавлено:
Сообщение автоматически объединено:

Кстати, может быть в названиях функций нужно писать "QUICK", а не "QUIK"?
 
Автор
A

Almas

Новичок
Сообщения
3
Репутация
0
Кстати, может быть в названиях функций нужно писать "QUICK", а не "QUIK"?
Да нет, QUIK как раз правильно - это я на автомате путь неправильно прописал. Но это не важно.
Должна была возвратиться ошибка, что не находит программу QUIK (торговый терминал). Правда, выводить
в этом случае надо $result.
Описание функции в QUIK:
Код:
long TRANS2QUIK_CONNECT(LPCSTR lpcstrConnectionParamsString, long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)

Описание функции:

Параметр Тип Описание 
Result  LONG  Возвращаемое число может принимать следующие значения:

0-TRANS2QUIK_SUCCESS - соединение установлено успешно. 
2-TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND - в указанном каталоге либо отсутствует INFO.EXE, либо у него не запущен сервис обработки внешних подключений, в  pnExtendedErrorCode в этом случае передается 0. 
3-TRANS2QUIK_DLL_VERSION_NOT_SUPPORTED - используемая версия Trans2QUIK.DLL указанным INFO.EXE не поддерживается, в pnExtendedErrorCode в этом случае передается 0. 
4-TRANS2QUIK_DLL_ALREADY_CONNECTED - соединение уже установлено, в pnExtendedErrorCode в этом случае передается 0. 
1-TRANS2QUIK_FAILED - произошла ошибка при установлении соединения, в pnExtendedErrorCode в этом случае передается дополнительный код ошибки.
 
lpcstrConnectionParamsString Указатель на переменную типа LONG  В случае возникновения ошибки может содержать расширенный код ошибки. 
lpstrErrorMessage Указатель на переменную типа STRING В случае возникновения ошибки может получать сообщение о возникшей ошибке. 
dwErrorMessageSize LONG Содержит длину строки, на которую ссылается указатель lpstrErrorMessage.
Спасибо за подсказки, но не работает :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
Во-первых, нужно было сразу дать описание этой Dll или ее функций, во-вторых, таких функций непосредственно в Dll нет, и в-третьих, ты изначально неправильно задал типы данных при вызове DllCall(). Я понятия не имею, что делает эта Dll, но я нашел в сети ее исходный код... и вот как это должно выглядеть:


Код:
$Path_Quik = "C:\QUICK_VTB24\"

$hDll = DllOpen("TRANS2QUIK.dll")

$tErrMessage = DllStructCreate("char[1024]")
$aResult = DllCall($hDll, "long", "[email protected]", "str", $Path_Quik, "long*", 0, "ptr", DllStructGetPtr($tErrMessage), "dword", DllStructGetSize($tErrMessage))
MsgBox(1, "Вывод", DllStructGetData($tErrMessage, 1))
$aResult = DllCall($hDll, "long", "[email protected]", "long*", 0, "ptr", DllStructGetPtr($tErrMessage), "dword", DllStructGetSize($tErrMessage))
MsgBox(1, "Вывод", DllStructGetData($tErrMessage, 1))

DllClose($hDll)
 
Автор
A

Almas

Новичок
Сообщения
3
Репутация
0
Yashied, спасибо! Только я не понял pnExtendedErrorCode - это константа?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 703
Нет, он возвращается в $aResult[2] и $aResult[1] соответственно (символ "*").
 

Крепыш

Новичок
Сообщения
105
Репутация
1
Помогите с вызовом функции.
Передаю транзакцию на сервер функцией TRANS2QUIK_SEND_ASYNC_TRANSACTION:

Код:
Dim $aResult = DllCall($hDll, "long", "[email protected]", "str", "TRANS_ID="&$nTransID&"; ACCOUNT="&$sAccount&"; ACTION=KILL_ALL_FUTURES_ORDERS; CLASSCODE="&$sClassCode&"; BASE_CONTRACT=RTS;", "long*", 0, "ptr", DllStructGetPtr($tErrMessage), "dword", DllStructGetSize($tErrMessage))
If $aResult[0] == 0 Then
  MsgBox(64, $sTitle, "Транзакция успешно отправлена на сервер")
Else
  MsgBox(16, $sTitle, $aErrorCode[$aResult[0]] &@CRLF& DllStructGetData($tErrMessage, 1) &@CRLF& "Error code: " & $aResult[0])
EndIf


Нужно вызвать функцию обратного вызова TRANS2QUIK_TRANSACTIONS_REPLY_CALLBACK для получения результата выполнения транзакции.

Код:
Функция TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK

Устанавливает функцию обратного вызова для получения информации об отправленной асинхронной транзакции.

long TRANS2QUIK_SET_TRANSACTIONS_REPLY_CALLBACK (TRANS2QUIK_TRANSACTION_REPLY_CALLBACK pfTransactionReplyCallback, long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)

Параметр	Описание 
Result	Тип: Long. Возвращаемое число может принимать следующие значения:

TRANS2QUIK_SUCCESS – функция обратного вызова установлена, 
TRANS2QUIK_FAILED – функцию обратного вызова установить не удалось. В этом случае в переменную pnExtendedErrorCode может передаваться дополнительный код ошибки
 
TRANS2QUIK_TRANSACTION_REPLY_CALLBACK	Тип: указатель на функцию. Указывается ссылка на функцию, которая будет обрабатывать информацию об отправленной транзакции 
pnExtendedErrorCode	Тип: указатель на переменную типа Long. В случае возникновения ошибки может содержать расширенный код ошибки 
lpstrErrorMessage	Тип: указатель на переменную типа Строка. В случае возникновения ошибки может получать сообщение о возникшей ошибке 
dwErrorMessageSize	Тип: Long. Содержит длину строки, на которую ссылается указатель lpstrErrorMessage
Код:
Функция TRANS2QUIK_TRANSACTIONS_REPLY_CALLBACK
Описание прототипа функции обратного вызова для обработки полученной информации об отправленной транзакции.

void TRANS2QUIK_TRANSACTION_REPLY_CALLBACK (long nTransactionResult, long nTransactionExtendedErrorCode, long nTransactionReplyCode, DWORD dwTransId, double dOrderNum, LPSTR lpstrTransactionReplyMessage)

Параметр	Описание 
nTransactionResult	Тип: Long. Возвращаемое число может принимать следующие значения:

TRANS2QUIK_SUCCESS – транзакция передана успешно, 
TRANS2QUIK_DLL_NOT_CONNECTED – отсутствует соединение между библиотекой Trans2QUIK.dll и терминалом QUIK, 
TRANS2QUIK_QUIK_NOT_CONNECTED – отсутствует соединение между терминалом QUIK и сервером, 
TRANS2QUIK_FAILED – транзакцию передать не удалось. В этом случае в переменную pnExtendedErrorCode может передаваться дополнительный код ошибки
 
nTransactionExtendedErrorCode	Тип: Long. В случае возникновения проблемы при выходе из функции обратного вызова в переменную может быть помещен расширенный код ошибки 
nTransactionReplyCode	Тип: Long. Указатель для получения статуса выполнения транзакции. Значения статусов те же самые, что и при подаче заявок через файл 
dwTransId	Тип: Long. Содержимое параметра TransId, который получила зарегистрированная транзакция 
dOrderNum	Тип: Double. Номер заявки, присвоенный торговой системой в результате выполнения транзакции 
lpstrTransactionReplyMessage	Тип: строка. Сообщение от торговой системы или сервера QUIK
 

Крепыш

Новичок
Сообщения
105
Репутация
1
Наваял функцию обратного вызова для контроля за состоянием соединения:

Код:
Global Const $sPathQuik = 'C:\Programs\Quik\'
Global $tErrMessage = DllStructCreate('char[1024]')
Global $hDll = DllOpen(@ScriptDir&'\Trans2QUIK.dll')
DllCall($hDll, 'long', '[email protected]', 'str', $sPathQuik, 'long*', 0, 'ptr', DllStructGetPtr($tErrMessage), 'dword', DllStructGetSize($tErrMessage))

Global $handle = DLLCallbackRegister('pfConnectionStatusCallback', 'int', 'long;long;ptr')

Local $aResult = DllCall($hDll, 'long', '[email protected]', 'ptr', DllCallbackGetPtr($handle), 'long*', 0, 'ptr', DllStructGetPtr($tErrMessage), 'dword', DllStructGetSize($tErrMessage))
ConsoleWrite('Res:'&$aResult[0]&'; ErrCode:'&$aResult[2]&'; ErrMess:'&DllStructGetData($tErrMessage,1)&@CRLF)

If $aResult[0] == 0 Then
  ConsoleWrite('OK: Функция обратного вызова установлена'&@CRLF)
Else
  ConsoleWriteError('Err: Функцию обратного вызова установить не удалось'&@CRLF)
EndIf

DllCall($hDll, 'long', '[email protected]', 'long*', 0, 'ptr', DllStructGetPtr($tErrMessage), 'dword', DllStructGetSize($tErrMessage))
DllCallbackFree($handle)
DllClose($hDll)

Func pfConnectionStatusCallback($nConnectionEvent, $pnExtendedErrorCode, $lpstrErrorMessage)
  ConsoleWrite('Res:'&$nConnectionEvent&'; ErrCode:'&$pnExtendedErrorCode&'; ErrMess:'&$lpstrErrorMessage&@CRLF)
EndFunc


Вот описание функции:

Код:
Функция TRANS2QUIK_CONNECTION_STATUS_CALLBACK

Описание прототипа функции обратного вызова для контроля за состоянием соединения между библиотекой Trans2QUIK.dll и используемым терминалом QUIK и между используемым терминалом QUIK и сервером.

void TRANS2QUIK_CONNECTION_STATUS_CALLBACK (long nConnectionEvent, long nExtendedErrorCode, LPSTR lpstrInfoMessage)

Параметр Описание 
nConnectionEvent Тип: Long. Возвращаемое число может принимать следующие значения:

TRANS2QUIK_QUIK_CONNECTED – соединение между терминалом QUIK и сервером установлено, 
TRANS2QUIK_QUIK_DISCONNECTED – соединение между терминалом QUIK и сервером разорвано, 
TRANS2QUIK_DLL_CONNECTED – соединение между DLL и используемым терминалом QUIK установлено, 
TRANS2QUIK_DLL_DISCONNECTED – соединение между DLL и используемым терминалом QUIK разорвано
 
pnExtendedErrorCode Тип: Long. В случае возникновения ошибки может содержать расширенный код ошибки 
lpstrErrorMessage Тип: Строка. В случае возникновения ошибки может получать сообщение о возникшей ошибке
 
Верх