Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Вопросы API-программирования
Начать новую тему   Ответить на тему   вывод темы на печать

Вопросы API-программирования

Автор
Сообщение
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.21 20:03.36
Ответить с цитатой
Сегодня совершенно случайно я услышал, как один студент спрашивал об API-программировании. Я очень рад, что в студентах еще живет любопытство. Значит есть еще потенциальные программисты.
Этой темой я открываю faq по API-программированию в Windows. С удовольствием постараюсь ответить на все возникающие вопросы по программированию в Win32.
Я надеюсь, что и другие знатоки этого дела присоединяться ко мне.
Посмотреть профиль Отправить личное сообщение
Sels
Тот самый Sels


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 10687


Статус: Offline
СообщениеДобавлено: 2005.03.21 22:24.26
Ответить с цитатой
1. вопрос - что такое API и зачем он нужен? (думаю, этим вопросом конференция и должна начаться, чтобы сразу все поняли - о чем идет речь). Прошу ответить специалиста, чтобы красиво материал был выдан.
Посмотреть профиль Отправить личное сообщение
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.21 23:24.47
Ответить с цитатой
API - Aplication Programming Interface, т.е. интерфейс прикладного программирования. Эти функции прдоставляет программисту операционная система. Всего в Windows насчитывается около 4000 таких функций. Они посвящены всему: от графики до управления процессами и памятью. Программируя с помощью API, вы общаетесь с операционной системой напрямую, без посредников. Обойдемся без посредников, как говорится.
Когда вы программируете, например, на Дельфи или Visual Basic, вы программируете посредством библиотек- посредников. Это всегда беднее, но быстрее и с меньшими затратами ума. Кроме того, сегодня один посредник, а завтра другой - это преходяще, а операционная система вещь более фундаментальная.
Посмотреть профиль Отправить личное сообщение
Sels
Тот самый Sels


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 10687


Статус: Offline
СообщениеДобавлено: 2005.03.21 23:58.03
Ответить с цитатой
Я так и знал... Wink

А вот вопрос более по теме - доступ к функциям можно получить из любого языка?
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2005.03.22 08:10.20
Ответить с цитатой
Мне кажется из Visual Basic можно обращаться к API напрямую, что сразу же увеличивает его мощность и быстродействие (точнее быстродействие получающихся программ). Я прав?
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
Sels
Тот самый Sels


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 10687


Статус: Offline
СообщениеДобавлено: 2005.03.22 11:39.50
Ответить с цитатой
А Visual C++ уже не может что ли?
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 11:44.13
Ответить с цитатой
да хоть из PHP вызывайте.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 17:13.21
Ответить с цитатой
Доступ к API есть, если это предусмотрели разработчики транслятора. А вот какой он – это вопрос отдельный. Легче всего взаимодействовать с API на MASM (макро ассемблере) и VC++ (win32). Об ассемблере разговор особый, может быть мы отдельную тему сделаем. Что касается Си, то этот язык как нельзя лучше подходит к Win32 API. Почему?

1. Прежде всего, потому, что сам API разрабатывался как раз исходя из синтаксиса этого языка.
2. В проекте win32 VC++ нет других возможностей что-либо сделать, как обратиться к API. Таким образом, сами делаем и сами за все отвечаем.

Теперь, что касается других языков. Здесь могут быть следующие проблемы:
1. Типы переменных существующих в языке не совсем подходят к данным API. Про VB ничего не могу сказать, что же касается, например, VFP, то там вообще нет структур. Поэтому будьте любезны, сами создавайте массив и обращайтесь к соответствующим полям. Это немного напрягает. Впрочем, кто знает VFP согласиться, что потребность обращаться к API там возникает не часто.
2. Если Вы работаете с таким языком, как Delphi, VFP, VB, то следует иметь в виду, что ваша программа использует библиотеки, которые, конечно сами используют API. Поэтому вклиниваться в эти действия, обходя библиотеки не всегда корректно. Например, вы создали форму с помощью средств библиотеки, а пытаетесь закрыть ее функцией API.
3. Наконец часть API бесполезны, если Вы пользуетесь такими языками. Например, не ясно, где запрятан цикл ожидания сообщений у Delphi? Таким образом, GetMessage или TranslateMessage вам вряд ли понадобятся.

Остаются ну тысячи две функций, которые можно использовать.
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2005.03.22 17:22.17
Ответить с цитатой
<ОФФ> А для чего вообще нужно -

