Компиляция Win-приложений в Borland C++ 5.0
#include <stdio.h>
void main ()
{
printf ("FUCK OFF");
}
Помогите пожалуйста!!
Люди! У меня проблема с компиляцией Win-приложений в С++ 5.0. Все дело в том, что что бы я не делал, но программа компилится под дос. При запуске такого приложения, открывается ДОС-окно и по завершению работы программы оно исчезает. Если вдруг кто знает, в чем проблема, скажите мне пожалуйста. Может в настройках что-либо нужно делать? Я перепробывал практически все, но все оказалось бесполезно. Все-равно компилится DOS приложение. Компилировал я простейшую программу без ресурсов и других наворотов:
#include <stdio.h>
void main ()
{
printf ("FUCK OFF");
}
Помогите пожалуйста!!
Хм... А куда ты хочешь выводить вот это вот "приветствие"? Если на "окно", то в твоём коде про "окна" ничего не сказано. :)
Видимо, ты просто выбрал не тот проект. Если мы говорим про Borland C++ Builder, то обычный виндузовый проект открывается при старте Builder'a. Если мы говорим про просто Borland C++, то ничем помочь не смогу.
А вообще, признаком того что, это будет вин-приложение является наличие функции WinMain.
Хм... А куда ты хочешь выводить вот это вот "приветствие"? Если на "окно", то в твоём коде про "окна" ничего не сказано. :)
Видимо, ты просто выбрал не тот проект. Если мы говорим про Borland C++ Builder, то обычный виндузовый проект открывается при старте Builder'a. Если мы говорим про просто Borland C++, то ничем помочь не смогу.
А вообще, признаком того что, это будет вин-приложение является наличие функции WinMain.
А если функции с таким именем нет?
То приложение будет не "виндовым"?
Что ты понимаешь под виндовым приложением?
Т.е. если всё начинается так (см. ниже), то это уже точно не "виндовое" приложение?
#pragma comment(linker,"/ENTRY:StartPoint")
void StartPoint(void)
{
........
}
А если функции с таким именем нет?
То приложение будет не "виндовым"?
Что ты понимаешь под виндовым приложением?
Т.е. если всё начинается так (см. ниже), то это уже точно не "виндовое" приложение?
#pragma comment(linker,"/ENTRY:StartPoint")
void StartPoint(void)
{
........
}
В общем согласен с тобой, но ответ был на уровне вопроса (не в обиду, ufo). Этого ответа ведь достаточно, чтобы понять куда копать?
В примере идея понятна, но у comment'а нет типа linker.
А чтобы написать приложение под вин с нуля ручками(всмысле оконное), прочитай Ч. Петзоля , многое станет понятно.
А про main и WinMain() это вообще отдельная песня... (но это не определяет консольное или оконное )
Полюбому у тебя получается не дос, приложение, а консольное приложение WIN32.
А чтобы написать приложение под вин с нуля ручками(всмысле оконное), прочитай Ч. Петзоля , многое станет понятно.
А про main и WinMain() это вообще отдельная песня... (но это не определяет консольное или оконное )
Блин. :( Я действительно не тот пример привел. Вернее не совсем подходящий. Программа, которю я хочу скомпилить не будет выводить ничего на экран. Она вообще не будет давать о себе знать пользователю. В том простом примере, который я привел, даже если убрать printf все равно DOS окно вылетать будет. Если чесно - я DOS кодер и только недавно начал перебираться на Win32. Возможно кто-нибудь знает ссылку на литературу, которую мне стоило бы прочитать? Я не совсем понимаю что представляет из себя WinMain(). Очень жду от вас помощи! В книгах, которые у меня есть, ответа на этот вопрос нет :(.
Блин. :( Я действительно не тот пример привел. Вернее не совсем подходящий. Программа, которю я хочу скомпилить не будет выводить ничего на экран. Она вообще не будет давать о себе знать пользователю. В том простом примере, который я привел, даже если убрать printf все равно DOS окно вылетать будет. Если чесно - я DOS кодер и только недавно начал перебираться на Win32. Возможно кто-нибудь знает ссылку на литературу, которую мне стоило бы прочитать? Я не совсем понимаю что представляет из себя WinMain(). Очень жду от вас помощи! В книгах, которые у меня есть, ответа на этот вопрос нет :(.
ВСя фича в том, что структура у вин программы немног сложнее т.е поскольку ввиндовс все построено на событиях то должен быть их обработчик .., и.тд., билдер все скрывает от глаз программиста, если хочешь реально в этом разобраться ищи книгу Ч. Петзоля , программирование в виндовс 95 конешно уже усторела, но книга реально рульная..
Блин. :( Я действительно не тот пример привел. Вернее не совсем подходящий. Программа, которю я хочу скомпилить не будет выводить ничего на экран. Она вообще не будет давать о себе знать пользователю. В том простом примере, который я привел, даже если убрать printf все равно DOS окно вылетать будет. Если чесно - я DOS кодер и только недавно начал перебираться на Win32. Возможно кто-нибудь знает ссылку на литературу, которую мне стоило бы прочитать? Я не совсем понимаю что представляет из себя WinMain(). Очень жду от вас помощи! В книгах, которые у меня есть, ответа на этот вопрос нет :(.
Вместе с 5-ым билдером идет довольно неплохой хелп по Win API. Если с англииским, не очень смотри на cracklab.narod.ru описание функций виндувс.
Ну вобщем ты понял, - если хочешь побыстрее начать кодить под винды поставь себе Borland C++ Builder (а не просто С++). Книжек по работе с ним много (как виртуальных - cкажем aport.ru так и реальных). Ну а если ты действительно хочешь все с нуля писать (на это должны быть веские причины - хацкер?) то придется поковыряться конкретно (но лучше не недо:).
Вот в том то и дело, что мне нужно все с нуля. К стати, у меня есть еще один вопросец. Когда я смотрел в настройках проекта в C++ 5.0, то не нашел там модели памяти Flat. На сколько я помню, при кодинге на асме под Win обязательно задается модель Flat а не Small или еще что-либо. как это вообще объясняется? Неужели проект компилится под Win с моделью Small? Разьве это реально?
Последний вопрос, и очень для меня важный. У меня возникла проблема с выделением памяти. mlloc выделяет не более 64 Кб в сумме от всех выделений в программе, пытался выделить farmalloc, переопределил переменный на far типы far char, но функция read (чтение из файла) напрочь отказалась работать с новым типом. Кто-нибудь может мне сказать, в чем тут проблема? Возможно вместе с farmalloc нужно менять и read на другую функцию?? Помогите плиз!!!
Вот в том то и дело, что мне нужно все с нуля. К стати, у меня есть еще один вопросец. Когда я смотрел в настройках проекта в C++ 5.0, то не нашел там модели памяти Flat. На сколько я помню, при кодинге на асме под Win обязательно задается модель Flat а не Small или еще что-либо. как это вообще объясняется? Неужели проект компилится под Win с моделью Small? Разьве это реально?
Последний вопрос, и очень для меня важный. У меня возникла проблема с выделением памяти. mlloc выделяет не более 64 Кб в сумме от всех выделений в программе, пытался выделить farmalloc, переопределил переменный на far типы far char, но функция read (чтение из файла) напрочь отказалась работать с новым типом. Кто-нибудь может мне сказать, в чем тут проблема? Возможно вместе с farmalloc нужно менять и read на другую функцию?? Помогите плиз!!!
В 32-разрядных системах уже нет такого гемороя с памятью. Т.е. можешь считать, что по умолчанию всё flat.
Я бы советовал выделять память с помощью new:
pBuf = new char[BufSize];
А для работы с файлом - стандартные ф-ции Win32API (CreateFile, ReadFile, WriteFile), т.к. все остальные ф-ции в штатном режиме, все равно, вызывают именно их.
В 32-разрядных системах уже нет такого гемороя с памятью. Т.е. можешь считать, что по умолчанию всё flat.
Я бы советовал выделять память с помощью new:
pBuf = new char[BufSize];
А для работы с файлом - стандартные ф-ции Win32API (CreateFile, ReadFile, WriteFile), т.к. все остальные ф-ции в штатном режиме, все равно, вызывают именно их.
Огромное спасибо за подсказку!
А эта "new" реально может выделить более 64 Кб? Она не глючит при выделении больших объемов памяти? А то я слышал, что в Win9x иногда происходят глюки при выделении больших участков памяти.
И на счет моделей. Если Flat выставляется по умолчанию и изменению не подлежит, то зачем предоставлен выбор моделей в настройках? Совсем непонятно :(
P.s.
В c++ 3.1 нормально работает "new"?
Огромное спасибо за подсказку!
А эта "new" реально может выделить более 64 Кб? Она не глючит при выделении больших объемов памяти? А то я слышал, что в Win9x иногда происходят глюки при выделении больших участков памяти.
И на счет моделей. Если Flat выставляется по умолчанию и изменению не подлежит, то зачем предоставлен выбор моделей в настройках? Совсем непонятно :(
P.s.
В c++ 3.1 нормально работает "new"?
Стоп! Ты работаешь на BC++ 3.1 ?
Тогда всё вышесказанное мной отменяется. В BC++ 3.1 16-битный компиллер, т.е. new только до 64к. Чтобы работать с более 64к, тебе нужна модель Huge. Только я бы посоветовал пересесть на 32-битные компиляторы, т.е. от ВС++ 5, проблем будет меньше, кроме памяти например, еще надо буде заморачиваться с вызовом ф-й 32-битных DLL (а они почти все 32-битные) из 16-разрядного приложения, и т.п.
А совсем идеальный вариант: работать на VC++ используя WTL, а не MFC. Тогда почти всё сделаешь ручками, как оно требуется, а не как предлагают ребята из Борланда и MS.
Стоп! Ты работаешь на BC++ 3.1 ?
Тогда всё вышесказанное мной отменяется. В BC++ 3.1 16-битный компиллер, т.е. new только до 64к. Чтобы работать с более 64к, тебе нужна модель Huge. Только я бы посоветовал пересесть на 32-битные компиляторы, т.е. от ВС++ 5, проблем будет меньше, кроме памяти например, еще надо буде заморачиваться с вызовом ф-й 32-битных DLL (а они почти все 32-битные) из 16-разрядного приложения, и т.п.
А совсем идеальный вариант: работать на VC++ используя WTL, а не MFC. Тогда почти всё сделаешь ручками, как оно требуется, а не как предлагают ребята из Борланда и MS.
Да я понимаю что на визуальном C будет все пучком под Win, но мне ни в коем случае нельзя писать мой проект на визуальных языках. Так я бы уже давно написал. А C++ 3.1 я использую только из за того, что он единственный компилит мою прогу по Win так, что при запуске никакого дос-окна не вылазит. Даже при выводе текста на экран открывается отдельное Win окно, а DOS окном, как в C++5 даже и не пахнет. Буду очень благодарен, если кто-нибудь приведет мне простейший пример компиляции Win приложения в C++ 5.0 Желательно без вывода текста на экран. Главное чтоб DOS-окно не вылазило. Пусть прога будет складывать 2 числа и все. Пожалуйста! Великие кодеры, помогите!!!! К исходнику этой простейшей проги, желательно описать все изменения дефолтовых настроек. Буду ооочень благодарен! Могу даже отблагодарить, но на счет расплаты только по мылу [email]ufo@cu-amagzine.ru[/email]. Мне ооочень нужна ваша помощь!
А C++ 3.1 я использую только из за того, что он единственный компилит мою прогу по Win так, что при запуске никакого дос-окна не вылазит. Даже при выводе текста на экран открывается отдельное Win окно, а DOS окном, как в C++5 даже и не пахнет.
Кто тебе такую глупость сказал?
Я уже давно не юзал Борландовские продукты, но попробуй установить любую среду разработки от BC++ 5. Создай новый проект, там наверняка будет что-то типа визарда, укажи, что нужен проект под винды.
А по поводу твоего вопроса про Борланд Ц++ 5.0. К сожалению, пятого у меня нет. И вот, запускаю я свой старенький Borland C++ 5.02 (я бы его давно прибил, если бы препод программы под него не требовал, которые я все равно под МСВЦ++.НЕТ пишу). И что я вижу? А вижу я Заголовок, строку меню и пустое серенькое пространство. Так вот, выбираю я File->New->Project. Задаю Project Path and Name, Target Name (к примеру, C:\FUCKOFF\message и messgae). Target Type задаю Application(.exe). В окнах Frameworks, Controls, Libraries убираю все галочки. Ставлю переключатель Static. Platform выбираю Win32. TargetModel выбираю GUI. (замечу, что многое Борланд сделали за меня по умолчанию).
Теперь я нажимаю кнопульку OK. Удаляю из проекта файлы message.def и message.rc. Дважды кликаюсь на message.cpp. Появляется пустое окно. Пишу там такой текст:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x400
#include <windows.h>
#include <stdio.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
int a,*b;
double c;
char str[1024];
b=new int[655360];
for(a=0;a<655360;a++)
b[a]=a;
c=0.0;
for(a=0;a<655360;a++)
c+=b[a];
sprintf(str,"FuckOff: %lg",c);
MessageBox(NULL,str,"Ahtung!",MB_OK | MB_ICONSTOP);
return 0;
}
Потом, запустив эту программу, получил, сообщение такого вида: FuckOff: 2.14748e+11
Потом взялся за калькулятор (виндовский, стандартный) и, вспомнив формулу арифметической прогрессии, посчитал 655360*655359/2 и получил 214748037120 - ну почти правильно мой калькулятор посчитал... я так думаю...
Как видим, тут и виндовское приложение без дос-окна, тут и выделение памяти более 65к (точнее 650к за раз), и сложение пары чисел, и даже вывод на экран. Вобщем делай, что хошь...