powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stdcall
9 сообщений из 34, страница 2 из 2
stdcall
    #39651411
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bk0010,

за то тип int64 на 32 битной платформе, эквалентен 64 битному числу.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
program Project1;

var
  v64: int64;
begin
  v64 := High(int64);
  writeln(v64); // 9223372036854775807
  Readln;
end.
...
Рейтинг: 0 / 0
stdcall
    #39651412
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кукарекуbk0010, за то тип int64 на 32 битной платформе, эквалентен 64 битному числу.Это логично
...
Рейтинг: 0 / 0
stdcall
    #39651413
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot alekcvp]Как выстрелить себе в ногу на Delphi:
http://xproger.mentalx.org/delphi_dzen.html
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  VarProc = procedure (Hello: PChar) stdcall varargs; // может и не иметь постоянных параметров

procedure Test(Hello: PChar; Params: Pointer); stdcall;
var
  p : array [0..31] of record
    case Integer of
      0 : (i : LongInt);
      1 : (s : PChar);
    end absolute Params;
begin
  Writeln(Hello, #9, p[0].i, #9, p[1].i, #9, p[2].i, #9, p[3].s);
end;
...
  VarProc(@Test)('Hi', 1, 2, 3, 'test'); // вызов

Охренеть
...
Рейтинг: 0 / 0
stdcall
    #39651418
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bk0010,
Нормально, бывает, нужно в сишную функцию передать ссылку на коллбэк - функцию с переменным числом аргументов.
Например, реализовать (именно на Дельфи) кастомный разбор строки (по типу сишной sprintf()).
Проктостомоталогия - она такая забавная.
...
Рейтинг: 0 / 0
stdcall
    #39651574
Кукареку
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччД__,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function wsprintf(Output: PChar; Format: PChar): Integer; cdecl; varargs;
  external user32 name {$IFDEF UNICODE}'wsprintfW'{$ELSE}'wsprintfA'{$ENDIF};

procedure TForm1.FormCreate(Sender: TObject);
var
  S: String;
begin
  SetLength(S, 1024); // wsprintf can work only with max. 1024 characters
  SetLength(S, wsprintf(PChar(S), '%s %03d', 'Hallo', 3));
end;



https://stackoverflow.com/questions/2471946/sprintf-in-delphi/2472166
...
Рейтинг: 0 / 0
stdcall
    #39651703
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk0010,

с absolut'ом бывают чудеса :) иногда он очень полезен. главное - очень аккуратно использовать.
...
Рейтинг: 0 / 0
stdcall
    #39651758
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpbk00102) У С есть замечательная возможность - создавать функции с переменным числом параметров.
Как выстрелить себе в ногу на Delphi:
http://xproger.mentalx.org/delphi_dzen.html
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  VarProc = procedure (Hello: PChar) stdcall varargs; // может и не иметь постоянных параметров

procedure Test(Hello: PChar; Params: Pointer); stdcall;
var
  p : array [0..31] of record
    case Integer of
      0 : (i : LongInt);
      1 : (s : PChar);
    end absolute Params;
begin
  Writeln(Hello, #9, p[0].i, #9, p[1].i, #9, p[2].i, #9, p[3].s);
end;
...
  VarProc(@Test)('Hi', 1, 2, 3, 'test'); // вызов

А оно вообще работает? В доках говорят The varargs directive works only with external routines and only with the cdecl calling convention. В stdcall вызываемая процедура должна чистить стек, а она же не знает, с каким количеством параметров ее вызовут. А в cdecl стек чистит вызывающая процедура, ну а в месте вызова то известно сколько параметров передано.
...
Рейтинг: 0 / 0
stdcall
    #39651811
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

В Delphi 7 - работает, в остальных не тестил.
И да, сейчас проверил - действительно, при stdcall будет утечка памяти на стеке, при cdecl всё нормально освобождается.
...
Рейтинг: 0 / 0
stdcall
    #39651813
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stdcall
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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