Как правильно искать модуль по имени функции?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Как правильно искать модуль по имени функции?

Сообщение mirk » 07.05.2014 14:29:04

Столкнулся с тем, что некоторые функции определены различно в windows и в jwa*, некоторые функции присутствуют только в jwa*.
С чем связано такое? Из какого модуля правильнее вызывать функцию?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Как правильно искать модуль по имени функции?

Сообщение Vadim » 07.05.2014 15:50:37

mirk писал(а):некоторые функции определены различно в windows и в jwa*

Например, какие?
Я, если чего-то нет в Windows, спокойно беру в jwa. Вообще-то кардинальных различий быть не должно, т.к., в конечном итоге, они обращаются к одним и тем же DLL-кам...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как правильно искать модуль по имени функции?

Сообщение mirk » 07.05.2014 16:29:57

Например, какие?

Берем для примера getVersionEx
windows:
function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL;external 'kernel32' name 'GetVersionExA';
jwanative:
function GetVersionEx(lpVersionInformation: LPOSVERSIONINFO): BOOL; stdcall;
Зачем вообще сделано такое разделение?

Добавлено спустя 4 минуты 49 секунд:
Вот еще пример: EnumServicesStatus
Там определены константы для удобства (например: SERVICE_STATE_ALL), но эти константы не определены в windows.

Идем дальше: QueryServiceConfig
Тоже отличия в определении вызывающие подобные ошибки при подключении не из того модуля (Error: Incompatible type for arg no. 4: Got "LongWord", expected "LPDWORD").

И так по многим функциям WinAPI.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

Re: Как правильно искать модуль по имени функции?

Сообщение Vadim » 07.05.2014 19:28:02

mirk
Это всё большая политика. :-)
Такой код компилируется без малейших проблем:
Код: Выделить всё
Uses Windows;
Var
  os1: TOSVERSIONINFO;
  os2: LPOSVERSIONINFO;
begin
  if Windows.GetVersionEx(os1) then
    writeln(os1.dwMajorVersion, ' ', os1.dwMinorVersion);

  os2:=GetMem(sizeof(TOSVERSIONINFO));
  if Windows.GetVersionEx(os2) then
    writeln(os2^.dwMajorVersion, ' ', os2^.dwMinorVersion);
end.

Так что модуль Windows Вам даёт возможность использовать оба варианта:
- типа Delphi;
- типа чистый WinAPI.
JWA* направлен более конкретно - симулировать WinAPI как он есть в натуре.
;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru