Павел (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Delphi XE4 и trans2quik.dll
 
Михаил, добрый день.

Попытался использовать Ваш unit tr2quik; (Delphi XE8, trans2quik 1.3)

T2QConnect успешно, а при вызове функции T2QSendSyncTrans получаю Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
Подскажите, с какими параметрами (и типами переменных) Вы вызываете функцию?

Может быть, есть идеи, от чего ошибка может возникать?

var
 ErrCode, pnRC: long;
 ErrMsg: LPSTR;
 ErrMsgSize, dwRMS: Dword;
 RM: PAnsiChar;
 pdwTI: PDWORD;
 pdON: UInt64;
 res: integer;
begin
 ErrCode:=0;
 ErrMsg:=nil;
 ErrMsgSize:=0;
 pnRC:=0;
 RM:=nil;
 dwRMS:=0;
 pdwTI:=nil;
 pdON:=0;
 res:=T2QSendSyncTrans(LPSTR(AnsiString('TRANS_ID=1;CLASSCODE=BQND;ACTION=Ввод заявки;Код торгового счета=L01-00000F00;К/П=Купля;Тип=Лимитированная;Режим=BQND;Инструмент=RU000A0ZYYN4;Цена=90.000000;Количество=20;Примечание=;Условие исполнения=Поставить в очередь;')), pnRC, pdwTI, pdON, RM, dwRMS, ErrCode, ErrMsg, ErrMsgSize);
Прошу помощь в связке trans2quik.dll (1.3) с Delphi
 
Добрый день.

Второй день бьюсь с проблемой. Такое ощущение, что хожу по кругу, не вижу решения, которое под носом.

Delphi XE8 (проект в 64bit) + trans2quik.dll (1.3) + QUIK 9.2.1.4

Подключение к QUIK происходит успешно (t2q_Connect)
Далее пробую Асинхронную отправку транзакции и Синхронную отправку транзакции.
При асинхронной отправке (t2q_SendAsyncTran) транзакция уходит без ошибки, получаю ответ TRANS2QUIK_SUCCESS. В QUIK транзакция попадает в счетчик полученных транзакций, но на сервер почему-то не отправляется.
[img]file:///E:/92/01.jpg[/img]

При синхронной отправке, которая более интересна, получаю ACCESS VIOLATION. Подозреваю, что что-то не так с переменными, возможно напутал с типами.
Код такой примерно:





unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, ComObj, ActiveX;

...

var
 Form1: TForm1;
 dHandle: hModule;

 t2q_connect: function (lpstConnectionParamsString: LPSTR; var pnExtendedErrorCode: long; lpstrErrorMessage: LPSTR; dwErrorMessageSize: DWORD): long; stdcall;
 t2q_SendAsyncTran: function (lpstTransactionString: LPSTR; var pnExtendedErrorCode: long; lpstErrorMessage: LPSTR; dwErrorMessageSize: DWORD): long; stdcall;
 t2q_SendSyncTran: function (lpstTransactionString: LPSTR; var pnReplyCode: long; pdwTransId: PDWORD; pdOrderNum: EntityNumber; lpstrResultMessage: LPSTR; dwResultMessageSize: DWORD; var pnExtendedErrorCode: long; lpstErrorMessage: LPSTR; dwErrorMessageSize: DWORD): long; stdcall;

...

procedure TForm1.FormCreate(Sender: TObject); //запуск программы, подключение trans2quik
var
 ErrCode: long;
 ErrMsg: PAnsiChar;
 ErrMsgSize: Dword;
 res: integer;
begin
 ErrCode:=0;
 ErrMsg:=nil;
 ErrMsgSize:=0;
 dHandle:=LoadLibrary('trans2quik.dll');
 @t2q_Connect:=GetProcAddress(dHandle, PWideChar('TRANS2QUIK_CONNECT'));
 @t2q_SendAsyncTran:=GetProcAddress(dHandle, PWideChar('TRANS2QUIK_SEND_ASYNC_TRANSACTION'));
 @t2q_SendSyncTran:=GetProcAddress(dHandle, PWideChar('TRANS2QUIK_SEND_SYNC_TRANSACTION'));
 res:=t2q_Connect(PAnsiChar(RawByteString(Edit1.Text)), ErrCode, ErrMsg, ErrMsgSize);
 Log('Сообщение о подключении: '+t2q_state[ErrCode]);
end;

procedure TForm1.Button4Click(Sender: TObject); //асинхронная отправка
var
 ErrCode: long;
 ErrMsg: PAnsiChar;
 ErrMsgSize: Dword;
 res: long;
begin
 ErrCode:=0;
 ErrMsg:=nil;
 ErrMsgSize:=0;
 res:=t2q_SendAsyncTran(LPSTR(AnsiString(Memo1.Text)), ErrCode, ErrMsg, ErrMsgSize);
 Log('Отправка транзакции на сервер QUIK: '+t2q_state[res]);
end;

procedure TForm1.Button5Click(Sender: TObject); //синхронная отправка
var
 ErrCode, pnRC: long;
 ErrMsg: PAnsiChar;
 ErrMsgSize, dwRMS: Dword;
 RM: PAnsiChar;
 pdwTI: PDWORD;
 pdON: UInt64;
 res: integer;
begin
 ErrCode:=0;
 ErrMsg:=nil;
 ErrMsgSize:=0;
 pnRC:=0;
 RM:=nil;
 dwRMS:=0;
 pdwTI:=nil;
 pdON:=0;
 res:=t2q_SendSyncTran(LPSTR(AnsiString(Memo1.Text)), pnRC, pdwTI, pdON, RM, dwRMS, ErrCode, ErrMsg, ErrMsgSize);
 Log('Отправка транзакции на сервер QUIK: '+t2q_state[res]);
end;



В Memo1 текст транзакции. Он точно рабочий, т.к. нашел в интернете пример проекта для работы в 32бит trans2quik 1.2, скомпилил на Delphi7 и проверил на QUIK 7.24, транзакция успешно доходит до сервера.
Что со мной не так?
Может быть, кто-нибудь поделится рабочим 64бит проектом, в котором работает TRANS2QUIK_SEND_SYNC_TRANSACTION?
Страницы: 1
Наверх