На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
В этом разделе можно создавать темы, которые относятся к поколению 32-битных компиляторов.
Здесь решаются вопросы портирования кода из старого доброго Турбо Паскаля в FPC, TMT, VP, GPC компиляторы, а также особенностей программирования на них для Windows/Linux и других ОС.
Указывайте тип компилятора, его версию, а также платформу (Windows/Linux/..) компиляции, другими словами, Target.
Модераторы: volvo877
  
> win32-апи
    Подскажите, как в DPMI'шном тмт-паскале можно вызывать апи-функции из
    кернела, юзера и т.д.
    Пробовал -- не вышло. Я бы говорит с удовольствием, но "runtime error"  :)

    То, что прога работает в 32-разр. режиме - нет сомнений.
    Классно, и значит виндовские апи должны работать !
    Но у меня не получилось. Как надо правильно ?  :-/
    Спасибо
      Выяснил, что для того, чтобы вызывать VxDCall'ы нужно
      найти точку входа int 2Fh/ax=1684h

      Есть ли что-нибудь подобное для win32API ?   ???
        Не знаю почему, но в дистрибутиве TMT 3.90 убраны примеры работы
        с DLL :(
        Хотя, в предыдущих версиях они были.
        (В версии 4.01 они, разумеется все есть, в том числе и Вин32 АПИ).

        Ну, вот например, кусочек примера из в.3.50:
        ExpandedWrap disabled
           
          {ARCS.PAS}
          (***********************************************)
          (*                                             *)
          (* Dynamic-link (DLL) Sample                   *)
          (* Copyright (c) 1998 by TMT Development Corp. *)
          (* Author: Vadim Bodrov, TMT Development Corp. *)
          (*                                             *)
          (* Targets:                                    *)
          (*   OS/2 DLL                                  *)
          (*   WIN32 DLL                                 *)
          (*                                             *)
          (***********************************************)
           
          // This implements a very simple DLL with two exported functions:
           
          library ARCs;
           
          // The export procedure directive prepares ArcCos
          // and ArcSin for exporting
           
          uses Math;
          {$ifdef __WIN32__}
          function ArcCos conv arg_stdcall (X: Extended): Extended;
          {$else}
          function ArcCos conv arg_os2 (X: Extended): Extended;
          {$endif}
          begin
            Result := RadToDeg(ArcTan2(Sqrt(1 - X * X), X));
          end;
           
          {$ifdef __WIN32__}
          function ArcSin conv arg_stdcall ( X: Extended): Extended;
          {$else}
          function ArcSin conv arg_os2 ( X: Extended): Extended;
          {$endif}
          begin
            Result := RadToDeg(ArcTan2(X, Sqrt(1 - X * X)));
          end;
           
          // The exports clause actually exports the two routines,
          // supplying an optional ordinal number for each of them
           
          exports
            ArcCos name 'ArcCos',        // export by name
            ArcSin index 1;              // export by index
           
          begin
            // Do nothing
          end.
           
          -----------
           
          {TESTDLL.PAS}
          (***********************************************)
          (*                                             *)
          (* Dynamic-link (DLL) Usage Sample             *)
          (* Copyright (c) 1998 by TMT Development Corp. *)
          (* Author: Vadim Bodrov, TMT Development Corp. *)
          (*                                             *)
          (* Targets:                                    *)
          (*   OS/2 console application                  *)
          (*   WIN32 console application                 *)
          (*                                             *)
          (***********************************************)
           
          {$ifndef __OS2__}
          {$ifndef __WIN32__}
            This program can be compiled for following targets only:
            -  OS/2 console application
            -  WIN32 console application
          {$endif}
          {$endif}
           
          program TestDLL;
           
          uses Strings;
           
          const
            ARCs = 'arcs.dll';
           
          // import by name
          {$ifdef __WIN32__}
          function ArcCos conv arg_stdcall (X: Extended): Extended;
            external ARCs name 'ArcCos';
          {$else}
          function ArcCos conv arg_os2 (X: Extended): Extended;
            external ARCs name 'ArcCos';
          {$endif}
           
          // import by index
          {$ifdef __WIN32__}
          function ArcSin conv arg_stdcall (X: Extended): Extended;
            external ARCs index 1;
          {$else}
          function ArcSin conv arg_os2 (X: Extended): Extended;
            external ARCs index 1;
          {$endif}
           
          var Arg: Extended;
           
          begin
            repeat
              Write('Argument ? ');
              Readln(Arg);
              if (Arg < -1) or (Arg > 1) then
                Writeln('Argument must be in range: [-1..1]');
            until (Arg >= -1) and (Arg <= 1);
            Writeln('ArcCos(', Fls(Arg), ') = ', Fls(ArcCos(Arg)));
            Writeln('ArcSin(', Fls(Arg), ') = ', Fls(ArcSin(Arg)));
          end.
        Сообщение отредактировано: romtek -
          Извиняюсь, я отстал от жизни :)
          Директива "library" говорит наверное, что это DLL-ка,
          но компилятор говорит "expected begin". Как это работает?

          Cкажи ещё, пожалуйста, что здесь неправильно если делать так: (к примеру)
          ExpandedWrap disabled
            program Test;
            const
              LibName = 'C:WINDOWSSYSTEMuser32.dll';
             
            function MessageBeep conv arg_stdcall (X:DWORD): DWORD;
                                 external LibName name 'MessageBeep';
             
            begin
                  //asm int 3 end;
                  MessageBeep (0);
            end.
          Сообщение отредактировано: romtek -
            Погогдите, погоди! СТоп машина! :-[ В хотите сказать что я из ТМТ3.90(Халявное издание(дос)) могу испольщывать АПИ виндовс? И что я могу даже директ ИКС использывать? ;D Во круть то, а как ПЕ и не заголовок? Вот если так нафиг нужен это 4.1 платное издание!
              Цитата cr0acker, 28.08.02, 21:50:55
              Погогдите, погоди! СТоп машина! :-[ В хотите сказать что я из ТМТ3.90(Халявное издание(дос)) могу испольщывать АПИ виндовс? И что я могу даже директ ИКС использывать? ;D Во круть то, а как ПЕ и не заголовок? Вот если так нафиг нужен это 4.1 платное издание!

              Нет, это действительно ДОС компилятор. Ни о каких РЕ-заголовках,
              естественно, речи нет.

              Но дело в том, то программа, работабщая в DPMI 32-битном режиме,
              имеет FLAT-модель памяти, в CS - селектор и всё такое, т.е. всё
              как в родном маздае.

              Поэтому я УВЕРЕН, что win32 API можно как то использовать.
              Но никто, похоже, не знает как :)
                Прогрессивно!
                :-)
                Значит, я в Солярисе тоже могу WinAPI использовать - раз код по селектору и flat :-)
                  Смейтесь дальше.
                  Время покажет кто прав
                    Цитата Ilyia, 28.08.02, 23:13:54
                    Смейтесь дальше.
                    Время покажет кто прав

                    Дык вот заголовок винде он и даёт винде указанания как там выставить всё када стёк скока стёка и тп и тд!
                      Почитал немного ваши рассуждения и решил вмешаться, дабы внести некоторую ясность.

                      1) Мне думается ;), что примеры с DLL были убраны из дистрибутива TMT 3.90 по причине того, что данная версия транслятора предназначена для создания исключительно MS-DOS приложений. Соответственно, ни о какой поддержке DLL в версии 3.90 не может быть и речи. Это, кстати, касается и всех предыдущих версий TMT Pascal Lite.

                      2) TMT Pascal Multi-target умеет работать с DLL (создавать/использовать) только для платформ Win32 и OS/2.

                      3) Все функции Win API содержаться в файлах DLL. Я имею в виду стандартные 32-битные DLL-файлы Windows (aka PE-файлы). Как известно, PE-файлы не могут исполняться в среде MS-DOS.

                      Таким образом, на основании того, что
                      a) PE-файлы не могут исполняться в среде MS-DOS;
                      б) TMT Pascal Lite не умеет работать с файлами DLL в принципе;
                      можно сделать вывод о том, что использование функций Win API в MS-DOS приложениях вообще невозможно.
                        Да нет, я понял что мой пример в мессаге № 3
                        есть полный отстой, ибо в дос-exe формате никаких таблиц импорта
                        нет и в помине и быть не может. И таким способом ничего не добъёшься.
                        Но есть функция int 2f\ax=1684 которая позволяет использовать из
                        дос-программы VxDCall'ы(!). Ну и я подумал, что для win32 api должно
                        быть что-нибудь подобное. Вот и всё.
                          А вы обратили внимание вот на этот код в примере:

                          ExpandedWrap disabled
                            {$ifndef __OS2__}
                            {$ifndef __WIN32__}
                              This program can be compiled for following targets only:
                              -  OS/2 console application
                              -  WIN32 console application
                            {$endif}
                            {$endif}
                          Сообщение отредактировано: romtek -
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0340 ]   [ 16 queries used ]   [ Generated: 19.04.24, 00:07 GMT ]