|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
Передача структуры данных в DLL (stdcall)18.11.2009, 21:05. Показов 17765. Ответов 52
Метки нет (Все метки)
Хочу передать данные следующей структуры в DLL:
Поле1: Символьный тип, длинной 15 букв (Pole_1: String[15]) Поле2: "Циферный" тип, длинной 5 цифр И Поле3: Символьный тип, длинной 15 букв (Pole_1: String[15]) Поле4: "Циферный" тип, длинной 5 цифр Поле3 и Поле4 для того что бы DLL записал свои данные, которые я смогу прочитать в моей программе... Как мне указать длинну всех этих полей?
0
|
||||||
| 18.11.2009, 21:05 | |
|
Ответы с готовыми решениями:
52
Конфликт forward и stdcall в dll-библиотеке Передача структуры из C# в DLL на C++ |
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 24.11.2009, 15:34 [ТС] | |
|
Mawrat, твой DLL я не смог запустить, callcobol.exe говорит что-то типа "В данном DLL не найдена функция COBPROG"
О начальной миссии - данные передаются правильно, за что большое спасибо, эта проблема решина!!! То есть передавая данные в TArrChar15 - кобол прога получает их правильно!!! Теперь что касается новой проблемы - невозмоным является принять данные из кобол проги, ABEND-ов (Abnormal End) - я провёл такой эксперимент (ведь запуская программу из Delphi, дебугер оповещает при малейшей проблеме). А проблема возникает не во время GOBACK (по крайней мере в данном случае, передавая данные как TArrChar15), а во время MOVE CAMPO-1 TO CAMPO-2 в кобол программе.... Почему-то видать данные наезжают друг на друга в зарезервированной памяти, но почему не знаю, или что-то другое, что я не понимаю... Заливаю COB.DLL который только выводит полученные 2 поля в консолу и возвращает контроль дельфи проге без каких-либо действий (кажется это ты хотел. Так как я проверил что она не глючит, уже не стал делать полностью пустую DLL, без принятия данных и каких-либо действий. И я убрал все вспомогательные переменные, единственные данные в проге это 2 поля нужные для соединения программ в LINKAGE SECTION, CAMPO-1, CAMPO2 )... Ещё раз спасибо за помощь!
0
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 24.11.2009, 15:37 [ТС] | |
|
БЛИН!!! Сейчас посмотрел - если я делаю MOVE "YUHU FUNCIONA!!" TO CAMPO-1 а не CAMPO-2, то Deplhi прога получает текст правильно без ошибок в CAMPO-1!!!!!!!!.......
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 24.11.2009, 15:45 | |
|
Ок! Я рад, что всё получилось!
![]() Если с передачей других COBOL типов через Dll будут проблемы - пиши. Будем подбирать "контейнеры" (типы данных) в Delphi.
1
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|||||||
| 24.11.2009, 15:59 [ТС] | |||||||
|
И ещё не могу понять одного - не могу скомпилировать прогу когда пишу WS_CAMPO1:=Edit1.Text; пишет "Incompatible types 'TArrChar15' and 'TCaption'... А к Edit2.Text:=WS_CAMPO1; претензий у компилятора нет...
0
|
|||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||
| 24.11.2009, 16:56 | ||||||||
|
А... хотя нет - мы же в обоих случаях передаём 2 параметра... Хотя - не нет, а да - мы передаём 2 параметра, но описан как var именно второй, тогда в случае pascal правила мы при возвращении параметров из функции получим первым как раз второй параметр, видимо! ![]() И можно попробовать так тогда:
![]() Добавлено через 11 минут Т. е. объявив функцию в Delphi программе таким образом, как написано выше, надо передать в качестве первого параметра значение: '000000000000001' А в качестве второго: '000000000000002' Затем в Cobol программе посмотреть в какой из переменных какое из значений пришло. Если в Cobol программе окажется, что: WS_CAMPO1 = '000000000000002' WS_CAMPO2 = '000000000000001' Значит Cobol DLL использует порядок обработки стека отличный от stdcall. Добавлено через 1 минуту Ой, напутал я там - в объявлении функции в Delphi программе надо пока оставить stdcall, а не pascal. А дальше по результатам эксперемента уже будет видно что делать - возможно придётся поменять на pascal. Добавлено через 13 минут
1
|
||||||||
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
| 24.11.2009, 18:01 [ТС] | ||||||
|
Mawrat, в случае stdcall кобол прога вообще не получает посланные данные в CAMPO_2:
http://img682.imageshack.us/im... tdcall.png В случае pascal кобол прога их получает, но в обратном порядке как ты говорил, то есть данные переданные в CAMPO_1 в CAMPO-2, a переданные в CAMPO_2 в CAMPO-1: http://img204.imageshack.us/img204/2196/pascal.png Добавлено через 42 минуты Кажется нашёл, в Коболе тоже можно указать Call-Convention, только по каким принципам из битов 6, 3 и 1 они получили 74 для WinAPI я не врубаюсь...
Нашёл интересную ссылку по той же теме но для Delphi
0
|
||||||
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
| 24.11.2009, 20:18 [ТС] | ||||||
|
Так получается но передаётся только 14 символов, 15-ый нет...
0
|
||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 25.11.2009, 09:16 | |
|
Если указывается stdcall, то параметры передаются в стек справа налево - т. е., согласно описанию функции, начиная с последнего справа параметра, затем - второй справа и т. д. - до самого первого слева. Когда процедура заканчивает выполнение, она сама должна очистить стек.
Соглашение cdecl - параметры передаются в том же порядке как и при stdcall, но стек должна очищать вызывающая программа. Pascal соглашение - там передача параметров в стек осуществляется слева направо - в порядке их перечисления в описании функции. Очистка стека выполняется самой функцией. Ещё есть fastcall - но там часть параметров передаются через регистры ЦПУ. --- Т. е. нас устроит любое из правил, кроме fastcall. Конечно желательно было бы настроиться на stdcall - т. к. это стандарт для среды Windows.--- Чтобы COBOL программу настроить на stdcall, как я понял в какой-то предназначенной для этого переменной следует записать побитно данные: Бит №0: значение = 0 - устанавливает порядок передачи параметров в стек в направлении справа налево. Бит №1: значение = 1 - стек очищает вызванная функция. Только куда это прописывать в COBOL программе - не знаю, к сожалению. Вот что-то такое из COBOL-доки: PROCEDURE DIVISION stdcall USING parameter-1, parameter-2 Как бы прикрутить нечто подобное в COBOL-программу?
1
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 25.11.2009, 16:54 [ТС] | |
|
Кажется эта опция действует только в OO COBOL (Object Oriented)...
Да в принципе разницы нет, пусть будет pascal, главное что бы данные переходили из одной проги в другую правильно, а как это происходит, разницы нет! ![]() Единственное что осталось это передать Edit1.Text в TArrayChar15... Почему последний инициал из String в for не переходит в TArrayChar15 пока не понял... Экспериментирую...
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|||||||||||
| 25.11.2009, 20:42 | |||||||||||
|
Компилятор Delphi автоматически может преобразовывать данные символьных массивов в строки. Но наоброт - строки преобразовывать в символьные массивы он не может. Поэтому код:
ArrChar := Edit1.Text; Не скомпилируется. Чтобы перенести данные из строки в символьный массив можно действовать так как ты выше написал. Только с учётом того, что в нашем массиве элементы индексируются с нуля, а в строках - с единицы:
Оба кода примерно одинаковы по скорости копирования. --- В конце кода: ShowMessage(ArrChar); Здесь компилятор автоматически преобразует символьный массив ArrChar в строку и передаёт полученную строку функции ShowMessage(). Обратное преобразование - из строки в массив - автоматически его Delphi выполнить не может и следует писать код, который приведён выше.
1
|
|||||||||||
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
| 25.11.2009, 21:21 [ТС] | ||||||
|
А я только что получил то что надо было сам, и спешу показать! В Delphi я знаю пока мало, но в конце концов вышло. Кстати, я убрал и проблему где если из 15 символов в Edit1.Text заполнено не 15, то остальные заполнялись Бог знает чем, теперь всё как надо, все незаполненные передаются как пробелы (Spaces)!
Всем большое спасибо за ответы, особенный респект тебе, Mawrat, век не забуду! Если будут проблемы - ещё тебя побеспокою (раз уж предложил)... Ну и конечно, если чем могу - тоже с радостью. Речь идёт не только о кобол программах, я ещё кое в чём разбираюсь
0
|
||||||
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
||||||||||||||||||
| 25.11.2009, 21:38 | ||||||||||||||||||
![]() Если не менять индексацию, то в предыдущем своём посте я писал:
:
И заполнять нулевым кодом - Char(0) - предпочтительнее. Пробел - это всё-таки значащий строковый символ.
1
|
||||||||||||||||||
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 25.11.2009, 22:25 [ТС] | |
|
Спасибо большое за ещё одно детальное обяснение всему! Думаю по-немногу буду "тюнинговать" всю эту затею и всё это мне более чем пригодится!
А что касается пробелов - в COBOL-е чаще используют именно их, по-этому в данном случае это даже хорошо.
1
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 02.12.2009, 00:51 [ТС] | |
|
Mawrat, во имя демонстрации результатов нашего пота, выкладываю созданное, оказывается я забыл залить ещё один DLL, потомy прога у тебя и не открывалась!...
И так в пакете:
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 02.12.2009, 09:34 | |
|
Kukstyler, к сожалению, CRC ерор в архиве.
![]() Добавлено через 2 минуты Kukstyler, скачал. Просьба к модераторам - это моё сообщение удалите, пожалуйста.
0
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 02.12.2009, 16:38 [ТС] | |
|
Значит работает, да?
0
|
|
|
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
|
|
| 02.12.2009, 18:25 | |
|
Да - всё нормально распаковалось. И работает.
1
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
|
| 02.12.2009, 22:43 [ТС] | |
|
Блииииин!
COB.DLL не тот был, вот хорошый!
1
|
|
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
| 25.01.2010, 23:04 [ТС] | ||||||
|
Mawrat, привет. Похоже тут что-то не так или я чё-то не так делаю, весь день бьюсь но никак не пойму в чём дело... Решил применить найденный нами метод в реале, с реальной прогой, сделал вроде всё как в прошлый раз, но при вызове кобол проги передаётся только содержимое первого поля, а потом полная белиберда....
Скомпилированный вариант в аттачах, тут же и код... Глянь если можешь когда будет время ![]()
0
|
||||||
|
1260 / 870 / 268
Регистрация: 02.04.2009
Сообщений: 3,307
|
||||||
| 28.01.2010, 18:29 [ТС] | ||||||
|
Кажется у меня появилась идея которая работает. Если передавать не структуру а одну переменную Н-ного размера то всё передаётся хорошо, и естественно не в обратном порядке структуры.
То есть я связал всё в одну переменную X238 = array[1..238] of Char; и при помощи нескольких for записал данные в нужном порядке, похоже пашет!!! Надо ещё хорошо посмотреть, но кажется работает!
0
|
||||||
| 28.01.2010, 18:29 | |
|
Передача дополнительного аргумента в функцию stdcall/cdecl?
Передача структуры в dll валит ЕХЕ файл. Передача данных в dll Формирование и передача структуры данных! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|