Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

WinMain   Найти похожие ветки 

 
BackGround   (2006-01-21 21:08) [0]

Решил научится использовать "чистый" WinApi. Перевел код с С++ (сгенерированный Visual C++ 6.0) на Delphi. Все компилируется, но при запуске ничего не происходит. Сам разбраться не смог.

program WindowSample;

uses
 Windows, Messages;

var
 ThisInstance : HINST;
 WindowMain : HWND;

function WindowMainProc(Handle : HWND; Msg : UINT; ParamW : WPARAM; ParamL : LPARAM) : LRESULT; stdcall;
begin
 Result := 0;
 case Msg of
   WM_DESTROY:
     begin
       PostQuitMessage(0);
     end;
   else DefWindowProc(Handle, Msg, ParamW, ParamL);
 end;
end;

function WinMain(Instance, PrevInstance : HINST; lpCmdLine : LPSTR; nCmdShow : Integer) : Integer; stdcall;
var
 Msg : TMSG;
 WndClass : TWNDCLASSEX;
begin
 ThisInstance := Instance;
 Result := 0;

 FillChar(WndClass, SizeOf(TWNDCLASSEX), 0);
 WndClass.cbSize        := SizeOf(TWNDCLASSEX);
 WndClass.style         := CS_HREDRAW or CS_VREDRAW;
 WndClass.lpfnWndProc   := @WindowMainProc;
 WndClass.cbClsExtra    := 0;
 WndClass.cbWndExtra    := 0;
 WndClass.hInstance     := ThisInstance;
 WndClass.hIcon         := 0;
 WndClass.hCursor       := LoadCursor(0, IDC_ARROW);
 WndClass.hbrBackground := COLOR_WINDOW + 1;
 WndClass.lpszMenuName  := nil;
 WndClass.lpszClassName := PAnsiChar("WindowMainClass");
 if RegisterClassEx(WndClass) = 0 then Exit;

 WindowMain := CreateWindow(PAnsiChar("WindowMainClass"),
                            PAnsiChar("Sample Win32Api Applicaion"),
                            WS_OVERLAPPEDWINDOW,
                            10, 10,
                            600, 400,
                            0, 0,
                            ThisInstance,
                            nil);
 if WindowMain = 0 then begin
   UnRegisterClass(PAnsiChar("WindowMainClass"), ThisInstance);
   Exit;
 end;

 ShowWindow(WindowMain, nCmdShow);
 UpdateWindow(WindowMain);

 while GetMessage(Msg, 0, 0, 0) do
 begin
   TranslateMessage(Msg);
   DisPatchMessage(Msg);
 end;

 Result := Msg.wParam;
end;

begin
 WinMain(hInstance, hPrevInst, CmdLine, CmdShow);
end.


 
begin...end ©   (2006-01-21 21:28) [1]

> BackGround   (21.01.06 21:08)

> var
> ThisInstance : HINST;

Это не нужно. Хэндл модуля уже находится в переменной hInstance модуля SysInit, подключающегося автоматически. Значение именно этой переменной следует помещать в поле WndClass.hInstance и передавать в CreateWindow.

> function WinMain(Instance, PrevInstance : HINST; lpCmdLine
> : LPSTR; nCmdShow : Integer) : Integer;

Уберите все параметры.

> else DefWindowProc(Handle, Msg, ParamW, ParamL);

else Result := DefWindowProc(Handle, Msg, ParamW, ParamL);


 
BackGround   (2006-01-21 21:34) [2]


> > function WinMain(Instance, PrevInstance : HINST; lpCmdLine
>
> > : LPSTR; nCmdShow : Integer) : Integer;
>
> Уберите все параметры.


То есть надо писать просто function WinMain: Integer???


 
begin...end ©   (2006-01-21 21:46) [3]

> BackGround   (21.01.06 21:34) [2]

Да.


 
BackGround   (2006-01-21 21:55) [4]

Хендл модуля и DefWindowProc поправил, все ОК.
А вот если убираю параметры из WinMain, то ошибка...


 
begin...end ©   (2006-01-21 22:11) [5]

> BackGround   (21.01.06 21:55) [4]

> А вот если убираю параметры из WinMain, то ошибка...

Какая?


 
begin...end ©   (2006-01-21 22:53) [6]

А, понял :) Наверное, nCmdShow -- undeclared identifier :) Его нужно заменить на CmdShow.

Просто я не понимаю, зачем объявлять функцию с параметрами, и передавать в качестве них глобальные переменные :) Все четыре переменные, которые в C++ передаются как параметры в WinMain, в Delphi являются глобальными и автоматически инициализируются в модулях SysInit и System. Так что hInstance, hPrevInst (этот, правда, особого смысла не несёт), CmdLine и CmdShow можно использовать в любом месте программы.


 
Sergey Masloff   (2006-01-21 23:45) [7]

В дельфи вообще не нужна WinMain. Это чисто сишная вещь для вызова crt библиотекой. В дельфи полным аналогом является помещение кода между

begin
{Вот тут находится то что в це нужно писать в WinMain()}
end.


 
BackGround   (2006-01-22 16:35) [8]

А как изменить цикл

while GetMessage(Msg, 0, 0, 0) do
begin
  TranslateMessage(Msg);
  DisPatchMessage(Msg);
end;


что бы он не грузил процессор на 100%. Пробовал через sleep, но хочу узнать другие альтернативы.


 
GuAV ©   (2006-01-22 17:02) [9]


> А как изменить цикл


Никак его менять не надо.
Дело в том, что для "разгрузки процессора", т.е. передачи управления другим потокам и возврата управления после выполнения определённого условия подходят, кроме Sleep, функции ожидания сообщений  и/или объектов синхронизации, такие как WaitMessage, GetMessage, WaitForSingleObject, MsgWaitForMultipleObjects и другие.
Функция GetMessage передаёт упрвление другим потокам и Ваш поток не получит его, пока не будет получено какое-либо сообщение.
Цикл требовалось бы изменить исли бы для выборки сообщений использовалась бы PeekMessage.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.044 c
5-1124352966
Stanislav
2005-08-18 12:16
2006.02.12
В Наследнике TScrollBox периписать процедуру скроллинга


2-1138324492
Лом
2006-01-27 04:14
2006.02.12
что за глюк !


3-1134726170
Dmitriy G.
2005-12-16 12:42
2006.02.12
Получение имение поля из запроса


2-1137912297
LaCross
2006-01-22 09:44
2006.02.12
Шифрование данных


1-1136843189
dmk
2006-01-10 00:46
2006.02.12
Функция из DLL не вызывается





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский