Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.168] |
|
Сообщ.
#1
,
|
|
|
Подскажите, как в DPMI'шном тмт-паскале можно вызывать апи-функции из
кернела, юзера и т.д. Пробовал -- не вышло. Я бы говорит с удовольствием, но "runtime error" :) То, что прога работает в 32-разр. режиме - нет сомнений. Классно, и значит виндовские апи должны работать ! Но у меня не получилось. Как надо правильно ? :-/ Спасибо |
Сообщ.
#2
,
|
|
|
Выяснил, что для того, чтобы вызывать VxDCall'ы нужно
найти точку входа int 2Fh/ax=1684h Есть ли что-нибудь подобное для win32API ? ??? |
Сообщ.
#3
,
|
|
|
Не знаю почему, но в дистрибутиве TMT 3.90 убраны примеры работы
с DLL Хотя, в предыдущих версиях они были. (В версии 4.01 они, разумеется все есть, в том числе и Вин32 АПИ). Ну, вот например, кусочек примера из в.3.50: {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. |
Сообщ.
#4
,
|
|
|
Извиняюсь, я отстал от жизни
Директива "library" говорит наверное, что это DLL-ка, но компилятор говорит "expected begin". Как это работает? Cкажи ещё, пожалуйста, что здесь неправильно если делать так: (к примеру) 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. |
Сообщ.
#5
,
|
|
|
Погогдите, погоди! СТоп машина! :-[ В хотите сказать что я из ТМТ3.90(Халявное издание(дос)) могу испольщывать АПИ виндовс? И что я могу даже директ ИКС использывать? ;D Во круть то, а как ПЕ и не заголовок? Вот если так нафиг нужен это 4.1 платное издание!
|
Сообщ.
#6
,
|
|
|
Цитата cr0acker, 28.08.02, 21:50:55 Погогдите, погоди! СТоп машина! :-[ В хотите сказать что я из ТМТ3.90(Халявное издание(дос)) могу испольщывать АПИ виндовс? И что я могу даже директ ИКС использывать? ;D Во круть то, а как ПЕ и не заголовок? Вот если так нафиг нужен это 4.1 платное издание! Нет, это действительно ДОС компилятор. Ни о каких РЕ-заголовках, естественно, речи нет. Но дело в том, то программа, работабщая в DPMI 32-битном режиме, имеет FLAT-модель памяти, в CS - селектор и всё такое, т.е. всё как в родном маздае. Поэтому я УВЕРЕН, что win32 API можно как то использовать. Но никто, похоже, не знает как |
Сообщ.
#7
,
|
|
|
Прогрессивно!
:-) Значит, я в Солярисе тоже могу WinAPI использовать - раз код по селектору и flat :-) |
Сообщ.
#8
,
|
|
|
Смейтесь дальше.
Время покажет кто прав |
Сообщ.
#9
,
|
|
|
Цитата Ilyia, 28.08.02, 23:13:54 Смейтесь дальше. Время покажет кто прав Дык вот заголовок винде он и даёт винде указанания как там выставить всё када стёк скока стёка и тп и тд! |
Сообщ.
#10
,
|
|
|
Почитал немного ваши рассуждения и решил вмешаться, дабы внести некоторую ясность.
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 приложениях вообще невозможно. |
Сообщ.
#11
,
|
|
|
Да нет, я понял что мой пример в мессаге № 3
есть полный отстой, ибо в дос-exe формате никаких таблиц импорта нет и в помине и быть не может. И таким способом ничего не добъёшься. Но есть функция int 2f\ax=1684 которая позволяет использовать из дос-программы VxDCall'ы(!). Ну и я подумал, что для win32 api должно быть что-нибудь подобное. Вот и всё. |
Сообщ.
#12
,
|
|
|
А вы обратили внимание вот на этот код в примере:
{$ifndef __OS2__} {$ifndef __WIN32__} This program can be compiled for following targets only: - OS/2 console application - WIN32 console application {$endif} {$endif} |