Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / вызов длл написанную на DelphiXE из системы на Delphi2007 / 25 сообщений из 28, страница 1 из 2
17.08.2021, 12:23
    #40091171
LadyShack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Добрый день.

Есть длл, написанная на DelphiXE.
В ней есть функция
Код: pascal
1.
2.
function GetLastLogText(AMaxSize: NativeUInt; ABuffer: PAnsiChar): NativeUInt;
                                 {$IFDEF MSWINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}



В консольном приложении Делфи2007 делаю обёртку и вызов
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function GetLastLogText(AMaxSize: integer; ABuffer: PWideChar): integer;
         stdcall; external 'c:\dllFR1292016_ХХХХ.dll';

...
function LastLogText () : string;
  var
    Buffer  : PWideChar;
    Len     : integer;
  begin
    GetMem(Buffer, __MaxSize);
    Len := GetLastLogText(__MaxSize, Buffer);
    Result := Copy(Buffer, 1, Len);
  end;


На строке
Len := GetLastLogText(__MaxSize, Buffer);
Просто вываливается
...
Рейтинг: 0 / 0
17.08.2021, 12:35
    #40091175
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShack
Код: pascal
1.
AMaxSize: NativeUInt; ABuffer: PAnsiChar


LadyShack
Код: pascal
1.
AMaxSize: integer; ABuffer: PWideChar


То есть это совсем не смущает?
...
Рейтинг: 0 / 0
17.08.2021, 12:41
    #40091179
LadyShack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
wadman, Не смущает, потому как такой вариант тоже был, результат тот же
Код: pascal
1.
2.
function GetLastLogText(AMaxSize: NativeUInt; ABuffer: PAnsiChar): NativeUInt;
         stdcall; external 'c:\dllFR1292016_ХХХХ.dll';
...
Рейтинг: 0 / 0
17.08.2021, 12:47
    #40091181
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShack,

Выставьте обеих сторон PAnsiChar, не томи уже.
...
Рейтинг: 0 / 0
17.08.2021, 12:52
    #40091182
LadyShack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Vlad F, повторю предыдущий пост, что такая реализация тоже была, результат тот же
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function GetLastLogText(AMaxSize: NativeUInt; ABuffer: PAnsiChar): NativeUInt;
         stdcall; external 'c:\dllFR1292016_ХХХХ.dll';
...
function LastLogText () : string;
  var
    Buffer  : PAnsiChar;
    Len     : NativeUInt;
  begin
    GetMem(Buffer, __MaxSize);
    Len := GetLastLogText(__MaxSize, Buffer);
    Result := Copy(Buffer, 1, Len);
  end;
...
Рейтинг: 0 / 0
17.08.2021, 12:58
    #40091185
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShackтакая реализация тоже была, результат тот же

А ничего, что в 2007-й был кривой NativeInt, не соответствующий позднейшим версиям?..
А ничего, что у вас в вызове Copy идёт выход за пределы буфера?..

Вы вообще свой код отлаживать до уровня ассемблера пытались или сразу перешли на пляски с
бубном?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.08.2021, 13:24
    #40091194
LadyShack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Dimitry Sibiryakov, я показала, что было два варианта и integer и NativUInt.
Почему вы решили, что Buffer выходит за размер?
А потом до строки с копированием дело не доходит, рушится на вызове.
...
Рейтинг: 0 / 0
17.08.2021, 13:34
    #40091197
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShackя показала, что было два варианта и integer и NativUInt.

Вы показали, что меняли типы от балды. Вполне могли сменить правильный вариант на
неправильный.

LadyShackПочему вы решили, что Buffer выходит за размер?

Потому что элементы массива символов (в отличии от строк) нумеруются с нуля. И, строго
говоря, Copy() к ним вообще применять нельзя.

LadyShackрушится на вызове.

Почему Вы так думаете?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.08.2021, 16:59
    #40091285
LadyShack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Проблема разрешилась.
Необходимо переопределить NativeUInt. В Делфи2007 размер NativeUInt равен 8 байт, а в ДелфиХЕ для win32 размер NativeUInt равен 4 байта.
Код: pascal
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.
program Test_dllFR1292016_XXXX;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  NativeUInt = cardinal;

function GetLastLogText(AMaxSize: NativeUInt; ABuffer: PAnsiChar): NativeUInt;
         stdcall; external 'c:\dllFR1292016_XXXX.dll';

function GetLastErrorText(AMaxSize: NativeUInt; ABuffer: PAnsiChar): NativeUInt;
         stdcall; external 'c:\dllFR1292016_XXXX.dll';

function GetLastErrorCode: HRESULT;
         stdcall; external 'c:\dllFR1292016_XXXX.dll';

const
  __MaxSize = 4000;

  function LastLogText () : string;
  var
    Buffer  : PAnsiChar;
    Len     : NativeUInt;
  begin
    GetMem(Buffer, __MaxSize);
    Len := GetLastLogText(__MaxSize, Buffer);
    Result := Copy(Buffer, 1, Len);
  end;

  function LastErrorText () : string;
  var
    Buffer  : PAnsiChar;
    Len     : NativeUInt;
  begin
    GetMem(Buffer, __MaxSize);
    Len := GetLastErrorText(__MaxSize, Buffer);
    Result := Copy(Buffer, 1, Len);
    Result := Format('[%d] ', [GetLastErrorCode]) + Result;
  end;

function CalcDensityNP(
         const ADensityUp, ADensityMid, ADensityDown : double;
         const ALevelTotal, ADiametr : NativeUInt;
         var ADensityNP : double) : HRESULT;
         stdcall; external 'c:\dllFR1292016_XXXX.dll';

