Подключение модулей TPU Pascal 6 в проект Delphi

 
0
 
Delphi, Kylix and Pascal
ava
ZakharAV | 26.11.2016, 17:35
Ребяты, есть старая база данных  (в виде последовательности записей). Доступ - через Borland Turbo Access 4.0, который рожден где-то в начале 90-х.  
Частично есть исходники процедур общения с БД на Pascal,  но часть (именно сам Turbo Access 4.0 ) - в виде TPU модуля.
Гуглил сам  Turbo Access 4.0, но тырнет такого уже не помнит.  
Можно, конечно, в BP6 родить DLL.
А напрямую подключить этот TPU модуль в проект Delphi  можно? Пробовал, на арапа, переименовать TPU в DCU, но машка ругается и не компилит. Подскажите : можно ли напрямую и где почитать? 
Ответы (7)
ava
Peter | 27.11.2016, 12:03 #
Если вспомнить историю самого Delphi, то вывод о прямом использовании TPU отпадает сам собой. Сразу следует вспомнить, что TPU файлы «16-ти разрядного» компилятора, а значит, даже при наличии возможности использования его в Delphi, он мог использоваться только в 16-ти разрядном Delphi, а это Delphi 1. А если вспомнить все отличия Pascal 6 равно как и Pascal 7 в сравнении со всем «семейством» Delphi, то по любой логике такое использование изначально невозможно. Формат DCU файлов от версии к версии менялся. Да существуют некоторые конверторы DCU файлов из одних версия в другие (ограничусь такой формулировкой), но, во всяком случае, это не конверторы 16-ти разрядных DCU в 32-ти разрядные. Помниться подобные вопросы мелькали на ряде форумов. Там шла речь о переносе компонентов с одной версии Delphi в другую без использования исходного текста. Там же приводились и конверторы DCU файлов. Когда говорят о совместимости файлов «снизу-вверх», то это относится к PAS файлам, т.е. исходным файлам проекта. Жаль, а может и, наоборот, к DCU файлам это не относится. Думаю, к DCU следует относиться как к временному или промежуточному файлу проекта конкретной версии Delphi и не более. При таком положении TPU файлы становятся уже абсолютно недоступными.
Что касается DLL, то такой вариант так же кажется сомнительным. Некогда и сам пытался перенести компонент Delphi 1 (нечто вроде CaptionBevel – рамка с именем) без исходного текста в Delphi 4. Должно быть не слишком усердствовал в поиске использования 16-ти разрядной DLL в 32-ти разрядном Delphi 4. В результате оставил эксперименты и написал собственный аналог, но уже в Delphi 4.
По запросу «создание DLL в Turbo Pascal 6» ничего особенно обнадеживающего не нашел, да и тщательно не искал. Может следует автору вопроса поискать внимательней?
В ссылке https://pascal.proweb.kz/index.php?page=58 упоминается Borland Pascal и использование DLL. Более подробное чтение может и направит на решение проблемы.
В http://www.cyberforum.ru/pascalabc/thread44357.html есть ссылка на Borland Pascal - http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr11.shtml, однако соединиться не удалось.
В http://progopedia.ru/version/turbo-pascal-70/ описано, что только в этой версии появилась возможность написания DLL. Однако следует помнить, что это 16-ти разрядная версия и возможность написания приложений для Windows так же 16-ти разрядной операционной системы (1993 год как никак). Повторюсь, использование 16-ти разрядной DLL в 32-ти разрядном приложении вряд ли задача тривиальная. Однако, внимательно поискать не помешает.
Взглянув на короткий экскурс в программирование начала 90-х, подумал, что решение проблемы в «лоб» будет «муторным». По служебным необходимостям не работал с базами данных. Основная деятельность в сфере программирования у меня управление экспериментальных установок в физическом эксперименте. Может, следует поискать информацию о совместимости баз данных. Например, некогда для IBM 370 существовала система Natural (если не ошибаюсь), позднее появился аналог для Windows? И, опять-таки, если не ошибаюсь, разработчик предоставлял средства конвертирования старых баз данных в новые базы. А может быть существует способ экспорта необходимой (старой Turbo Access 4.0) базы данных в иной формат (например, нечто вроде текстового или кокой либо другой) средствами того же BP6 и дальнейшего преобразования полученного файла в (новую, используемую сейчас) базу данных. И тогда полностью после конвертирования отказаться от времен паскаля программных решений. Пожалуй, пока все. Удачи!

