Нужна помощь профессионального программиста - страница 21

 
У меня что-то библиотека их не грузится "cgate_net64.dll". Старую студию что-ли надо - не понятно пока.
 
Dmitriy Skub #:
У меня что-то библиотека их не грузится "cgate_net64.dll". Старую студию что-ли надо - не понятно пока.

Не знаю, почему не грузится.

Ответили с биржи по поводу поля "f"

Техническая поддержка
Сегодня, 17:18
Кому:вам
Решение:
Добрый день!

Значение поля f - double - число с плавающей точкой двойной точности размером 8 байт
 
Dmitriy Skub #:
У меня что-то библиотека их не грузится "cgate_net64.dll". Старую студию что-ли надо - не понятно пока.

У меня тоже моя не грузилась.

Я вызвал SetCurrentDirectory(PwideChar(ExtractFilePath(aName))); и все заработало

 
prostotrader #:

У меня тоже моя не грузилась.

Я вызвал SeCurrentDir() и все заработало

https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectorya скорее нужен. Точнее точно он

SetDllDirectoryA function (winbase.h) - Win32 apps
SetDllDirectoryA function (winbase.h) - Win32 apps
  • 2023.02.09
  • GrantMeStrength
  • learn.microsoft.com
Adds a directory to the search path used to locate DLLs for the application. (ANSI)
 
Maxim Kuznetsov #:

https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setdlldirectorya скорее нужен. Точнее точно он

Это для С++, а у меня С#. Качаю сейчас VS2013 - если не поможет, придется на С++ коннектор писать. Не хотелось бы.

Директория ни при чем - там она пишет про не верный формат.

 
Dmitriy Skub #:

Это для С++, а у меня С#. Качаю сейчас VS2013 - если не поможет, придется на С++ коннектор писать. Не хотелось бы.

Директория ни при чем - там она пишет про не верный формат.

Я сказал, как было у меня

 
Dmitriy Skub #:

Это для С++, а у меня С#. Качаю сейчас VS2013 - если не поможет, придется на С++ коннектор писать. Не хотелось бы.

Директория ни при чем - там она пишет про не верный формат.

это вообще для виндовс..вне зависимости C# или C++

порядок поиска модулей в её требухе. Ищется рядом с создателем задачи, далее в реестре по регистрированным именам, по DllSearchPath, потом в %PATH%, на финал  в текущем каталоге задачи. Примерно так, точнее в справке MS/

вы поменяли текущий каталог и всё нашлось. Хотя это и (потом сложно устранимая) ошибка

 
Maxim Kuznetsov #:

это вообще для виндовс..вне зависимости C# или C++

порядок поиска модулей в её требухе. Ищется рядом с создателем задачи, далее в реестре по регистрированным именам, по DllSearchPath, потом в %PATH%, на финал  в текущем каталоге задачи. Примерно так, точнее в справке MS/

вы поменяли текущий каталог и всё нашлось. Хотя это и (потом сложно устранимая) ошибка

Это не я, это Михаил поменял. В студии длл напрямую в проект вставляются (ссылки на них).
 
prostotrader #:

Ответили с биржи по поводу поля "f"

Так в справке все есть - p2gate_ru.pdf


u1 UINT8 SMALLINT Целое число размером 1 байт.
u2 UINT16 INTEGER Целое число размером 2 байта.
u4 UINT32 NUMERIC,10 Целое число размером 4 байта.
u8 UINT64 NUMERIC,20 Целое число размером 8 байт.
i1 INT8 SMALLINT Целое число со знаком размером 1 байт.
i2 INT16 SMALLINT Целое число со знаком размером 2 байта.
i4 INT32 INTEGER Целое число со знаком размером 4 байта.
i8 INT64 BIGINT Целое число со знаком размером 8 байт.
a CHAR VARCHAR Строка символов размером 1 байт.
cN CHAR[N+1] VARCHAR,N Строка символов, оканчивающаяся нулевым символом.
dN.M sN.M P2BCDII NUMERIC,N,M Десятичное число в двоичной кодировке с фиксированной точ-
кой, где
• N — общее количество цифр в числе;
• M — количество цифр в дробной части.
t P2TIME TIMESTAMP Дата и время.
f DOUBLE REAL Число с плавающей точкой двойной точности размером 8 байт.
bN VARBINARY,N Блок данных.
zN VARBINARY,N Блок данных, где первые четыре байта задают длину буфера.

 
Dmitriy Skub #:
f DOUBLE REAL

