Форум: "Потрепаться";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизКаа-то странно реагирует минимальное Win32приложение на сообщения Найти похожие ветки
← →
Николай Быков (2002-12-30 20:38) [0]вот здесь исходниики http://freeprogrammer.narod.ru
Приложение вроде бы нормально реагирует на сообщения, реакцию на которые я написал, но вот на сообщения типа WM_SYSCOMMAND WM_CLOSE чего-то вообще никак не хочет.
Подскажит где ошибоска.
RTFM посылать не надо, я и так этот пример из книги Ch.Petzold"a "Windows Programming" взял
← →
Николай Быков (2002-12-30 20:52) [1]тфу ты елки палки забыл дописать
http://freeprogrammer.narod.ru/1.html
← →
Cobalt (2002-12-31 01:56) [2]Как проверяешь посылку сообщений?
Попробуй перехватывать соответствующие команды, выводить окошко, и передавать управление DefWindowProc
← →
Николай Быков (2002-12-31 08:32) [3]
> Cobalt © (31.12.02 01:56)
Я же тебе исходники вывесил. Там все написанно :-)
← →
Николай Быков (2002-12-31 08:33) [4]Да еще.
Почему-то там playsound не играется при создании :confused:
← →
Evgeny (2002-12-31 09:13) [5]Посмотреть какая программа взята за исходник не получилось. данная ссылка http://freeprogrammer.narod.ru не работает.
← →
Darts (2002-12-31 10:57) [6]1. Не указан хедер
2. Сообщения - WM_SYSCOMMAND, WM_CLOSE - их нет
3. Насчет PlaySound c:\windows\media\tada.wav - возможно, неверно указан путь к файлу.
← →
Cobalt (2002-12-31 13:30) [7]
> но вот на сообщения типа WM_SYSCOMMAND WM_CLOSE чего-то
> вообще никак не хочет.
Еще раз: как проверяешь реакцию?
Ты, не объясняй, ты рукой покажи... ;-)
> #include
Как он у тебя скомпилировался так? разве так можно оставлять директивы?
← →
Николай Быков (2002-12-31 16:25) [8]так там написанно #include <windows.h> (подумайте теперь почему вы не это видите)
> Darts (31.12.02 10:57)
Путь указан правильно
> Cobalt © (31.12.02 13:30)
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Показал пальцем? Там вообще-то это было написанно
← →
Cobalt (2002-12-31 18:20) [9]Взглянул бы сам на ссылку?
Опера 6.04, ИЕ 6.0, Мозилла 1.0 - ни в одном из этих браузеров не видно!
Дал бы простое расширение, тхт, например.
Насчет WM_Close - не закрывается окно, что ли? Так бы и сказал. Но опять же, как ТЫ посылаешь окну эти сообщения?
Совершенно непонятно, какие ошибки...
← →
Cobalt (2002-12-31 18:48) [10]Да, кстати, если я не ошибаюсь, то в С надо путь разделять двойным слэшем. (правильно?)
← →
Rouse_ (2002-12-31 18:59) [11]Да люди, что вы запариваетесь, вчера было все обьяснено по асе, почти этот же код был дан на Д как обьяснение, я предложил даже перевести на Д разбираемый код, но у автора с этим трудности. Т.е. или С++ или Дельфи (причем не VC++). Я отступил от обьяснений из-за, на данный момент, плохого уровня знаний автора.
Желаю успехов в новом году
← →
Diamond Cat (2002-12-31 19:52) [12]а не пробовал определить wndclass.lpszMenuName = NULL; ? это раз и два, если не определил то сам обрабатывай эти сообщения
← →
Николай Быков (2002-12-31 23:14) [13]
> Diamond Cat © (31.12.02 19:52)
А там же вроде бы как написанно
wndclass.lpszMenuName = NULL;
← →
Rouse_ (2002-12-31 23:38) [14]Ув. Николай, ты помнишь что я тебе вчера посоветовал? Там было решение твоей проблемы, пройдись по архиву нашей беседы и внимательно вчитайся в текст.
Желаю успехов в новом году
← →
Николай Быков (2003-01-01 01:20) [15]
> Rouse_ © (31.12.02 23:38)
Я говорю, что мне конкретно к этому примеру надо, а не перевод чего-то куда-то.
ЗЫ
И тебе удчи :-)
← →
Diamond Cat (2003-01-01 20:11) [16]
> Николай Быков
извини не корректно написал, я имел в виду что надо как раз не ноль
← →
Evgeny (2003-01-02 08:29) [17]Может тебя вот это устроит?
program Hello;
uses
Windows, Messages, MMSystem;
const
szAppName = "HelloWin";
var
Window : HWND;
Msg : TMSG;
WndClass : WNDCLASSEX;
//===============
function WndProc(Wnd : HWND; iMsg, wParam, lParam : Longint): Longint; stdcall;
var
DC : HDC;
ps : TPaintStruct;
aRect : TRect;
begin
case iMsg of
// будет играть только в случае нахождения файла
WM_CREATE:
begin
if not PlaySound("c:\windows\media\tada.wav", 0, SND_FILENAME or SND_ASYNC) then
begin
// обработаем ошибку
end;
end;
WM_SYSCOMMAND:
case wParam of
SC_CLOSE :
begin
SendMessage(Wnd, WM_KEYDOWN, VK_ESCAPE, 0);
if MessageBox(Wnd, "You certain that want to close program", "Warning", MB_OKCANCEL) = ID_OK then
SendMessage(Wnd, WM_CLOSE, 0, 0);
Result := 0;
Exit;
end;
end;
WM_PAINT:
begin
DC := BeginPaint(Wnd, ps);
GetClientRect(Wnd, aRect);
DrawText(DC, "Hello Windows 95", -1, aRect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
EndPaint(Wnd, ps);
end;
WM_COMMAND:
case LOWORD(wParam) of
100: SendMessage(Wnd, WM_CLOSE, 0, 0);
end;
WM_DESTROY: PostQuitMessage(0);
end;
Result := DefWindowProc(Wnd, iMsg, wParam, lParam);
end;
//==========
function WinMain : Integer;
begin
wndclass.cbSize := sizeof(WndClass);
wndclass.style := CS_HREDRAW or CS_VREDRAW;
wndclass.lpfnWndProc := @WndProc;
wndclass.cbClsExtra := 0;
wndclass.cbWndExtra := 0;
wndclass.hInstance := hInstance;
wndclass.hIcon := LoadIcon(0, IDI_APPLICATION);
wndclass.hCursor := LoadCursor(0, IDC_ARROW);
wndclass.hbrBackground := GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName := "";
wndclass.lpszClassName := szAppName;
wndclass.hIconSm := LoadIcon(0, IDI_APPLICATION);
RegisterClassEx(wndclass);
Window := CreateWindow(szAppName, "The Hello Programm",
WS_OVERLAPPEDWINDOW,
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT),
0,
0,
hInstance,
NIL);
CreateWindow("button", "Close",
ws_visible or ws_child,
50, 10, 75, 25,
Window,
100,
hInstance,
NIL);
ShowWindow(Window, CmdShow);
UpdateWindow(Window);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
Result := Msg.wParam;
end;
begin
WinMain;
end.
← →
Николай Быков (2003-01-02 08:44) [18]Ну что вы?
Объясняю полностью ситуацию.
Я читаю книгу по WinAPI от Ч.Петзольда.
В книге все примеры и т.д. и т.п. идет на Си.
Я решил, что может быть множество нестыковок, если я буду читать книгу с примерами на Си, а делать эти упражнения на, скажем, Делфи. Скачал себе специально по такому поводу Си-шный компилятор. Начал читать книгу и вот незадача: первый же пример в ней у меня кончено скомпилировался, но программа никак не реагирует на попытки моей мышки свернуть/развернуть/закрыть/изменить_размер окна.
Я привел тот самый исходник на Си (см. ссылку выше) и прошу сказать где там нужно что-то исправить, чтобы вышеупомянутые действия можно было совершть с моим окном, но прошу указать это не исходником на, скажем, Делфи, а исходником (и т.п.)на Си.
Буду блогадарен, если поймут :-)
← →
Evgeny (2003-01-02 09:19) [19]В том исходнике ошибок нет. А Паскаль нет так уж далеко по синтаксису от С, особенно если это программа на WinAPI. Если обратишь внимание - это именно пример с указанной тобой страницы.
Я скачал его и произвел изменения для работы в Паскале, так же добавил два сообщения: WM_COMMAND и WM_SYSCOMMAND - ты же писал, что у тебя они не работают. Добавил кнопку для демонстрации сообщения WM_CLOSE. Скомпили его и проверь все действия.
Если в том исходнике ты не убрал или не изменил параметры при создании главного окна (WS_OVERLAPPEDWINDOW), то изменение размера происходит без проблем. Чтобы программа не закрывалась по нажатию мышки - нужно специально постараться (пример я описал).
← →
Evgeny (2003-01-02 09:28) [20]Соврал малость. Одна ошибка в том примере есть конечно же.
Имеется:
#include
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Должно быть:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
← →
Николай Быков (2003-01-03 04:26) [21]
> Evgeny © (02.01.03 09:28)
Там так и написанно (прочитай всю ветку)
> Evgeny © (02.01.03 09:19)
1)я спрашивал где в исходнике на Си ошибка
2)я что ли каждый раз буду перевод с Си на Паскаль спрашивать? И ждать по неделе пока ответят? Я поэтому и хочу именно на Си начать все делать.
3)Я говорил, что полученное окно почему-то не сворачивается/разворачивается/закрывается/изменяет_размер.
Вот я и спрашиваю где что надо в исхожнике на Си исправить, чтобы это окно могло сворачивается/разворачивается/закрывается/изменяет_размер
Имеется ввиду, что я не чем-то посылаю эти сообщения, а мышкой тыкаю на кнопки "Свернуть" "Развернуть" "Закрыть" и мышкой же пробую изменить размер. Так вот это у меня не получается, т.к. окно вообще никак не реагирует на такие действия. А почему это так я понять не могу, т.к. вроде бы один в один с твоим примером + пример из книги.
Повторяю: МОЯ ПРОСЬБА ЗАКЛЮЧАЛАСЬ В ТОМ, ЧТОБЫ МНЕ ПОКАЗАЛИ ГДЕ ИМЕННО В ИСХОДНИКЕ НА СИ ДОПУЩЕНА ОШИБКА, ЧТО ОКНО НИЧЕГО НЕ ДЕЛАЕТ ПРИ ВЫШЕУКАЗАННЫХ ДЙЕЙСТВИЯХ, ХОТЯ ДОЛЖНО
← →
Polevi (2003-01-04 11:37) [22]повтори еще разок
← →
Darts (2003-01-04 11:45) [23]> Николай Быков © (02.01.03 08:44)
И какой у тебя сишный компилятор?
← →
Николай Быков (2003-01-04 14:23) [24]
> Darts (04.01.03 11:45)
Borland C/C++ Free compiler. (только я так и не разобрался с параметрами коммандной строки для него. То есть он мне ехе делает, но винда его за ехе не принимает)
я пробовал компилировать это на Borland C++ 5.02 .
там создается усе как надо, только окно не реагирует ни на (ну я там выше уже сказал).
Еще одно подтверждение тому, что лучше мне на Си все делать:
Первый пример мне показал Евгений - хорошо.
Следующий же пример опять мне должен кто-нибудь перевести, т.к. там две ф-ции Си аналог которых скорее всего существует в Паскале, но скорее всего под другим именем, т.к. пож этим я его не нашел.
+ Там испоьзуются какие-то странные символы, коотрые мне опять же кто-то должен перевести на Паскаль, но т.к. этим никто заниматься не будет да и мне по неделе каждый перевод ждать неинтересно, то я хочу именно на Си писать
← →
Shadow (2003-01-04 14:27) [25]>странные символы
%))))))
← →
Darts (2003-01-04 15:14) [26]Приведи эти так называемык странные символы. Хочу посмотреть. Жутко интересно.
> Николай Быков © (04.01.03 14:23)
> Borland C/C++ Free compiler. (только я так и не разобрался с параметрами коммандной строки для него. То есть он мне ехе делает, но винда его за ехе не принимает)
1. bcc /help или bcc /? пробовал? Должен выдасть все команды.
2. Смотри заголовок получившегося экзешника. Он должен быть в формате PE.
← →
Ketmar (2003-01-04 16:13) [27]мда. я опять неплохо повеселился. Коленька, вы не думали, что для того, чтобы писать на це, его надо сначала выучить, а? или вы вообще думать не умеете (что, кажется, вполне вероятно)?
Satanas Nobiscum! 04-Jan-XXXVIII A.S.
← →
Evgeny (2003-01-05 06:38) [28]>Николай Быков © (03.01.03 04:26)
Тебе русским языком сказано, что пример рабочий. Это значит - что скомпилированный пример работает так как ему и положено. Изменяются размеры, производится сворачивание, разворачивание, таскание по столу - что еще? Кстати компилировал я используя bcc32 версии 5.0 от 1996 года из комплекта Borland C++ 5.0, как понимаешь далеко не первой свежести. Может все таки хелп почитать? Кстати оригинал этого файла, без указанной мной ошибки лежит на сайте: WWW.CODEMANUAL.COM/c_and_cpp/samples/csamples.zip
внутри имеется файл hellowin.c так вот это он и есть. Помимо того там имеется огромное количество других примеров. Разбираешь то, что написали другие люди, разбавляешь это чтением документации (хотя бы хелпа) и многие вопросы отпадут сами собой. Хотя бы о странных символах.
А вот тебе полностью указанный мною файл:
Evgeny.
/*--------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows" in client area
(c) Charles Petzold, 1990
--------------------------------------------------------*/
#include <windows.h>
long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow)
{
static char szAppName[] = "HelloWin" ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
if (!hPrevInstance)
{
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
RegisterClass (&wndclass) ;
}
hwnd = CreateWindow (szAppName, // window class name
"The Hello Program", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, "Hello, Windows!", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
← →
Darts (2003-01-05 14:04) [29]> Николай Быков © (30.12.02 20:38)
Тебе, да в не в обиду будет сказано, прямая дорога к VB. Вполне приличный язык. Зачем свзяваться с глючным Delphi и великим и ужасным C?
← →
Darts (2003-01-08 13:11) [30]Решил проблему?
← →
Anatoly Podgoretsky (2003-01-08 13:20) [31]С установкой VB?
← →
Darts (2003-01-08 13:56) [32]> Каа-то странно реагирует минимальное Win32приложение на сообщения [D6, Win2k]
> Николай Быков © (30.12.02 20:38)
Тепер до меня дошло, почему Винды как-то странно реагируют. Иногда. :)))))
← →
KSergey (2003-01-08 16:17) [33]Автор ветки!
Почему вы проигнорировали сообщение Cobalt © (31.12.02 18:48), но кидаетесь немедленно реагировать на выпады в ваш адрес? Вам не жаль своего времени? Может не туда все же энергию направлять, а?
И еще не совсем понятно: странно реагирует на сообщения или звук не играет? Это, вообще-то, разные вещи.
1) Для начала поправьте путь к файлу на
"c:\\windows\\media\\tada.wav" (о чем и пытался вам сказать Cobalt, но видимо напрасно высказал это не в язвительном тоне. потому вы и не заметили ;)
2) Убедитесь что файл там есть.
3) Я не пользовался ф-цией PlaySound, а потому указываю лишь на формальную ошибку.
И еще я очень сомневаюсь, что в книге путь к файлу написан именно так, как вы привели.
← →
KSergey (2003-01-08 16:21) [34]> Николай Быков © (04.01.03 14:23)
> + Там испоьзуются какие-то странные символы, коотрые мне
> опять же кто-то должен перевести на Паскаль, но т.к. этим
> никто заниматься не будет да и мне по неделе каждый перевод
> ждать неинтересно, то я хочу именно на Си писать
Не понятно: в чем загвоздка?
← →
Николай Быков (2003-01-08 23:46) [35]
> KSergey © (08.01.03 16:21)
> Не понятно: в чем загвоздка?
Не компилируется
← →
KSergey (2003-01-09 09:29) [36]> Николай Быков © (08.01.03 23:46)
> Не компилируется
Стоп. Разговор же начался с того, что не реагирует (правильно) на сообщения? А для этого хотя бы компилироваться должна. Теперь выясняется, что и не компилируется...
Хотя по сути я врятли тут что-то подскажу, т.к. этим компилятором не пользовался. Единственное что бы посоветовал - возьмите нормальный компилятор (с IDE) и не выпендривайтесь ;)
Тот же VC++. Т.к. на начальном этапе пробиваться через все эти заумы с ключами комилятора - не так то просто. А то там еще, поди, и def-файл (или как-то там, давно это было ;) надо было бы вообще-то сделать, где прописать форматы выходного файла и т.п....
Ну либо напишите письмо с адресом этого компилятора, если он ен очень велик - не более 5Мб - может я его и вытяну и попробую разобраться, если уж так вам хочется именно им пользоваться, но по-моему, это несколько на онанизм смахивает... Опять же захочется в отладчике походить - а фиг...
Не, нафиг. Лучше сразу возьмите любой компилятор с IDE - жить будет проще.
← →
Darts (2003-01-09 09:54) [37]http://www.bloodshed.net/
Dev-C++, которая включает IDE с отладчиком, подцветкой, компилятор gcc. Общий размер ~ 12Мб.
← →
Николай Быков (2003-01-09 10:25) [38]
> KSergey © (09.01.03 09:29)
Я вот этот компилятор (есть тот же самый, но только с IDE, Borland C++ 5.02 называется. он выдает такие же ошибки и предупреждения) взял потому, что у меня стоял Win2k и чтобы туда поставить VC++ (у меня только 7.0)нужно скачать откуда-нибудь SP2 (он вообще вместе с VS.NET идет, но только для англ. версии).
Теперь я себе поставил WinXP и, надеюсь, проблем не появится.
← →
Darts (2003-01-09 11:08) [39]Тебе в принципе, любой компилятор пойдет (для Win), даже такой старый как Borland С++ 5.
Смотри мой пост [Darts (09.01.03 09:54)]
После борландовского компилятора с командной строки этого мало не покажется! Суди сами: стандартам ANSI C удовлетворяет (файлы типа windowsx.h или objbase.h есть), exe-шники малюсенькие (от 3 К, а у Борланда пустой файл весит от 45 кб, если не ошибаюсь + вроде бы проблемы с линковкой ресурсов), есть дебаггер, встроены некоторые автоматические средства.
Не понимаю, зачем ставить таких монстров, как VC++ 7 или VC++ 6 ради забав с WinAPI? Они не фига не помогут тебе. Только вдумчивое исследование MSDN может помочь тебе. Возьми ставрые книги Федорова или Суркиса для BPW, там в принципе, все хорошо разжевано
А так любой инструмент хорош в умелых руках.
← →
KSergey (2003-01-09 12:03) [40]Николай Быков © (31.12.02 16:25)
так там написанно #include <windows.h> (подумайте теперь почему вы не это видите)
А почему кто-то должен еще о чем-то думать? Не видно=нету. А все остальное - кривость рук сайтостроителя.
На будущее совет: для простоты выкладывайте такие дела с расширением txt или прямо cpp - тогда никто их преббразовывать не будет и будет всем проще.
Впрочем в данном случае писать ваш пост было дольше, чем поправить свою же оплошность.
> Николай Быков © (09.01.03 10:25)
> он выдает такие же ошибки и предупреждения
Если бы вы потрудились еще раз спросить конкретно об ошибках и предупреждениях - было бы существенно проще помочь. А так я сейчас даже не смог за вашими многотрудными попытками всех облаять найти хоть одну ошибку, выданную компилятором.
Неужели обосрать всех полезнее, чем уточнить вопрос в том месте, куда вас ткнули носом? Я вообще поражаюсь вашей позицией вечно обиженного и попытками самоутвердиться в собсивенных же глазах. Зачем? (этоне вопрос! не надо на него отвечать!! Это факультативное домашнее задание!!!)
← →
Сатир (2003-01-09 14:51) [41]2 НБ
Предсказание: тебе дорога на Большую Сцену в области написания юмористических призведений на злободневную тему из жизни начинающих шКодеров (шКодер - индивидуум, желающий стать великим программистом лёгким путём(за короткий период времени), чтоб сразу рубить со своего ремесла не кислую капусту).
С Новым Годом
← →
p77 (2003-01-09 21:43) [42]Ув. Николай Быков (ака Иришка;))!
Я Вам посылал кучу книг по С/С++ по мылу, а Вы даже не удосужились мне ответить. Ни мне спасибо, ни тебе досвиданья:). Хоть бы спасибо сказали. Я ведь не знаю - дошло ли до Вас. Некрасиво с Вашей стороны.
С уважением.
← →
Николай Быков (2003-01-10 04:44) [43]
> KSergey © (09.01.03 12:03)
Ой.
Тут просто недалеко ветка была, где я даже скриншот (17Кб) того, что мне выдается вывесил.
Запамятвовал, что это другая ветка.
http://freeprogrammer.narod.ru/tmp.bmp - скриншот
http://freeprogrammer.narod.ru/1.html - исходник
> Darts (09.01.03 11:08)
Честно говоря, я не проследил за ходом мыслей в этом посту(е).
Если вы говорите: "Borland C++ 5 это круто", то мой ответ:"Он выдает абсолютно то же самое, что и тот консольный"
Если вы говорите: "Borland C++ 5 - must die", то мой ответ: "Ну я и поставил себе VC++7"
Тогда на фоне этого непонятно, > Не понимаю, зачем ставить таких монстров, как VC++ 7 или
> VC++ 6 ради забав с WinAPI?
_______________________________________________________________
т.к. уже много кто забыл про тему ветки, то в кратце расказываю:
1) Консольный компилятор. Компилирует, но на .ехе файл Windows говорит, что это не Win32-приложение
2) Borland C++5,02 раньше компилировал нормально, но получаемое окно ничего не делало при попытках свернуть/развернуть/закрыть и пр. ("Как-то странно <...> на сообщения Windows")
3)Затем Broland C++5.02 и Borland C|C++ Free Compiler 5.5 сравнялись. Оба вадют одно и то же (см. скриншот) и отказываются компилировать
← →
KSergey (2003-01-10 08:24) [44]Читаю картинку.
Ну во-первых, он компилирует. На эти предупреждения можно смело закрыть пока глаза. Просто переведите их - и станет понятно, что это не страшно.
А ошибка происходит на этапе линковки. Это существенно. Мне сейчас лень описывать что это значит, в свое время я тоже долго врубался.
Ошибка проста: не могу найти ф-цию main(), на которую есть ссылка в файле C0X32.obj (это библиотечный файл) (подчерк перед main - это стандартизованная приписка компилятора Си).
О природе происхождения ошибки могу предположить следующее: компилятор предполагает, что вы делаете стандартное консольное приложение (не Win), и соотв. подключает библиотеки для консольного приложения. А они предполагают наличие стартовой ф-ции main, а не WinMain. Ну и не находя ее линковщик ругается, понятно. Предполагаю, что в опциях компилятора/линковщика надо какой-то ключик указать, что приложение вообще-то Win. Но какой - не подскажу, не знаю. В IDE это настраивается соотв. переключателем в опциях проекта - потому я и советую плюнуть на компилятор командной строки: для начинающего все эти тонкости - китайская грамота, вы в них просто утоните ни за что ни про что.
В IDE советую начать с создания нового пустого проекта "Win 32 App", куда просто вставить этот текст, т.к. если вы сейчас попытаетесь прямо этот файл куда-то вставлять, то возможно придется настроить опции проекта, что вообще-то не на много проще параметров командной строки. А так среда сама нормально все настроит. Я же говорю, что все не так-то уж и просто в подготовке необходимых файлов для компиляции и линковки Win приложения (не сложно, но надо знать, методом тыка это точно не пробить).
И еще. А откуда вторая строчка "ilink32 1.obj"? Это вы ее ручками вводите? Напрасно. Линковщик у вас и так запускается. Автоматически. Почитайте выводимые сообщения. А вот этой строчкой вы, скорее всего, как раз и делаете exe-файл, структура которого отфонарная, что не удивительно. По идее, если все нормально (без ошибок), exe-файл должен создаться и первой командой.
А вообще - ну возьмите наконец книжки по Си и созданию приложений для Win32. Скорее всего там будет описана методика компиляции в какой-либо среде. Просто так тыкаться - абсолютно не производительно. Да и с языком не плохо бы ознакомиться.
Ну а как компиляция пойдет или появяться новые конкретные вопросы - размещайте в эту ветку - будем смотреть дальше что там и как.
← →
Николай Быков (2003-01-10 08:52) [45]
> KSergey © (10.01.03 08:24)
Попытка №n скомпилировать. (пробоваю добавить ключик -tW)
УРЯЯЯЯЯ!!!! СДЕЛАЛСЯ ехе-шник!!!!
РАБОТАЕТ!!!!!!!!!
//=====
Вот черт! Та же самая проблема.
Ни свернуть/развернуть/закрыть/изменить_размер/переместить.
Вот у меня то же самое и с IDE получалось.
Можете помочь?
← →
KSergey (2003-01-10 10:11) [46]Выложите текущий .cpp-файл (сам по себе с расширением cpp!!) где-либо и дайте ссылку. Или сюда без урезок! (сюда навеное даже лучше). В приведенном вами тесте я не вижу проблем. Подозреваю, что они есть в текущей версии компилируемого вами файла.
← →
Николай Быков (2003-01-10 11:08) [47]он только не .cpp а .c
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[]="HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(
szAppName,
"The Hello Programm",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0));
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:
PlaySound("c:\windows\media\tada.wav", NULL, SND_FILENAME | SND_ASYNC);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Hello Windows 95", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Вот. Именно его и компилировал.
> В приведенном вами тесте я не вижу проблем
Вот у меня такое часто бывает. Однажды долго мучался над таким приложением (попытался самостоятельно перевести на паскаль пример из книги). Оказалось все просто - я lParam и wParam делал не longint а word :-)
Винда (98ВИ)вылетала с синим экраном.
← →
Николай Быков (2003-01-10 11:09) [48]Причем, что самое странное, если перевести это же самое на паскаль и откомпилировать, то все работает
:confused:
← →
Николай Быков (2003-01-10 11:28) [49]вот тут то, что вылазит из компилятора
http://freeprogrammer.narod.ru/1.exe (надеюсь, чьто народ не испортил его)
← →
KSergey (2003-01-10 11:40) [50]О, блин...
Я же говорил: читайте внимательно книги! Си требует большего внимания от программиста.
Я уже начал тихонько офигевать наблюдая описанный вами эффект при компиляции даной вами программы... Но таки ошибочка нашлась ;) Через минут 20 примерно.
Вот как бы вам ее показать? Так, чтобы тоже помучались? ;) Наверно приведу правильный текст (вернее тот, который не имеет описанного эффекта не реагирования на ошибки, т.к. вообще-то любой текст программы правильный, а то, что она делает не то, что хотелось - это не к программе претензии; она от этого правильной быть не перестает, при условии ее компилируемости), а вы попробуйте ошибку найти. Только найдите, ладно? а не просто скопируйте мой текст. Ну и сюда результат ;)
← →
KSergey (2003-01-10 11:42) [51]Вместо
...не имеет описанного эффекта не реагирования на ошибки...
читать
...не имеет описанного эффекта не реагирования на сообщения...
А она ведь и правда не реагировала ;)
← →
Игорь Шевченко (2003-01-10 11:44) [52]Упс!
И я ошибку увидел :-)))
← →
Николай Быков (2003-01-10 11:45) [53]сейчас поищю -)
(а куда это вы текст уже выложили? или в том посте очепятка?)
← →
KSergey (2003-01-10 11:46) [54]А теперь текст:
Добавленная строчка include не считается, прсто удивительно как она без этого у вас компилировала впрочем в разных компиляторах возможно есть разные умолчания (в Mmsystem.h описан прототип ф-ции PlaySound). А может windows.h слегка разный - не знаю. Короче это не та ошибка, о которой идет речь. Если бы все так было просто - я бы сразу так и написал ;)
#include <windows.h>
#include <Mmsystem.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[]="HelloWin";
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(
szAppName,
"The Hello Programm",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(iMsg)
{
case WM_CREATE:
PlaySound("c:\\windows\\media\\tada.wav", NULL, SND_FILENAME | SND_ASYNC);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, "Hello Windows 95", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
← →
Игорь Шевченко (2003-01-10 11:46) [55]А вот если еще и updatewindow убрать, будет совсем интересно :-))
← →
Игорь Шевченко (2003-01-10 11:48) [56]В изначальном тексте, естественно :-)
← →
KSergey (2003-01-10 11:52) [57]> Игорь Шевченко © (10.01.03 11:44)
> Упс!
> И я ошибку увидел :-)))
Интересно, попытками компилировать или просто вчитываясь в текст? Я бы. пожалуй, так просо не нашел. Хотя, если бы внимательно вгляделся в спокойной обстановке...
Будет обидно, если для поиска применится fc. Хотелось бы чтобы ручками-глазками ;)
← →
KSergey (2003-01-10 11:53) [58]Одним словом все замерли в ожидании ;) (извините за издевательский тон)
← →
Николай Быков (2003-01-10 11:56) [59]
> KSergey © (10.01.03 11:46)
Вот я когда перечитывал, то тоже обратил внимание на точку с запятой после while.
а модули windws.h видимо разные, т.к. на паскале тоже надо MMSystem.pas включать.
А почему не выдалось ошибки? Ведь я не по правилам написал же? Там же нельзя ставить точку с запятой.....
← →
KSergey (2003-01-10 11:59) [60]Враки, можно
Иначе бы не компилировалось ;)
Объяснять не буду, читайте книжки
Стоит отметить, что различия вы нашли быстрее, чем я эту маленькую точку с запятой ;)
← →
Николай Быков (2003-01-10 12:02) [61]
> KSergey © (10.01.03 11:59)
Да я не по тексту. Я свой(ну который 1.с)прочитал. Сравнил с switch. Задумался. Пришел к противоречию: "Как же так можно..."
Посмотрел ваш текст. Опасения подтверлдились.
Какой смысл имеет эта точка с запятой спрашивать не буду (догадываюсь). Лучше книжку прочитаю :-)
← →
Anatoly Podgoretsky (2003-01-10 12:03) [62]Николай Быков © (10.01.03 11:56)
Почему нельзя, можно, все в пределах правил.
← →
Игорь Шевченко (2003-01-10 12:04) [63]KSergey © (10.01.03 11:52)
Скачал, запустил, удивился. Посмотрел текст - понял.
С уважением,
← →
Николай Быков (2003-01-10 12:06) [64]еще вопрос (офтопик):
А почему .ехе такой жирный получается? На C# всего 8kb был. Зато, правда, 10Mb оперативки жрал, собака.
← →
KSergey (2003-01-10 12:07) [65]> Игорь Шевченко © (10.01.03 12:04)
> KSergey © (10.01.03 11:52)
> Скачал, запустил, удивился. Посмотрел текст - понял.
Я, сказать по-правде, вначале с дуру кинулся перепроверять все параметры всех ф-ций, заполнение структур, а дело было вовсе и не в этом ;)
← →
KSergey (2003-01-10 12:10) [66]> Николай Быков © (10.01.03 12:06)
> еще вопрос (офтопик):
> А почему .ехе такой жирный получается? На C# всего 8kb был.
> Зато, правда, 10Mb оперативки жрал, собака.
Это вопрос к стандартным библиотекам и опциям линковщика, отчасти - компилятора.
← →
Darts (2003-01-10 12:13) [67]> А почему .ехе такой жирный получается? На C# всего 8kb был.
Смотри пост от Darts (09.01.03 11:08)
Минимальное приложение для BСС начинается с 45 Кб. аналогичное приложение на FPC (паскале!!!) весит 15 кб.
> На C# всего 8kb был. Зато, правда, 10Mb оперативки жрал, собака.
RunTime library, панимаэшь, залжэены в NET. Вах, вах, покупай оперативки поболее. Новые технологии требуют большой памяти. Эволюция по восходящей.
← →
Игорь Шевченко (2003-01-10 12:22) [68]Дался вам этот размер и занимаемая память! :-)
Детский сад, ей-богу. Песочница.
← →
p77 (2003-01-11 19:39) [69]Николаша,Вы читали мой вопрос к Вам в этой ветке?
← →
Николай Быков (2003-01-11 21:22) [70]
> p77 © (11.01.03 19:39)
ко мне? imho он был адресован какой-то Ире....это ваша знакомая?
← →
Rouse_ (2003-01-11 22:00) [71]А что проблема еще не решена? Вот это да :) две недели из-за 30 строчек сишного кода, это супер. Получается практически как в анекдоте:
Я уже два года работаю с Windows и ни разу его не переустанавливал. Он у меня ни разу не повис, не глюкнул. Я никогда не видел синего экрана, я рыдаю !!! Доктор, Подскажите, что я делаю не так?
Желаю успехов
← →
Николай Быков (2003-01-12 08:35) [72]
> Rouse_ © (11.01.03 22:00)
1) Проблема уже давно решилась (см. выше)
2) Там 80 строчек ;-)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.68 MB
Время: 0.01 c