Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF DLL 64 бит Delphi / 25 сообщений из 36, страница 1 из 2
31.08.2014, 15:31
    #38733581
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Была DLL UDF под 32 бита, а тут перебросил на 64 бит и все, что связано со строками работает как-то неадекватно. Обычный sybstr (собственный) и тот работает не так... Что там изменилоось?
...
Рейтинг: 0 / 0
31.08.2014, 16:17
    #38733592
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
...
Рейтинг: 0 / 0
31.08.2014, 17:29
    #38733613
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verveБыла DLL UDF под 32 бита, а тут перебросил на 64 бит и все, что связано со
строками работает как-то неадекватно
Программы всегда работают точно так , как написаны.

Ты в курсе, что 64 бит Дельфи - исключительно юникодные?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2014, 18:27
    #38733633
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Dimitry Sibiryakov, да...
Только 32 бита отрабатывает корректно
...
Рейтинг: 0 / 0
31.08.2014, 18:29
    #38733634
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Более того, если функция в Delphi программе, то работает и под 64 битной ОС отлично
...
Рейтинг: 0 / 0
31.08.2014, 19:17
    #38733647
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verveфункция
Исходники показать постесняешься?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2014, 19:18
    #38733650
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verve,

ты пример давай. Код UDF функции, DDL её объявления, ну и собственно запрос в котором она не так работает.

P.S. По возможности от UDF надо оказываться. Это до FB2.1 без них было туго. Сейчас большинство из них можно встроенными заменить.
...
Рейтинг: 0 / 0
31.08.2014, 20:33
    #38733670
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Код: pascal
1.
2.
3.
4.
function SubStr(CString: PWideChar; var FromPos, ToPos: Int64): PWideChar; cdecl; export;
begin
  result:=pchar(copy(cstring, frompos, topos));
end;



Даже если так, то срабатывает так: с нужной позиции берет в 2 раза больше символов
...
Рейтинг: 0 / 0
31.08.2014, 20:35
    #38733672
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verve,

у тебя БД в какой кодировке?

PWideChar - 2 байта на символ PAnsiChar - 1 байт

SubStr - можно заменить на стандартный SUBSTRING
...
Рейтинг: 0 / 0
31.08.2014, 20:36
    #38733673
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Только мне кажется странным преобразовывать widechar в char путём приведения типов???
...
Рейтинг: 0 / 0
31.08.2014, 20:51
    #38733676
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verveДаже если так
И после этого ты утверждаешь, что знаешь об юникодности...

То, что эта функция вообще не валит сервер - уже чудо. Несоответствие параметров
передаваемым типам просто меркнет на фоне возврата указателя на уже освобождённую память.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2014, 21:51
    #38733694
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Код работает под 32 бита)))
...
Рейтинг: 0 / 0
31.08.2014, 22:05
    #38733702
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verveКод работает под 32 бита)))
Во-первых, потому что он скомпилирован какой-нибудь рухлядью типа Delphi 7.
Во-вторых, дуракам везёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.08.2014, 22:08
    #38733703
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Почему?
...
Рейтинг: 0 / 0
01.09.2014, 00:43
    #38733747
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Симонов Денис,

В дельфях с поддеркой Unicode - PWideChar=PChar...
...
Рейтинг: 0 / 0
01.09.2014, 00:45
    #38733748
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verve,

При такой реализации есть неплохой шанс вернуть мусор. Почитай блог GunSmoker`a - он много писал об этом.
...
Рейтинг: 0 / 0
01.09.2014, 07:41
    #38733792
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
DarkMaster,

я бы сказал, что наоборот

PChar=PWideChar ибо PWideChar везде одинаков
...
Рейтинг: 0 / 0
01.09.2014, 09:13
    #38733825
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verveПочему?
Лови рабочий пример. На 64 битном, на юникодной базе работает.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
{$DEFINE FREE_IT}
library wad_udf;

uses
  System.SysUtils,
  ib_util;

type
    PIBDateTime = ^TIBDateTime;
    TIBDateTime = record
        Days, // Date: Days since 17 November 1858
        MSec10: Integer; // Time: Millisecond * 10 since midnigth
    end;

const // константы трансляции даты:
    MSecsPerDay10 = MSecsPerDay * 10; // миллисекунд в сутках * 10
    IBDateDelta = 15018; // разница в днях между датами Delphi 2.0 и InterBase

function DateTimeToChar(var IBDateTime: TIBDateTime; sz: PAnsiChar): PAnsiChar; cdecl; export;
var d: TDateTime;
    u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    with IBDateTime do
        d := Days - IBDateDelta + MSec10 / MSecsPerDay10;
    u := FormatDateTime(UTF8String(sz), d, fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function IntegerToChar(var iLong: integer; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := Format(UTF8String(sz), [iLong], fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function FloatToChar(var F: Double; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := Format(UTF8String(sz), [F], fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function FloatToChar2(var F: Double; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := FormatFloat(UTF8String(sz), F, fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

{$R *.res}

exports
    IntegerToChar,
    FloatToChar,
    FloatToChar2,
    DateTimeToChar;

begin
    IsMultiThread := True;
end.

...
Рейтинг: 0 / 0
01.09.2014, 10:52
    #38733883
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verve,

в конце есть пример юникодной udf, с пояснениями.
http://www.ibase.ru/unicode_faq.html
...
Рейтинг: 0 / 0
05.09.2014, 15:42
    #38738788
verve
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Спасибо! Проблема была в определении длины строки)))
...
Рейтинг: 0 / 0
05.09.2014, 16:01
    #38738816
zirra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
verve> Спасибо! Проблема была в определении длины строки)))
А по-моему проблема в том, что ты не желаешь воспользоваться советом от Симонов Денис ...

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.09.2014, 18:59
    #38741013
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
В прошлом годе озадачился переходом на x64 UDF. В голове родилось такое понимание работы с кодовыми страницами внутри Firebird.
Если в чем-то ошибаюсь, просьба поправить.


...
Рейтинг: 0 / 0
08.09.2014, 19:14
    #38741032
Поручик ·· Ржевский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
FedorinoFFВ прошлом годе озадачился переходом на x64 UDF. В голове родилось такое понимание работы с кодовыми страницами внутри Firebird.
Если в чем-то ошибаюсь, просьба поправить.


...
Рейтинг: 0 / 0
08.09.2014, 21:55
    #38741115
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
Поручик ·· Ржевский,

Да, виноват, неправильно вложил картинку. Правой кнопкой по значку картики под спойлером и открыть ссылку. Откроется страничка с картинкой на Яндекс.Диск
...
Рейтинг: 0 / 0
08.09.2014, 22:47
    #38741128
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UDF DLL 64 бит Delphi
FedorinoFF,

разуй глаза - нет никакой картинки "под спойлером".
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF DLL 64 бит Delphi / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]