Спасибо

До конца файла я не дошел :)

Добавлено

Вы поаккуратнее с этой таблицей, в ней много не правильного!

u2 UINT16 INTEGER Целое число размером 2 байта.

UINT16 - не может быть  INTEGER

и т.д

Я так сделал

function TCGMarketData.GetVarType(const aType: PAnsiChar): integer;
begin
  Result:= varUnknown;
  if(string(aType) = 'i1') then Result:= varShortInt else
  if(string(aType) = 'u1') then Result:= varByte else
  if(string(aType) = 'i2') then Result:= varSmallInt else
  if(string(aType) = 'u2') then Result:= varWord else
  if(string(aType) = 'i4') then Result:= varInteger else
  if(string(aType) = 'u4') then Result:= varLongWord else
  if(string(aType) = 'i8') then Result:= varInt64 else
  if(string(aType) = 'u8') then Result:= varUInt64 else
  if(string(aType) = 't') then Result:= varDate else
  if(string(aType) = 'f') then Result:= varSinpleDouble else
  if(string(aType) = 'a') then Result:= varChar else
  if(Pos('c', string(aType)) > 0) then Result:= varString else
  if(Pos('b', string(aType)) > 0) then Result:= varArray else
  if(Pos('d', string(aType)) > 0) then Result:= varDouble else
  if(Pos('s', string(aType)) > 0) then Result:= varDouble else
  if(Pos('z', string(aType)) > 0) then Result:= varZBinary;
end;
// Added var types
  varChar             = $400F;
  varSinpleDouble = $40F0;
  varZBinary         = $4F00;

В API, есть данные типа double с размером d26.2 - я не стал переводить эти числа в строку, потому что

не представляю, где их можно использовать, а уж тем более как обратно

"запихнуть"  строку в double

Поэтому для всех "d" использую cg_bcd_get 

case aVarType of
                      varShortInt: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PShortInt(@buff^[fild.offset])^;
                      varByte: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PByte(@buff^[fild.offset])^;
                      varSmallInt: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PSmallInt(@buff^[fild.offset])^;
                      varWord: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PWord(@buff^[fild.offset])^;
                      varInteger: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PInteger(@buff^[fild.offset])^;
                      varLongWord: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PLongWord(@buff^[fild.offset])^;
                      varInt64: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PInt64(@buff^[fild.offset])^;
                      varUint64: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PUInt64(@buff^[fild.offset])^;
                      varString: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= string(PAnsiChar(@buff^[fild.offset]));
                      varSinpleDouble: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PDouble(@buff^[fild.offset])^;  // fild type "f"
                      varDate: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PUInt64(@buff^[fild.offset])^;
                      varDouble: begin
  //----------------  Warning! not support more then 19 gigits !!!! --------------
  //----------------  26 digits converts same function              --------------
                        h_res:= cg_bcd_get(@buff^[fild.offset], inVal, inSize);
                        if(h_res = CG_ERR_OK) then
                          Streams[strData.Pos].Tables[i].Value[RCnt, j]:= inVal.ToDouble /(Power(10.0, inSize));
                      end;
                      varArray: begin
                        SetLength(Buffer, fild.size);
                        Move(buff^[fild.offset], Buffer[0], fild.size);
                        Move(Buffer[0], Streams[strData.Pos].Tables[i].Value[RCnt, j], fild.size);
                      end;
                      varChar: Streams[strData.Pos].Tables[i].Value[RCnt, j]:= PByte(@buff^[fild.offset])^;
                      varZBinary: begin
                        SetLength(Buffer, fild.size - 4);
                        Move(buff^[fild.offset + 4], Buffer[0], fild.size -4) 
                        Move(Buffer[0], Streams[strData.Pos].Tables[i].Value[RCnt, j], fild.size - 4);
                      end;
                      varUnknown: begin
                        FmMemoStr:= 'Внимание: Неизвестный тип поля!';
                        Synchronize(UpdMemo);
                      end;
                    end;