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

Есть длл, написанная на 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
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091175
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LadyShack
Код: pascal
1.
AMaxSize: NativeUInt; ABuffer: PAnsiChar


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


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

Выставьте обеих сторон PAnsiChar, не томи уже.
...
Рейтинг: 0 / 0
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091182
LadyShack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091185
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LadyShackтакая реализация тоже была, результат тот же

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

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

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

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

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

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

Почему Вы так думаете?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091285
LadyShack
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема разрешилась.
Необходимо переопределить 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
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091303
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LadyShack
Проблема разрешилась.
Необходимо переопределить NativeUInt.
Жесть.
Особенно смешно будет если ты заюзаешь этот юнит где не надо.

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

Это, увы, из разряда "дуракам везёт": Дельфи автоматически преобразовала указатель в
строку и код не упал только потому, что терминируюший нуль случайно оказался в пределах
читабельного адресного пространства.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091486
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из 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
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091700
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
вызов длл написанную на DelphiXE из системы на Delphi2007
    #40091728
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

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

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

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

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

Чойта?

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


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