|
|
|
stdcall
|
|||
|---|---|---|---|
|
#18+
Добрый день. Пришлось столкнуться с директивами вызова процедур и функций, т.к. их импортирую из dll, так вот после удачного вызова двух таких функций, на строчке банальной записи в мемо MyMemo.Lines.Add('Устройство готово'); появляется исключение access violation видимо какая-то проблема со стеком? Убираю stdcall ошибки нет, но функции не работают.Может кто сталкивался? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:37 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968, Параметры типа string есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:44 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
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'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:46 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968function DecoderCreate( NKan : integer; DecoderType : integer; DH : TDataHandler; S : Pointer ; PSS : TSpecialParametrs) : TDecoder; stdcall; external 'DLLDecoder.dll' name '_DecoderCreate'; Кто должен выделять память - ваше приложение или dll-ка? Уверены ли вы в том, что эта функция не пишет ничего за пределы выделенной памяти? Ну и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:48 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
Судя по всему моё приложение, вот код перед вызовом 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 16:57 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968ServerAddress := PChar(A_S); patrick1968ParamComPort.BaudRate := PChar(US); ParamComPort.BiteSize := '8'; ParamComPort.Parity := '0'; ParamComPort.StopBits := '0'; PSpecialParametrs.PParamComPort := @ParamComPort; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:02 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
Локальные переменные ломаются на выходе из процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:02 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
на выходе они уже не нужны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:04 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
В структурах есть символьные переменные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:07 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968, а для чего ты self передаешь? Что там с ним делается? Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:13 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968на выходе они уже не нужны Там нет потоков? Откуда там знают длину строк? ДЛЛ на делфи той же версии написана? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:14 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
wadmanОткуда там знают длину строк? Они же на #0 заканчиваются. dll, судя по всему, на c++ builder'е писана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:35 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
alekcvpОни же на #0 заканчиваются Ась? А как в делфи работает строка 'asd'#0'asdlkfja'? Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:52 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
wadmanalekcvpОни же на #0 заканчиваются Ась? А как в делфи работает строка 'asd'#0'asdlkfja'? Код: pascal 1. 2. TMemo.Text эту строку присвой и узнаешь как она работает. То что string'и в Delphi могут использоваться как буферы для двоичных данных не означает что это прокатывает для PChar и иже с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 17:58 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
alekcvpTMemo.Text эту строку присвой и узнаешь как она работает. Эка тебя занесло... Это действие посылает в мемо команду и там отрабатывает иной (системный) код, нежели в делфи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:08 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
Оно точно stdcall должно быть, а не cdecl? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:39 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
wadmanalekcvpTMemo.Text эту строку присвой и узнаешь как она работает. Эка тебя занесло... Это действие посылает в мемо команду и там отрабатывает иной (системный) код, нежели в делфи. Ну так библиотека, из которой функции вызываются, тоже не в дельфи написана, как я понял... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:40 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
wadmanalekcvpОни же на #0 заканчиваются Ась? А как в делфи работает строка 'asd'#0'asdlkfja'? Код: pascal 1. 2. Работает потому, что делфи ее длину берет перед началом, ибо знает, что это делфовая строка. Но в конце еще один ноль таки есть, автоматом она его туда кладет. Для того, чтобы не только в делфи работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 18:53 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
библиотека сишная, скорее всего ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 19:45 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
а self передается по сему как в сишных примерах (они рабочие) применяется this ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 19:47 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
patrick1968а self передается по сему как в сишных примерах (они рабочие) применяется this Солнце мое, ну ведь ты не обезьянка, а программист. Неужели не знаешь, что в C++ классы другие, чем в Delphi? Да и "чисто в Delphi" просто так кидать классы между dll нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 19:52 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
Да, не обеэьяна, но с С++ не работал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 20:08 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 22:00 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 22:31 |
|
||
|
stdcall
|
|||
|---|---|---|---|
|
#18+
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. это же ещё додуматься до такого надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2018, 22:58 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=107&tid=2040837]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 346ms |

| 0 / 0 |