ava
ZakharAV | 28.11.2016, 15:56 (Отредактирован 28.11.2016 16:23) #
Понял, спасибо.
Конечно, DLL из-под BP. Давненько было, я тогда быстро перескочил с TP6 на BP. До сих пор в архиве ВР лежит.
И тогда еще вопрос : может быть, у кого-нибудь остался этот самый Borland Turbo Access 4.0? Поскребите по сусекам, камрады, осчастливьте. Вообще нашел Turbo Access 3 от какой-то старой версии ТР(то ли 2, то ли 3). Но с 4 версией не работает. Как предчувствия и предупреждали меня......
Про конвертацию - сама БД есть, в текстовом формате, но часть полей не заполнены и нет полной уверенности в порядке чередования и размерности полей. Потому могу читать целиком всю запись как Array[...] of Char и известные поля преобразовывать в нужный тип. Могу индексировать БД. Собственно, основная задача и есть в переносе данных из старой БД в новую, из DOS под WIN
Кстати, а если такой вариант : возможно ли дизасемблирование TPU? Есть исходники процедур обращения к БД, но, как уже говорил, там часть процедур из Turbo Access. Так вот: Pascal'евский текст вставить в проект Delphi и подцепить дизасемблированный кусок? Или опять размерность шины не даст?
ava
Peter | 29.11.2016, 10:04 #
Начну с конца. Разрядность шины в данном случае не причем. Выражаясь проще, используются 32-разрядные инструкции процессора. В 32 разрядной операционной системе адресация данных и переходов – все формируются иначе, чем в 16-разрядной версии. Ясно, что это объяснение чересчур простое. Стоит посмотреть в материалы по ассемблеру, где проводят сравнение или упоминание различий 16-ти и 32-х разрядных инструкций процессора.
Повторюсь, слегка иначе сказав, как TPU так и DCU версия от версии сред разработки меняли внутренние форматы. По той причине, что – это, скажем, файлы для «внутреннего» употребления в совместимости не было необходимости. По этой же причине, с довольно высокой вероятностью, найти дизассемблер для TPU невозможно. Были ли в те времена «умельцы», осуществившие подобный проект? Честно, сомневаюсь. Дизассемблировать, если есть исполняемый файл старого проекта, ничто не мешает. Однако, что это может дать без освоения ассемблера, как минимум? А что предстоит сделать после получения дизассемблированного текста? Достаточно вспомнить, что придется заново переписать, на ассемблере, инструкции ввода/вывода. Это так же относится к системным обращениям (обращение к процедурам операционной системы). А уж найти в немалом файле необходимые процедуры. Есть ли сейчас хакеры, которые вот так возьмутся за подобное? На этот вопрос не отвечу. Ясно, если кто-то сделал, то другой может разобраться. Но стоят ли подобные усилия затраченного времени? Разве что из «академического» интереса.
Снова, повторюсь, не занимался работами баз данных. Запрос «Borland Turbo Access 4.0» в «лоб» сети ничего определенного не дал. Скорее самым продуктивным был бы поиск, именно, структуры баз данных «Borland Turbo Access 4.0». Я имею в виду внутренне строение файла (файлов) баз данных. Возможно, где-то на сайтах разработчиков есть ссылки на совместимости версий. К тому не знаю в каком виде представлялись модули в «Borland Turbo Access 4.0», если его удастся найти. В идеале в виде pas-файлов, но подобное не было, в общем случае, принято в 90-х. А тогда путь к цели будет долгим. Набрал в GOOGLE «Borland Turbo Access 4.0 download free». Сразу возник вопрос, в каком виде этот Borland Turbo Access 4.0 распространялся. Может быть, он был частью базовых или расширенных версий от Borland? Посмотрел в BP7 этот «зверь» не входил. Прошелся (GOOGLEся) прямых упоминаний не увидел.
В завершении, не зная, что из себя представляет файл базы данных, зашел на один из сайтов по паскалю в раздел баз данных (http://pascal.sources.ru/database/), разумеется, прямого упоминания «Borland Turbo Access 4.0» там нет. В основном работа с DBF-файлами, просмотрщики и тому подобное. Однако, имеется собственный форум. Удачи.
ava
ZakharAV | 29.11.2016, 13:02 #
Понял, спасибо.
Файл БД - просто текстовый формат, последовательно "уложенные" на диск  данные типа Record. Никакого DBF нет. Вся проблема у меня - я не точно знаю последовательность и размерность полей Record. Знаю общую длину Record. В начале файла БД есть "приставка" в 6 байтов со служебными данными(число этих самых Record, число каких-то "преобразований" с БД и, кажется, признак целостности/повреждения БД). Так вот этот самый Turbo Access и обеспечивает чтение/контроль/запись данных с учетом того, что в "приставке".
Ну и попутно: разрядность шины данных/адреса как раз и определяет разрядность инструкций процессора. С точки зрения представления данных 32 разрядная должна спокойно читать 16. Но, сдается, там специально ставится "ограничитель" на такое общение.... А вот почему - тайна сия велика есть....
ava
Peter | 30.11.2016, 16:45 #
Начнем с конца и немного подробней.
Сразу, вспомнив, что речь идет о программировании, а не об аппаратных вопросах, повторюсь, речь не идет о разрядности шины. Пусть у нас с Вами работает 64-разрядный процессор, соответственно, установленный в поддерживающую его материнскую плату. При этом установлена 32-х разрядная версия Windows XP, не 64-х разрядная версия Windows XP, не 32-ти или 64-х разрядный Windows 7 и так далее. При этом процессор поддерживает и 64-х разрядные инструкции. Мы все равно имеем дало с 32-х разрядная инструкциями. Еще раз повторю, не о разрядности данных идет речь. Я, как и раньше, могу загрузить в регистр, например, AL (откинем некоторые нюансы, связанные с «выравниванием», так просто не объяснить, при всем желании) байт данных
mov AL,55h.
Для полного понимания, как всегда, следует обратиться к литературе. Отвлекусь, ранее я только наблюдал за перепиской на этом форуме и на нескольких других. Наблюдения так же приносили немало пользы. Свои проблемы, так получилось, привык решать сам. Пусть не всегда быстро, но верно. Помню, что «человек умеет только то, чему научился сам». Правда учиться нас не учили и не учат. И всему, опять-таки, приходится учиться самому. Итак, о разрядности (записываю это, так же «оживляю» казалось давние воспоминания – языки высокого уровня «притупляют» это. Стоит присмотреться к тексту и можно увидеть нечто «аппаратно зависимые типы». Так тип integer оказывается, насколько помню, аппаратно зависимым. В Delphi 1 это было 16-ти разрядное число, а Delphi 2 и далее до появления 64 разрядных компиляторов - 32-ти разрядное число). Итак для 16-ти разрядных инструкций:
source db 256 dup (?) ;некая строка данных

mov DS, offset source

Все работает нормально. Попытка скомпилировать это в том же Delphi 2÷7 оканчивается сообщением об ошибке. Сейчас не пытался повторить это чтобы, записать сообщение компилятора. Давно на этапе использования Delphi 2 применяя встроенный ассемблер долго «ловился» на этом перенося ассемблеровские процедуры Delphi 1 в следующую версию – всегда машинально забывал, что работаю не в версии 1, а в 2 и работаю не в Windows 3.11, а Windows 95. Но стоит немного, с точки зрения текста, изменить:

mov EDS, offset source

и все нормально. Но это, же относится и к системным обращения (обращениям к системным процедурам), которые содержаться в системных DLL. Стоит только раз увидеть простой фрагмент текста дизассемблера

0044338F E88B2Dffff call 0043612C

это обращение к подпрограмме по 32-х разрядному адресу. И тут я ловлю себя на том, что пытаюсь чрезвычайно кратко написать о том, что описывают не тонкие книги. Это, по сути, не верно. Знаю, примеры, по сути, ограничены. Можно пропустить или не понять нюансы. Но когда суть неизвестна, следует к ней обратиться. Будем профессионалами, будем учиться. Всегда учиться. Итак:
литературы по ассемблеру много. У меня на полке стоят несколько книг, многие есть в НЕТЕ.
Более близкая мене и моей «работы»
Рудаков П.И., К.Г. Финогенов Язык ассемблера: уроки программирования
есть
Пирогов В. Ассемблер для Windows
Голубь Н.Г. Искусство программирования на ассемблере
неслабо оценивается
Пирогов В. Ассемблер и дизассемблер.
Это, разумеется, не полный список, но что есть, то есть. Но вернемся к сути.
Стоит найти в НЕТЕ тему, связанную с сохранение и загрузкой данных типа record, сразу становится понятно. Вы что-то упустили в описании процедур сохранения и чтения данных из файла. Фраза «я не точно знаю последовательность и размерность полей Record» означает исключительно, извините, только незнание. Просто попытайтесь найти, например, «запись и чтение записей в файл Delphi»
Например
http://www.delphisources.ru/pages/faq/base...ds_to_file.html
хоть немного объяснений.
http://www.cyberforum.ru/delphi-beginners/thread80418.html
примеры, которые можно принять за основу для работы.
Я ограничился только этими ссылками.
Странным кажется, что зная структуру и, к тому же длину данных, возникает проблема считать данные из файла. В чем при таком состоянии задачи состоит проблема? Стоит провести простой эксперимент. Создайте простенькое приложение с данными представленными в виде записи. Запись может содержать любые данные. Пусть это будут, например, данные типов byte, word и string.
Сохраните эту запись в файл. А затем с учетом типов считайте (функция SizeOf вернет размер записи) из этого файла. Сейчас немного понимаю фразу о «пустых», не уверен в формулировке, полей в базе данных. Понимаю, хоть и не работал никогда с базами данных, что если мы храним в базе данные формата, например, byte, то в нем хранится значение, например нулевое, но ни как «пустое». И что значит пустое - при работе независимо от содержания (смысл на совести программиста) в памяти выделяется только один байт для этих данных. При этом нулевое значение данных типа word занимается в файле два байта (в каком порядке, первым пишется старший или младший байт, проводится запись, роли не играет). И при считывании этих данных независимо от их содержания, будут считаны для байта. Теперь ответ на простой вопрос «я не точно знаю последовательность и размерность полей Record». Последовательность – так в какой объявлена запись. Например (из моего собственного проекта управления экспериментальной установкой спекло-интерферометрии):
  TTaskList = record
     WorkStatus : byte;
     StartPause : TStartPause;
     KeysStatus : byte;
     FrameCount : byte;
     Out0Data : word;
     Out1Data : word;
     In0Data : word;
     In1Data : word;
     CheckSound : byte;
     SoundFrequency : word;
     SoundDuration : byte
  end;
в такой же последовательности проводится и сохранение, а «размерность» так данные (тип TStartPause = 0..1000;) итак имеют свои размеры. В данном примере считываю byte, word, два byte, четыре word, byte, word, byte. И, естественно, SizeOf(TTaskList) вернет, подсчитаем  5 раз по байту, 6 по слову, итого 17 байт (описание функции можно найти, например, тут http://www.delphibasics.ru/SizeOf.php. К стати там приведен пример и для данных типа запись).
Проблема, как я понимаю классическая, в правильно формулировке задачи. Не в обиду будет сказано, будем профессионалами, сформулировать задачу намного сложнее, чем ее решить, но, не сформулировав правильно задачу ее не решить. Завел как привычку с подачи сейчас забытого Питера Нортона (Piter Norton), был в эпоху DOS файловый менеджер Norton Commander все сомнительные или непонятные коды испытывать в отдельном приложении, в те времена это программе.
Для начала считать число «записей» а далее последовательно все записи, заполняя ими, например StringGrind. Уверяю, не сразу, а может быть и нет, все станет на свои места. Если же определение (формальное) записи неизвестно, то тут придется «попотеть».
Когда читаю «Так вот этот самый Turbo Access и обеспечивает чтение/контроль/запись данных с учетом того, что в "приставке"» то понимаю, что для функционирования … полученных из файла данных достаточно. А значит и для прочтения массива записей из файла так же вполне достаточно.
Сам сначала отработал в отдельном приложении процедуры сохранения и загрузки «заданий для управления экспериментальной установкой» TTaskList и только потом добавил их в качестве методов спецализированного компонента. И то, что я сохраняю записи в ini файле роли не играет. Уверяю, никакие усилия, о тестовых приложениях, не будут безрезультатными. Удачи.
ava
ZakharAV | 30.11.2016, 23:20 #
Спасибо, Peter, за пространный ответ.
Основная цель всего действа - переложить DOS"овский файл БД с утерянными процедурами доступа на современный формат. Вся проблема сводилась к тому, что я не знаю точно последовательность и размерность полей в Record. А читать-писать саму Record (как Array [...] of Char с известным размером массива) проблемы нет, только вот внутри Record  получается дыра с неизвестным содержанием.  Я об этом уже несколько раз говорил. Хотел с помощью Turbo Access прочесть все поля и затем переложить на современный вариант.  Нашел другой способ  - договорился с владельцем БД, он пустит меня на программу, пользующую эту БД, создать еще одну запись. Там я заполню все поля, а в самой БД потом просмотрю их последовательность и размерность.
Честно говоря, развлекаться с боданием этой БД ради искусства нет ни времени, ни желания. Нужен результат.
ava
bems | 07.12.2016, 11:25 #
это не то что ты ищешь?
http://pascal.sources.ru/database/dbpascal.zip
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  bems   Peter   ZakharAV
advanced
Отправить