powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stdcall
25 сообщений из 34, страница 1 из 2
stdcall
    #39651186
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Пришлось столкнуться с директивами вызова процедур и функций, т.к. их импортирую из dll, так вот после удачного вызова двух таких функций, на строчке банальной записи в мемо MyMemo.Lines.Add('Устройство готово'); появляется исключение access violation видимо какая-то проблема со стеком? Убираю stdcall ошибки нет, но функции не работают.Может кто сталкивался? Заранее спасибо.
...
Рейтинг: 0 / 0
stdcall
    #39651196
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
Параметры типа string есть?
...
Рейтинг: 0 / 0
stdcall
    #39651197
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
function DecoderCreate( NKan : integer; DecoderType : integer; DH : TDataHandler; S : Pointer; PSS : TSpecialParametrs) : TDecoder; stdcall; external 'DLLDecoder.dll' name '_DecoderCreate';
function DecoderOpen( PDecoder : TDecoder; i : integer) : Integer; stdcall; external 'DLLDecoder.dll' name '_DecoderOpen';
...
Рейтинг: 0 / 0
stdcall
    #39651198
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968function DecoderCreate( NKan : integer; DecoderType : integer; DH : TDataHandler; S : Pointer ; PSS : TSpecialParametrs) : TDecoder; stdcall; external 'DLLDecoder.dll' name '_DecoderCreate';
Кто должен выделять память - ваше приложение или dll-ка? Уверены ли вы в том, что эта функция не пишет ничего за пределы выделенной памяти? Ну и т.п.
...
Рейтинг: 0 / 0
stdcall
    #39651206
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по всему моё приложение, вот код перед вызовом

PortBase := StrToInt(EPortNumber.Text);
A_S := EServerAddress.Text;
ServerAddress := PChar(A_S);
NKan := 1;
PSpecialParametrs := New(TSpecialParametrs);
PSpecialParametrs.FilterType := 0;
for ind := 0 to Length(PSpecialParametrs.Popravka) - 1 do PSpecialParametrs.Popravka[ind] := 0;
PSpecialParametrs.AveragingFactor := StrToInt(EAveragingFactor.Text); // Коэффициент усреднения данных
PSpecialParametrs.SpeedMeasurementPeriod := 1000; // Период измерения частоты вращения
PSpecialParametrs.VneshnDatchSkor := false;
PSpecialParametrs.ServerMode := false;
PSpecialParametrs.ComPortNumber := StrToInt(EComPortNumber.Text);
PSpecialParametrs.MODBUS_DeviceAddress := StrToInt(EUnitNumber.Text);
US := CBBaudRate.Items[CBBaudRate.ItemIndex];
ParamComPort.BaudRate := PChar(US);
ParamComPort.BiteSize := '8';
ParamComPort.Parity := '0';
ParamComPort.StopBits := '0';
PSpecialParametrs.PParamComPort := @ParamComPort;
PSpecialParametrs.ServerAddress := ServerAddress; // Адрес декодера в локальной сети
PSpecialParametrs.AnotherServerBasePortNumber := PortBase;// Базовый адрес порта декодера
PSpecialParametrs.ServerChannelNumber := 0;
PSpecialParametrs.OwnServerBasePortNumber := 0;

PDecoder := DecoderCreate( NKan, DecoderType, DataHandler, self, PSpecialParametrs);

Dispose(PSpecialParametrs);
...
Рейтинг: 0 / 0
stdcall
    #39651211
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968ServerAddress := PChar(A_S);
patrick1968ParamComPort.BaudRate := PChar(US);
ParamComPort.BiteSize := '8';
ParamComPort.Parity := '0';
ParamComPort.StopBits := '0';
PSpecialParametrs.PParamComPort := @ParamComPort;
...
Рейтинг: 0 / 0
stdcall
    #39651213
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локальные переменные ломаются на выходе из процедуры.
...
Рейтинг: 0 / 0
stdcall
    #39651218
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на выходе они уже не нужны
...
Рейтинг: 0 / 0
stdcall
    #39651221
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В структурах есть символьные переменные
...
Рейтинг: 0 / 0
stdcall
    #39651233
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,