ПРОГРАММИРОВАНИЕ ?


</ОФФ>
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 17:43.51
Ответить с цитатой
vladislav писал(а):
Например, не ясно, где запрятан цикл ожидания сообщений у Delphi? Таким образом, GetMessage или TranslateMessage вам вряд ли понадобятся.
два случая - сами всё создаём через винапи, без VCL, тогда всё это есть. второй случай - через VCL, тогда доступ к винапи сохраняется, но становится нужен в редких случаях. закрыть окно? легко, послыаем сообщение с помощью винапи и окно корректно закрывается.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 18:45.57
Ответить с цитатой
VCL, как я понимаю - Visual Clases Library. Я не имею в виду Visual C++ в MFS (microsoft foundation clases) варианте. Здесь конечно можно использовать библиотеку и API в перемежку. Но возьмите, например, Delphi. Одновременно с созданием формы там создается объект, а следовательно выделяется память. А вы затем форму то и удалите, а объект, останется в паяти. Я к примеру о Дельфи, это и для других языков будет спрведливо.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 18:48.00
Ответить с цитатой
мда? а вы Дельфи в глаза видели? Rolling Eyes

Ок, каким образом уничтожить окно? в винапи
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 19:05.15
Ответить с цитатой
Пардон. Так это я вас хочу спросить об этом. И пример привел умозрительный, относящийся и к Дельфи и к VB и к C Buider и т.д. Что касается уничтожение формы, то пожалуйста. Уничтожить ее можно либо с помощью DestroyWindow, либо с помощью EndDialog. Но для этого необходимо знать дескриптор окна. Ну уж вам, как знатоку Дельфи наверное известно, как дескриптор формы определяется.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 19:14.08
Ответить с цитатой
я не знаток Дельфи. так, мимо проходил пару раз. Дескриптор окна содержится в TForm.Handle: property Handle: HWND;

The following code uses the Windows API function ShowWindow to display Form2 as an icon, but does not activate it.

ShowWindow(Form2.Handle, SW_SHOWMINNOACTIVE);
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 19:40.02
Ответить с цитатой
Ну, вот, можем, когда захотим.
И еще раз повторю. Уничтожать форму Дельфи или VB с помощью API опасно, так как объект остается в памяти
Посмотреть профиль Отправить личное сообщение
Leon
Бот-тролль 85 лв


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 61661


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:18.28
Ответить с цитатой
А почему он остается в памяти? С чегоВы это взяли.
_________________
Скажи мне чей Крым, и я скажу кто ты.
Посмотреть профиль Отправить личное сообщение
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:24.13
Ответить с цитатой
С чего я взял? Мы удаляем окно, а объект не удаляем - вот и все. Есть правда надежда, что в функции окна это обрабатывается, и объект все равно удаляется. Но я сомневаюсь. Впрочем проведите эксперимент и все. Удалите окно (c помощью DestroyWindow) и попытайтесь прочесть какое-нибудь свойство объекта - форма. Сделайте и нам расскажите.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:29.02
Ответить с цитатой
ладно, отвечать не буду, а задам наводящий вопрос: что делает функция DestroyWindow?
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:35.37
Ответить с цитатой
Дорогой товарищ, по-моему на любом поле мы не понимаем друг друга. Я чувствую, что вами владеет какое-то глубокое заблуждение, но вот какое - не знаю. Ну, хорошо, DestroyWindow удаляет не модальное окно. Вместе с ним она удаляет дочерние и собственные окна, а также таймеры, очередь команд и кое-что еще.
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:41.52
Ответить с цитатой
Хорошо. Вопрос уточняющий: КАК она это делает?
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:46.21
Ответить с цитатой
Вы хотите, чтобы я привел код этой функции? Не могу, во всяком случае сейчас. А раз так, начну сам задавать наводящие вопросы. Вы, как я понял, возражаете против того, что при удалении окна может не удаляться объект Дельфи, VB или C Bulder? Если вы возражаете, то каковы ваши аргументы?
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 20:50.52
Ответить с цитатой
странно, что вы этого не знаете. но вся виндофс построена на сообщениях. соответсвенно DestroyWindow послыает окну с дескриптором HWND сообщение wm_destroy. Соответсвенно имеется в классе TForm обработчик OnDestroy, который мы можем переопределить и запретить уничтожение формы AKA окно. Или разрешить. На что окно уничтожается. Стандартно.