var
  Res : HRESULT;
  DensNP : double;
begin
  try
    Res := CalcDensityNP(675, 675, 884.78, 700, 80, DensNP);
    WriteLn(Format('DensNP=%.4f', [DensNP]));

    WriteLn(LastLogText());
    if Res <> 0 then
      Writeln(LastErrorText());
    Readln;
  except
    on E:Exception do
    begin
      Writeln(E.Classname, ': ', E.Message);
      Readln;
    end;
  end;
end.



Dimitry SibiryakovПотому что элементы массива символов (в отличии от строк) нумеруются с нуля.

Копирование произвелось корректно, съедание начального символа не было. Так что это предположение не верно
...
Рейтинг: 0 / 0
17.08.2021, 17:32
    #40091303
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShack
Проблема разрешилась.
Необходимо переопределить NativeUInt.
Жесть.
Особенно смешно будет если ты заюзаешь этот юнит где не надо.

А чего просто integer не взять, а?
...
Рейтинг: 0 / 0
17.08.2021, 19:21
    #40091320
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
LadyShackКопирование произвелось корректно, съедание начального символа не было.

Это, увы, из разряда "дуракам везёт": Дельфи автоматически преобразовала указатель в
строку и код не упал только потому, что терминируюший нуль случайно оказался в пределах
читабельного адресного пространства.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18.08.2021, 13:51
    #40091486
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Из https://github.com/Fr0sT-Brutal/Delphi_Compilers

{$IF DEFINED(RAD_XE2_UP)}
// NativeInt, NativeUInt are fixed?
{$DEFINE CAPS_NATIVEOK}
{$IFEND}

соответственно

$ifndef CAPS_NATIVEOK
type NativeInt = {$IFDEF CPU386} Int32 {$IFDEF CPUX64} Int64

скобочки и прочее лень расставлять
...
Рейтинг: 0 / 0
19.08.2021, 10:25
    #40091700
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
...
Рейтинг: 0 / 0
19.08.2021, 11:22
    #40091728
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007

Я его применяю для utf8 строк при общении с питоном, где очень вряд ли есть виндовые widestring. Да и в *nix, как я понимаю, в основном utf8.
...
Рейтинг: 0 / 0
19.08.2021, 17:08
    #40091921
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Речь идёт про проектирование API для своих DLL. Причём тут питон и любые другие "не свои" API?
...
Рейтинг: 0 / 0
19.08.2021, 19:39
    #40092002
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
GunSmoker, С точки зрения производительности (вдруг функцию нужно 100500 раз вызвать из dll), WideString проигрывает указателям.
...
Рейтинг: 0 / 0
20.08.2021, 09:15
    #40092107
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
zedxxx
GunSmoker, С точки зрения производительности (вдруг функцию нужно 100500 раз вызвать из dll), WideString проигрывает указателям.
на сколько производительность хуже? Есть тесты, подтверждающие ваши слова?
...
Рейтинг: 0 / 0
20.08.2021, 10:40
    #40092140
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
asutp2, Нет, тестов нету. Но с давних времён как-то остался негативный опыт с WideString и я их теперь предпочитаю обходить стороной.
...
Рейтинг: 0 / 0
20.08.2021, 10:57
    #40092154
zedxxx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Хотя, дело было точно ещё до юникодных версий Delphi, так что если и в dll и в exe использовать юникодную версию, то оверхеда на создание/уничтожение промежуточной WideString не будет и всё окажется не так печально.
...
Рейтинг: 0 / 0
20.08.2021, 12:30
    #40092197
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Если на каждую итерацию выделять-уничтожать строки, а указатели - нет, то конечно проиграет :). Насчет равных условий не уверен: возможно, системный вызов потяжелее родного менеджера памяти, но вряд ли намного.
...
Рейтинг: 0 / 0
20.08.2021, 19:24
    #40092352
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
WideString - очень медленная штука в сравнении с string, PChar... Но для некоторых случаев удобная
...
Рейтинг: 0 / 0
24.08.2021, 16:05
    #40092934
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
zedxxx
С точки зрения производительности (вдруг функцию нужно 100500 раз вызвать из dll), WideString проигрывает указателям.

Преждевременная оптимизация - корень всех бед. Если у тебя базилион вызовов, то как бы и String надо убирать.
...
Рейтинг: 0 / 0
24.08.2021, 16:37
    #40092936
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
zedxxx
GunSmoker, С точки зрения производительности (вдруг функцию нужно 100500 раз вызвать из dll), WideString проигрывает указателям.

С точки зрения проектирования API, а как правило и с точки зрения производительности, обычно лучше использовать родной (для соответствующей версии Delphi) тип String. WideString имеет смысл использовать только в том случае, если пишешь на Delphi плагин для приблуды, написанной на чём-то другом (хотя само по себе это уже вряд ли хорошая мысль).
...
Рейтинг: 0 / 0
24.08.2021, 17:57
    #40092950
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
softwarer
(хотя само по себе это уже вряд ли хорошая мысль).

Чойта?
...
Рейтинг: 0 / 0
24.08.2021, 18:08
    #40092956
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вызов длл написанную на DelphiXE из системы на Delphi2007
Fr0sT-Brutal
softwarer
(хотя само по себе это уже вряд ли хорошая мысль).

Чойта?

Лишних 10-30 Мб ради одной dll-ки. Неэстетичненько как-то.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / вызов длл написанную на DelphiXE из системы на Delphi2007 / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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