а для чего ты self передаешь? Что там с ним делается?
Код: pascal
1.
PDecoder := DecoderCreate( NKan, DecoderType, DataHandler, self, PSpecialParametrs);
...
Рейтинг: 0 / 0
stdcall
    #39651237
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968на выходе они уже не нужны
Там нет потоков? Откуда там знают длину строк? ДЛЛ на делфи той же версии написана?
...
Рейтинг: 0 / 0
stdcall
    #39651259
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanОткуда там знают длину строк?
Они же на #0 заканчиваются. dll, судя по всему, на c++ builder'е писана.
...
Рейтинг: 0 / 0
stdcall
    #39651273
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpОни же на #0 заканчиваются
Ась? А как в делфи работает строка 'asd'#0'asdlkfja'?
Код: pascal
1.
2.
  s := 'asd'#0'asdlkfja';
  ShowMessageFmt('%d', [Length(s)]);
...
Рейтинг: 0 / 0
stdcall
    #39651281
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpОни же на #0 заканчиваются
Ась? А как в делфи работает строка 'asd'#0'asdlkfja'?
Код: pascal
1.
2.
  s := 'asd'#0'asdlkfja';
  ShowMessageFmt('%d', [Length(s)]);


TMemo.Text эту строку присвой и узнаешь как она работает.
То что string'и в Delphi могут использоваться как буферы для двоичных данных не означает что это прокатывает для PChar и иже с ним.
...
Рейтинг: 0 / 0
stdcall
    #39651287
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpTMemo.Text эту строку присвой и узнаешь как она работает.
Эка тебя занесло...
Это действие посылает в мемо команду и там отрабатывает иной (системный) код, нежели в делфи.
...
Рейтинг: 0 / 0
stdcall
    #39651305
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно точно stdcall должно быть, а не cdecl?
...
Рейтинг: 0 / 0
stdcall
    #39651307
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpTMemo.Text эту строку присвой и узнаешь как она работает.
Эка тебя занесло...
Это действие посылает в мемо команду и там отрабатывает иной (системный) код, нежели в делфи.
Ну так библиотека, из которой функции вызываются, тоже не в дельфи написана, как я понял...
...
Рейтинг: 0 / 0
stdcall
    #39651310
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpОни же на #0 заканчиваются
Ась? А как в делфи работает строка 'asd'#0'asdlkfja'?
Код: pascal
1.
2.
  s := 'asd'#0'asdlkfja';
  ShowMessageFmt('%d', [Length(s)]);

Работает потому, что делфи ее длину берет перед началом, ибо знает, что это делфовая строка.
Но в конце еще один ноль таки есть, автоматом она его туда кладет. Для того, чтобы не только в делфи работало.
...
Рейтинг: 0 / 0
stdcall
    #39651328
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
библиотека сишная, скорее всего
...
Рейтинг: 0 / 0
stdcall
    #39651329
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а self передается по сему как в сишных примерах (они рабочие) применяется this
...
Рейтинг: 0 / 0
stdcall
    #39651332
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968а self передается по сему как в сишных примерах (они рабочие) применяется this
Солнце мое, ну ведь ты не обезьянка, а программист.
Неужели не знаешь, что в C++ классы другие, чем в Delphi?
Да и "чисто в Delphi" просто так кидать классы между dll нельзя.
...
Рейтинг: 0 / 0
stdcall
    #39651343
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не обеэьяна, но с С++ не работал
...
Рейтинг: 0 / 0
stdcall
    #39651370
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Да, не обеэьяна, но с С++ не работалТогда вас ждет много открытий чудных. Найдите документацию на библиотеку, если ее нет, то садитесь за дизассемблер. Возможные открытия (не все):
0) Вызывать библиотеки x64 из x32 нельзя (и наоборот). Некоторые находят способ обойти это ограничение, но так делать не надо.
1) Существуют несколько соглашений о вызовах, они используются почти все. Хорошо, если не одновременно ("ой, я stdcall забыл написать"). В x64 их унифицировали.
2) У С есть замечательная возможность - создавать функции с переменным числом параметров.
3) Строки Delphi и C очень разные (C++ Builder исключение), string и std::string несовместимы, нормальная передача возможна через кусок памяти (массивы симоволов). Символы, кстати, тоже бывают разные и занимают разное число байт, но даже при одинаковом количестве байт, один символ может быть задан разными числами - следите закодировкой.
4) При передаче структур, учитывайте требуемое выравнивание, иначе получите кашу.
5) Real раньше был 6 байт, а extended на x64 сделали 8 байт (уроды). На x64 integer 4 байта, а указатель - 8.
...
Рейтинг: 0 / 0
stdcall
    #39651379
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bk00102) У С есть замечательная возможность - создавать функции с переменным числом параметров.
Как выстрелить себе в ногу на 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
    #39651385
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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'); // вызов


это же ещё додуматься до такого надо
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / stdcall
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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