Помощь новичкам

{$apptype 'windows'}
{$reference 'Microsoft.DirectX.dll'}
{$reference 'Microsoft.DirectX.Direct3D.dll'}
{$reference 'Microsoft.DirectX.AudioVideoPlayback.dll'}

uses DirectX, DirectX.Direct3D, DirectX.AudioVideoPlayback;

begin
  
end.

test.pas(2) : Ошибка при чтении сборки 'C:\Windows\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll'

Что ему может не нравиться? Так при чём с каждой из этих библиотек… Они вроде на компьютере установлены но находятся ни в каком ни GAC а на прямую в assembly:

DirectX это managed-библиотека написанная под .NET 1.1 на MC++. Такие dll не поддерживаются компилятором, так как System.Reflection их не умеет читать.

А как его тогда подключать?

никак. это невозможно.

  • Доктор, когда я делаю вот так, мне больно…
  • Голубчик, а Вы “вот так” больше не делайте!

Нет ну подождите, директ это одна из передовых графических библиотек, её надо хоть как то поддерживать. Это ни в какие ворота не лезет. Возможно надо как для OpenGL написать модуль, загрузив в него через external все функции и написать от руки все типы?

Вообще мне бы только доступ к пикселям экрана и видео карте на прямую, друзья подсказали что DirectX как раз разбирается с версиями видео карты и даёт возможность делать остальное самому. Есть другой способ?

Расскажите пожалуйста как работает packed:

type
  r1 = packed record
  
  end;

begin end.

Так же компилятор предлагал поставить array вместо record.

Я не знаю, когда и что ответят разработчики, но по-моему это анахронизм, сохраненный исключительно для совместимости. Если бы я был разработчиком, то после анализа лексему packed просто бы удалял.

Для начала надо найти что оно делает и альтернативы а потом уже удалять.

Ничего особого оно не делало. Экономило память путем упаковки данных. Для работы - распаковывало их, т.е. тратило процессорное время на упаковку-распакову - это была плата за экономию памяти. Сейчас памяти много, поэтому проще не упаковывать, чтобы потом не распаковывать.

1 лайк

Хотел только добавить, что модификатор packed в Паскале до сих пор иногда имеет смысл использовать (напр. в Turbo Pascal / Delphi или FreePascal) при описании структурированных типов данных для типизированных файлов, чтобы обеспечить более высокую совместимость по чтению/записи для разных компиляторов и сред исполнения, т.к. все данные в них будут записаны плотно, без платформо-зависимых “дыр” (правда, остается еще проблема endianness и представления/кодировки строк). Но в PABC.NET этот метод работать не будет – здесь это просто заглушка.

https://www.freepascal.org/docs-html/ref/refse14.html#QQ2-39-63

http://www.delphibasics.ru/Packed.php (очень сокращенно, но по-русски)

Подскажите, какие есть способы выполнять какую то процедуру в потоке формы?

Ну, помнится мне, весь GraphABC пронизан блокировками для выполнения в потоке формы А в GraphWPF немного по-другому но то же для WPF приложений

Можно как то получить промежуточный код на C++ который генерирует паскаль во время компиляции?

Почитайте еще раз про CIL и байт-код, этот паскаль (как и любые другие языки на платформе .NET) нигде и никогда НЕ генерирует код на С++ или С#, а выдает сразу бинарный байт-код CIL, собираемый в “сборки” (.net assemblies) в виде exe или dll файлов.

Исходный файл (.pas) --> компилятор (pabcnetc.exe) --> байт-код CIL внутри PE-файла (exe/dll) --> JIT-компилятор виртуальной среды исполнения CLR (.Net/Mono) --> машинный код (x86/x86_64).

В принципе, можно дизассемблировать любую пользовательскую сборку (exe/dll), созданную на любом ЯП в среде .net, с помощью стандартной утилиты ILDasm.exe (устанавливается вместе с Visual Studio или .NET SDK) – на выходе получится простыня для IL-ассемблера, но в таком “сыром” виде это мало кому может быть полезно на практике. Зато совсем недавно в комментариях на github’е упоминалось про новую экспериментальную фичу отладчика для интерактивного отображения то ли бинарного, то ли даже мнемонического IL-кода прямо в среде PABC, но официально пока тишина…

Ну что тишина, окно дизассемблирования давно сделано.

Ах вот как… Это много чего объясняет… Но мне дисасемблинг в .exe в .pas не нужен, мне скорее всего скоро понадобится основная фича робокода. И она не работало правильно. Там ведь как то .dll превращали в исходники для C++ чтобы увидеть что не так. Так как это делается?

Опять 25, при чем здесь С++??? С# и C++ это совсем разные ЯП, между ними вообще ничего общего, кроме немного похожего синтаксиса!

Существует, конечно, в природе очень специфический гибрид под названием C++/CLI (первая, менее удачная попытка их скрещивания называлась Managed C++), но это просто набор костылей для облегчения переноса идеологически “устаревшего” классического с++ (то, что называется legacy) на рельсы .Net или же для более удобного склеивания в системе управляемого и неуправляемого кода (когда без этого нельзя обойтись). В частности, все низкоуровневые компоненты в MS .NET созданы именно таким образом. Для создания же новых приложений диалект C++/CLI не рекомендуется, и вообще, редко кем еще используется, кроме самого MS.

Что касается “реверса” любых .net сборок (exe/dll, c байт-кодом CIL) в “исходный” C#, то да, можно попробовать бесплатный декомпилятор от JetBrains (dotPeek) – он, кажется, пока такой первый и единственный в своем роде. Только не отключайте генерацию отладочной информации в Паскале.

Крик души… Моя жена учится в университете на химика. У них есть нечто напоминающее информатику. Основная задача которой научить графически решать какие-то уравнения. Т.е. легкая графика + легкая математика. Их учитель использует ABCPascal. Учитывая, что других начинают учить с TurboPascal, я думал ей повезло… Помог ей сделать одно задание, но когда препод посмотрел на этот код, сказал что У НЕГО он работать не будет… Пытаясь разобраться почему, я решил подсмотреть версию ABC которую он использует… И тут самое интересное. 2007 год!!! Карл!!! Ну как можно быть таким архаичным преподавателем?..

1 лайк

http://pascalabc.net/chto-novogo

листаем вниз. В самый низ… действительно, была такая!

Только у нас её уже нет. И где достать - не знаем :slight_smile: Может, посодействуете - для музея :smiling_imp:

1 лайк