чистый WinAPI в C++

Тема в разделе "LANGS.C", создана пользователем BlagJack, 28 мар 2009.

  1. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Код (Text):
    1. #include <windows.h>
    2.  
    3. #pragma comment(linker, "/ENTRY:aWinMain")
    4. #pragma comment(linker, "/MERGE:.rdata=.text")
    5. #pragma comment(linker, "/MERGE:.data=.text")
    6. #pragma comment(linker, "/SECTION:.text,EWRX")
    7.  
    8.  
    9.  
    10.  
    11. int WINAPI aWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    12. LPSTR lpCmdLine, int nCmdShow)
    13.  
    14. {
    15. MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
    16. return 0;
    17. }
    Все делаю как надо , отключил либы, проект компилится но не собирается , подскажите как писать на WinAPI чистом , чтобы проекты могли линковаться....
    UNICODE отключен...
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    BlagJack

    Ну ты б показал, как ошибки линковки выглядят?
     
  3. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_CheckEsp"
    1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_CheckEsp"
    1>123.obj : error LNK2001: неразрешенный внешний символ "__RTC_Shutdown"
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    http://social.microsoft.com/Forums/en-US/vcgeneral/thread/644ea195-5a86-4beb-9e19-b38713d67074

    ?
     
  5. Phuntik

    Phuntik New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2008
    Сообщения:
    318
    BlagJack
    Дружище, ты хотя бы сказал, какие ошибки показывает, что ли...
     
  6. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Phuntik
    выше смотри

    _DEN_

    там много всего и мало по теме , переводить долго все оч , просто я хочу писать чтобы выходной файл был оч. маленький
    возможно я отключаю все библиотеки , а надо какие то определенные.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    BlagJack
    Что за компилятор? MSVC 9 Express ругается на #pragma comment(linker, "/SECTION:.text,EWRX") и в его хелпе флаг X не прописан. Без него всё скомпилилось и заработало. Кстати зачем параметры в main? если их некому заполнять :))
    Достаточно:
    int aWinMain(void) {...}
    или
    #pragma comment(linker, "/ENTRY:main")
    int main(void) {...}
    Проверил и в release и в debug и с unicode - всё ОК :))
     
  8. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Код (Text):
    1. #include <windows.h>
    2.  
    3.  
    4.  
    5. #pragma comment(linker,"/ENTRY:WinMain")
    6. #pragma comment(linker,"/MERGE:.rdata=.data")
    7. #pragma comment(linker,"/MERGE:.text=.data")
    8. #pragma comment(linker,"/NODEFAULTLIB")
    9.  
    10.  
    11. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    12. LPSTR lpCmdLine, int nCmdShow)
    13.  
    14. {
    15. MessageBox(NULL, "Hello !", "Hello from MessageBox", MB_OK);
    16. return 0;
    17. }
    вот это не компилится вообще....
    то я скомпилил и в 2005 , в 2008 знаю.
    Y_Mur
    в том случае и у меня компилится , но размер 15.5 кб это много.

    Тут смысл что библиотеки когда отключаю стандартные не компилится , линкер ругается на несколько запрешенных символов , может надо отключать не все , а только определенные библиотеки?
     
  9. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    отключи runtime-проверки.

    возможно
    #pragma comment(linker, "/ENTRY:aWinMain")
    из-за вот этого не линкуется CRT, где и находятся
    __RTC_CheckEsp и т.д.
     
  10. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    очень много вариантов перепробовал , еще ругался , на ссылки на запрещенный символ , я использовал /INCLUDE
    но тоже все , что не делаю все теже ошибки, если не использовать /NODEFAULTLIB то все норм...
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    BlagJack
    У меня твой первый код в release 4кб :) (убрал только непонятный флаг Х)
    А при ключе /NODEFAULTLIB нужно: Свойства проекта / C/C++ / создание кода / проверка переполнения буфера / нет
    Забавно, что в первом варианте это не потребовалось и ничего лишнего в коде нет :)

    PS: Кстати принимать return 0; без CRT тоже некому ;) так что если хочешь вернуть код завершения программы:
    #pragma comment(linker, "/ENTRY:main")
    void main(void)
    {
    MessageBox(NULL, "Hello, Win32 world!", "Hello from Message Box", MB_OK);
    ExitProcess(0);
    }
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Настройки проекта -> C/C++ -> Code Generation.
    Вырубай Buffer Security Check и Basic Runtime Checks.
    Linker -> Input
    Ставь флаг Ignore All Default Libraries.
     
  13. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Y_Mur
    Кстати принимать return 0; без STL тоже некому ;)

    только не STL, а ф-ция CRT отвечающая за инициализацию.
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    deLight
    Да конечно CRT - малость загнался :))
     
  15. BlagJack

    BlagJack New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    6
    Y_Mur,deLight,n0name_DEN_ спс , все заработало , действительно 4 кб =) я правда где- то читал, что есть возможность еще уменьшить файл без помощи упаковщиков и проч , вы может знаете что-нить по этому поводу ? =)
     
  16. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    секции выравниваются на FileAlignment, между заголовком и первой секцией может быть пустая область, ее можно заюзать... учитывая что MERGE ты уже заюзал, других вариантов не вижу
     
  17. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    BlagJack
    Можно ещё уменьшить, если в Configuration Properties -> Linker -> Command Line в разделе Additional Options явно указать: /ALIGN:4096 . Это по сути параметр выравнивания секций в памяти, но компилятор тогда меняет FileAlignment с четырёх на полкилобайта.
     
  18. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    1кБ из этих четырёх "ест" манифест, его можно запретить: Configuration Properties -> Linker -> файл манифеста -> создавать манифест -> нет
    Гы-гы: А после удаления извращений с объединением секций и установкой атрибутов, без манифеста стало 2,5кБ :))
    Выравнивание не трогал ;)
    Код (Text):
    1. #include <windows.h>
    2. #pragma comment(linker, "/ENTRY:main")
    3. void main(void)
    4. {
    5.     MessageBox(NULL, L"Hello, Win32 world!", L"Hello from Message Box", MB_OK);
    6.     return; // или ExitProcess(0); // если нужен код завершения
    7. }
     
  19. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Y_Mur
    2,5 КБ - это странновато. А генерацию Debug Info отключили хоть? :)
    Кстати, странно... сейчас проверил... файловое выравнивание и без /ALIGN:4096 ставится на полкилобайта. Раньше сто процентов без этого в четыре килобайта выставлялось, пока не поставлю /ALIGN:4096 .
    P.S. Да... выставлялось и выставляется. Только на проектах побольше.
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А она тут при чём? - всё равно же в отдельный .pdb попадает :)