PS: я считаю, что Вам, vladislav, НЕЛЬЗЯ приводить примеры про VB, Delphi и иже с ними. Ибо Вы не просто не в курсе вещей, Вы вводите в заблуждение неокрепшие умы.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 21:40.05
Ответить с цитатой
1. Если вы бы внимательно читали мои сообщения, то увидели бы, что я об этом уже сказал. Я сказал, что уничтожение окна может перехватываться. Разумеется, что я имел в виду сообщение wm_destroy. Но пойдем далее.
2. Вы опять торопитесь возразить и не слушаете, что я несколько раз оговорился насчет того, что возможно это перехватывается. Ну это спешка.
3. Дальнейшие ваши рассуждения меня удивляют еще больше.
По вашему обратывать событие в Delphi это тоже самое, что перехватывать сообщение.
4. Механизм закрытия окна вам, к сожалению незнаком. Перехватить сообщение WM_DESTROY с последующим отказом от закрытия окна вам не удастся. Раз уж зашел разговор об этих вещах я вам механизмы раскажу, не жалко. И так, есть два сообщения WM_CLOSE и WM_DESTROY. Когда вы щелкаете по крестику в углу, то в начале приходит сообщение WM_CLOSE, а затем WM_DESTROY. Если вы перехватите WM_CLOSE, то можете остановить удаление окна. А вот после того, как прийдет сообщение WM_DESTROY ничего уже не поделать - окна уже не будет. А вот функция DestroyWindow не посылает WM_CLOSE. Она удаляет окно, а потом посылает сообщение WM_DESTROY.
Дорогой товарищ, не путайте методы Дельфи и функции API. Как я понял вас вводят в заблуждение названия.
Кроме этого, вы похоже убеждены, что щелкнуть по крестику в углу и выполнить DestroyWindow это одно и тоже. Уж вы мне верьте - не одно и тоже.
Посмотреть профиль Отправить личное сообщение
mоishe
Гость







Статус: Offline
СообщениеДобавлено: 2005.03.22 22:07.58
Ответить с цитатой
IMHO, спор ни о чем.
Справка WinAPI писал(а):
The DestroyWindow function destroys the specified window. The function sends WM_DESTROY and WM_NCDESTROY messages to the window to deactivate it and remove the keyboard focus from it. The function also destroys the window's menu, flushes the thread message queue, destroys timers, removes clipboard ownership, and breaks the clipboard viewer chain (if the window is at the top of the viewer chain).

If the specified window is a parent or owner window, DestroyWindow automatically destroys the associated child or owned windows when it destroys the parent or owner window. The function first destroys child or owned windows, and then it destroys the parent or owner window.
DestroyWindow also destroys modeless dialog boxes created by the CreateDialog function.

BOOL DestroyWindow(
HWND hWnd // handle to window to destroy
);


Parameters

hWnd

Identifies the window to be destroyed.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

A thread cannot use DestroyWindow to destroy a window created by a different thread.
If the window being destroyed is a child window that does not have the WS_EX_NOPARENTNOTIFY style, a WM_PARENTNOTIFY message is sent to the parent.

Перевести надо?
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 22:10.00
Ответить с цитатой
Господи, я все это товарищу по-русски только что сказал.
Посмотреть профиль Отправить личное сообщение
mоishe
Гость







Статус: Offline
СообщениеДобавлено: 2005.03.22 22:19.53
Ответить с цитатой
vladislav писал(а):
Перехватить сообщение WM_DESTROY с последующим отказом от закрытия окна вам не удастся.
Почему не удастся?
andy ice писал(а):
Соответсвенно имеется в классе TForm обработчик OnDestroy, который мы можем переопределить и запретить уничтожение формы
Что, нет обработчика OnDestroy?
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.22 22:30.17
Ответить с цитатой
Еще раз.
1. Когда на функцию окна приходит сообщение WM_DESTROY, то окна уже нет. И ничего сделать нельзя.
2. Если с помощью OnDestroy можно запретить закрытие окна, как вы говорите, то это означает только одно: данный метод перехватывает не WM_DESTROY, а WM_CLOSE. Вот и все. Не попадайтесь на удочку названий.
3. Функция DestroyWindow не посылает сообщения WM_CLOSE, а только WM_DESTROY. Таким образом остановить закрытие окна при вызове функции нельзя. Есть правда hook'и, но это вещь глобальная и работает в рамках всей системы и в рамках одного приложения использовать их никто не будет.
4. Я то следующее утверждал: что если перехватить WM_DESTROY то можно в принципе и сам объект удалить. Если в Дельфи именно этот механизм работает, то и хорошо. Но мы не знаем, следовательно лучше не рисковать и функцию DestroyWindow не использовать в приложениях Дельфи, VB и т.п.
Посмотреть профиль Отправить личное сообщение
mоishe
Гость







