Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2007, 14:06   #1
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
Вопрос Работа с DLL - программа, которая будет общаться с файлами данных, представленных в текстовом виде

Доброго времени суток!
Пытаюсь написать программку в Delphi7, которая будет активно общаться с файлами данных, представленных в текстовой форме.
Написал процедуру в DLL для прочтения первого блока файла. Если заполняю его строками массив внутри самой DLL, то все вроде как нормально, а вот при попытке передачи в основной модуль на 4 строке файла возникает ошибка : Access violation at address 400068B8 in module 'rtl70.bpl'. Read of address 000051F9.
Как такое возможно забороть? Передается массив array of string, модуль ShareMem включил и в программу и в код DLL.

Заранее благодарен!
SnakeMan вне форума Ответить с цитированием
Старый 25.10.2007, 14:27   #2
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Предъяви код, пожалуйста. (хотя бы самой передачи массива)
Maslan вне форума Ответить с цитированием
Старый 25.10.2007, 14:56   #3
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

Пожалуйста!
В архиве полностью начало проекта. В папке Source находится файл, из которого собственно будут читаться данные.
Вложения
Тип файла: rar Curvature.rar (33.7 Кб, 10 просмотров)
SnakeMan вне форума Ответить с цитированием
Старый 25.10.2007, 16:00   #4
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

В MainWindowOperate; :
Код:
Type 
TArray=Array of string;
PArray=^Tarray;
Код:
procedure LasCapBlock (FileName: ShortString; LasCaption:PArray; StQuan: Byte); external 'dll/TxOper.dll';
Код:
procedure TOpenSourceDialog.FileListView1Click(Sender: TObject);
....
  LasCapBlock (FileName, @LasCapt, StQuan);
...


В library TxOper; :
Код:
Type 
TArray=Array of string;
PArray=^Tarray;
Код:
Procedure LasCapBlock (FileName: ShortString;LasCaption:PArray; StQuan: Byte);
.....
Inc (StQuan);
  SetLength ( LasCaption^, StQuan); //<<< Тут же была идея, что ж не заметил-то? Даже кусок кода закомментирован :) 
 ReadLn (F, LasCaption^ [StQuan-1]);
...
//И дальше все LasCaption[] заменить на LasCaption^[]

Последний раз редактировалось Maslan; 25.10.2007 в 16:03.
Maslan вне форума Ответить с цитированием
Старый 25.10.2007, 21:17   #5
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

Спасиб!
Попытаю..
SnakeMan вне форума Ответить с цитированием
Старый 25.10.2007, 21:20   #6
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

Если не трудно, поясни еще что обозначают символы @ и ^ в именах..
И никак не могу понять, зачем нужно объявлять типы
Type
TArray=Array of string;
PArray=^Tarray;
Или стандартное объявление совсем не работает?
SnakeMan вне форума Ответить с цитированием
Старый 26.10.2007, 09:21   #7
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

C козявками ^ и @ разобрался.. Таки Help полезная штука )).
А Вот с Type че то не могу понять как работать..
Если в нем уже че то объявлено, в моем случае Class TMainForm, то как объявлять остальные, в том числе и TArray?
SnakeMan вне форума Ответить с цитированием
Старый 26.10.2007, 10:40   #8
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

И "козявки" и типы нужны для успешной передачи параметров, т.к. если объявить процедуру как Procedure LasCapBlock (FileName: ShortString;LasCaption:Array of integer; StQuan: Byte); дельфя будет ругаться при передаче процедуре переменной тоже типа Array of integer. А тип "указатель на массив" - как думаешь, что проще, передать в DLL и обратно массив неизвестной длины из элементов неизвестной длины или просто указатель на участок памяти, в котором вся эта гадость лежит? Вот то-то и оно

Цитата:
Если в нем уже че то объявлено, в моем случае Class TMainForm, то как объявлять остальные, в том числе и TArray?
Очень просто:
Вариант 1: вставляешь описание новых типов между ключевым словом type и следующей строкой - началом объявления TMainForm;
Вариант 2: ишешь end; после Class TMainForm
и после этого end; вставляешь.
Maslan вне форума Ответить с цитированием
Старый 26.10.2007, 14:57   #9
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

Вроде МаНяНа ))
SnakeMan вне форума Ответить с цитированием
Старый 29.10.2007, 08:23   #10
SnakeMan
Пользователь
 
Регистрация: 25.10.2007
Сообщений: 41
По умолчанию

Мдя.. Че то у меня работа на каждом шагу спотыкается. Теперь начал править функции работы с символами. Обозвал function DosToWin (Var Ch:PChar):PChar;
А вот как работать с этими переменными понять не могу. Если взлянете исходник, который ниже, то станет понятно, что из основного модуля в эту функцию должен передаваться один символ из string`а, а назад возвращаться в сдвинутом виде. Вроде все просто, но вот я где то не догоняю как это сделать.
Помогите пожалуйста!
SnakeMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа которая делает кроссворд Иллидан Софт 15 02.12.2014 06:34
Как создать обратную функцию, которая из уникального номера будет возвращать строку? SkAndrew Общие вопросы Delphi 8 06.04.2008 21:10
программа, которая выводит на экран одно из данных слов vados Паскаль, Turbo Pascal, PascalABC.NET 11 26.10.2007 23:47
Скажите функцию которая будет запускать приложение при каждой загрузке винды pentiumForever Общие вопросы Delphi 9 08.09.2007 01:54
Поиск данных в текстовом файле BizON Помощь студентам 1 06.06.2007 18:17