Статус: Offline
СообщениеДобавлено: 2005.03.22 23:21.58
Ответить с цитатой
Перехватываем WM_DESTROY
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd,UINT mes,WPARAM wp,LPARAM lp) {
switch(mes) {
case WM_QUIT: return(0);
case WM_CLOSE:
   MessageBox(NULL,"Пришло WM_CLOSE, закрываемся.","Перехват",MB_OK|MB_SETFOREGROUND|MB_ICONASTERISK);
   PostQuitMessage(0);
   break;
case WM_NCDESTROY:
case WM_DESTROY:
   MessageBox(NULL,"Вот он где, ваш WM_DESTROY!","Перехват",MB_OK|MB_SETFOREGROUND|MB_ICONEXCLAMATION);
   SetActiveWindow(hwnd);
   return(1);
case WM_COMMAND: switch(LOWORD(wp)) {
   case 101:
      PostMessage(hwnd,WM_DESTROY,0,0);
      break;
   case 102:
      PostMessage(hwnd,WM_CLOSE,0,0);
   }
} 
return(DefWindowProc(hwnd,mes,wp,lp));
}//============================================================================

int WINAPI WinMain(HINSTANCE hi,HINSTANCE hpi,LPSTR cmd,int ncmd) {
int res=1;
MSG msg;
WNDCLASSEX w;
LOGBRUSH brush;
HWND mainwin;
int i;
LPSTR CLASS_NAME="TMP_CLASS";
LPSTR BUTTONCLASS="BUTTON";

brush.lbStyle=BS_SOLID;
brush.lbColor=RGB(0xC0,0xC0,0xC0);
memset(&w,0,sizeof(WNDCLASSEX));
w.cbSize=sizeof(WNDCLASSEX);
w.style=CS_HREDRAW|CS_VREDRAW;
w.lpfnWndProc=WndProc;
w.hInstance=hi;
w.cbWndExtra=36;
w.hbrBackground=CreateBrushIndirect(&brush);
w.lpszClassName=CLASS_NAME;
RegisterClassEx(&w);

mainwin=CreateWindowEx(WS_EX_LEFT,CLASS_NAME,"Перехватываем WM_DESTROY",
WS_CAPTION|WS_POPUP,30,10,320,200,NULL,NULL,hi,NULL);

CreateWindow(BUTTONCLASS,"WM_DESTROY",
WS_CHILD|BS_CENTER|WS_TABSTOP|BS_PUSHBUTTON|WS_VISIBLE,
24,138,130,28,mainwin,(HMENU)101,hi,NULL);

CreateWindow(BUTTONCLASS,"WM_CLOSE",
WS_CHILD|BS_CENTER|WS_TABSTOP|BS_PUSHBUTTON|WS_VISIBLE,
164,138,130,28,mainwin,(HMENU)102,hi,NULL);

ShowWindow(mainwin,SW_SHOW);
while(res) {
   res=GetMessage(&msg,NULL,0,0);
   TranslateMessage(&msg);
   DispatchMessage(&msg);
}
return(0);
}
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2005.03.22 23:30.12
Ответить с цитатой
moishe рулит Wink
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
vladislav
Запомнил кнопки...



Зарегистрирован: 04.02.2005
Сообщения: 147


Статус: Offline
СообщениеДобавлено: 2005.03.23 08:25.32
Ответить с цитатой
Ну ты даешь! Сейчас мне некогда, а вечером все объясню.
Ну если кратко: ты что же думаешь, если сам себе послал сообщение WM_DESTROY, так и все что-ли. Во, правильно я начал эту тему. Безгамотность надо ликвидировать.
Посмотреть профиль Отправить личное сообщение
Страница 1 из 5
Начать новую тему   Ответить на тему   вывод темы на печать
На страницу 1, 2, 3, 4, 5  След.
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Вопросы API-программирования

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы