решился я как то переходить постепенно на си++. А то куда не глянь все о нем спрашивают, да и признать быстрее кой чего писать на нем. Использую MS VS 2005/ Начал кодить значит. И вижу что есть там две версии настроек сборки - debug & release. Дэбаг получается больше но зато в ольке видны строчки из сорса. Значит по назначению его и использую, для дебага тобишь. А вот с релизом я жутко разочаровался. Создаю пустой вин проджект. Весь код таков: Код (Text): #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return 0;} и компилится это чудо в 5 с лишним килобайт. Помимио того оно имеет кучу обращений к MSVCR80.dll: 365 _encode_pointer 230 __set_app_type 1005 _unlock 151 __dllonexit 636 _lock 208 __p__fmode 355 _decode_pointer 374 _except_handler4_common 529 _invoke_watson 322 _controlfp_s 334 _crt_debugger_hook 204 __p__commode 273 _adjust_fdiv 233 __setusermatherr 319 _configthreadlocale 523 _initterm_e 522 _initterm 259 _acmdln 1238 exit 555 _ismbblead 103 _XcptFilter 383 _exit 303 _cexit 160 __getmainargs 802 _onexit 280 _amsg_exit Помимо того в конце какойто код которого я как творец не предусматривал: <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADD помимо того там еще.. и еще и еще.. собираю его без дэфолтных либ. Произво млин. У меня чувство творца вмиг пропало. Вот и созрел вопрос который потому и разместил на этом форуме что понимаете вы того кто на асме писал доселе. Как же мне получить на выходе то ровно что я в исходнике то написал. Ведь можно же и тут как то указать что то вроде /align:16 и /merge:.rdata=.data. Мжно же как то указывать из исходника какие либы подключать (чтото вроде includelib). Я спрашивал по этому поводу мне отвечали мл - тебе 5Кб жмут что ли. Но чёрт не могу я продолжать работь зная что где то в самом начале у меня что то пропущено, что студия лепит туда столько всего непрошенного что про свободный просмотр в дэбагере можно и забыть... Я понмиаю что стиль работы тут вовсе другой. Однако слишком уж не охота зацыкливатся на этом всем. Хотелось бы писать на чистом WinAPI, используя левые либы лишь в случае когда увиу их превосходство или незаменимость и так учится постепенно. Подскажите пожалуйста кто чего знает...
spencer А чего бы ты хотел - среда универсальная, заточена под все возможные варианты, что влечет потерю в эффективности. Потеря на самом деле кажущаяся, в большом проекте инициализация среды будет копеечной по сравнению со всем остальным кодом. А для приведенного тобой примера лучше конечно писать на голом ассемблере.
все же на данном этапе мне нужно более сосредоточится на воплощении идеи в код для чего си удобней, пишется быстрей и наглядней, да чего там говорить. И мне трудно верится что там не предусмотренны какие то хитрые опции...
spencer настраивай проект через Опции, чтоб было похоже на это и будет все шоколадно Код (Text): <?xml version="1.0" encoding="windows-1251"?> <VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="HideDebugger" ProjectGUID="{4FB2D9A5-32D8-4ADE-B1DC-E543003EA1C6}" RootNamespace="HideDebugger" Keyword="Win32Proj" > <Platforms> <Platform Name="Win32" /> </Platforms> <ToolFiles> </ToolFiles> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" Optimization="0" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDEDEBUGGER_EXPORTS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" StructMemberAlignment="1" DefaultCharIsUnsigned="true" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="false" DebugInformationFormat="4" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" LinkIncremental="2" GenerateManifest="false" GenerateDebugInformation="true" SubSystem="2" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)" ConfigurationType="2" CharacterSet="0" WholeProgramOptimization="1" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" InlineFunctionExpansion="0" EnableIntrinsicFunctions="false" WholeProgramOptimization="false" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDEDEBUGGER_EXPORTS" ExceptionHandling="1" RuntimeLibrary="0" StructMemberAlignment="1" BufferSecurityCheck="false" DefaultCharIsUnsigned="true" UsePrecompiledHeader="0" AssemblerOutput="1" WarningLevel="3" Detect64BitPortabilityProblems="false" DebugInformationFormat="3" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" AdditionalOptions="/SAFESEH:NO" LinkIncremental="1" GenerateManifest="false" IgnoreAllDefaultLibraries="true" GenerateDebugInformation="false" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" OptimizeForWindows98="1" LinkTimeCodeGeneration="0" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Source Files" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > <File RelativePath=".\HideDebugger.cpp" > </File> </Filter> <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > <File RelativePath=".\HideDebugger.h" > </File> </Filter> <Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" > <File RelativePath=".\HideDebugger.rc" > </File> </Filter> <File RelativePath=".\exsup.lib" > </File> <File RelativePath=".\OLLYDBG.LIB" > </File> </Files> <Globals> </Globals> </VisualStudioProject>
ага, это файл настроек проэкта насколько я понимаю? Нашел три файла с подобным синтаксисом WinMain.vcproj.SET.Admin.user WinMain.vcproj WinMain.exe.intermediate.manifest какой из них должен быть изменен? Что это за файлы я плохо себе представляю пока...
WinMain.vcproj но изменять лучше не вручную а через опции проекта в том что нужно настроить проект, отключить манифесты и прочая прочая
вобщем я создал отдельную папку, создал там файл 11.vcproj и записал в него твой код. Потом запустил его. Как я понял это файл настроек проэкта. ОТкрылась студия. Я увидел что ему нужен HideDebugger.cpp и создал его Код (Text): #include <windows.h> int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return 0;} откомпилилось отлично да только где теперь экзэшник новоспечённый искать непойму это раз и вот еще с чем немогу справится - разве эти настройки не разные для debug b release?
spencer а это проект для DLL Я не говорил что твой файл проекта должен быть в точности таким же Для экзешника нужно переобозначить точку входа #pragma comment(linker, "/ENTRY:start") и вместо main юзать void start() { ................. ExitProcess(0); } рантайм библу можно не отключать, если юзать некоторый ограниченный набор функций оттуда, например строковые, то это не особо увеличивает размер
разные, настройки для Debug почти по дефолту, кроме специфических которые требует OllyDbg при компиляции плагинов
Ну зачем для проектов в 100-200 строк использовать такие масштабные профессиональные комплексы разработки? В данном случае и 1% возможностей не задействовано. Да кому мешают 2-3кб в современном мире? Троянописателям только.
Основные причины большого веса пустой проги собранной со стандартными опциями: 1) Точка входа реально не WinMain, а WinMainCRTStartup. Ты думаешь, кто передает тебе параметры hInstance, hPrevInstance, lpCmdLine, nShowCmd? WinMainCRTStartup вызывает GetModuleHandleA, GetStartupInfo, GetCommandLineA, производит еще кучу действий, а уж потом вызывает WinMain. Изза этой кучи действий появляется "лишний" импорт из CRT. Не нравится - пиши /ENTRY:WinMain, только никаких аргументов её юзать будет нельзя и все получать вручную 2) Статическая линковка CRT. Не нравится - пиши /NODEFAULTLIB и линкуй с MSVCRT.LIB. Только придется таскать за собой DLL для тех, у кого её нету (хотя она есть почти везде). 3) Выравнивание секций на диске. Не нравится большое выравнивание - пиши /ALIGN:32 или какое-нибудь подобное маленькое. Минусы - если у тебя в файле несколько секций таких "маленьких", загрузчик при запуске пихнет их всех на одну страницу памяти (если влезет, конечно) и будут глюки с доступом. Хочется, чтобы секции друг друга не трогали - оставь выравнивание 4к 4) Можно совместить секции /MERGE:.data=.text и проч, только могут быть потом лаги по этому поводу, тут нужно действовать аккуратно. Вроде все.. ЗЫ. Это манифест называется. Используется для более аккуратного удовлетворения зависимостей. Отключается в опциях если не нужен
spencer C Runtime Library, он же просто рантайм. В Visual C++ этим заведует msvcrt.dll, msvcrВЕРСИЯ.dll, а так же статические libc*.lib. В никсах у гцц это libc.a. IceStudent Я не про объединение, а про сокращение выравнивания. Придется всем секциям, которые окажутся на одной странице, выставлять максимальные права. Я помню делал дллку, решил тоже - ну нафиг выравнивание 4к, 32 байт вполне хватит. А там была секция только для чтения одна. Я хз, что сделал линкер, но в итоге после загрузки DLL в память вся страница, где была эта секция и соседние, оказась с атрибутом PAGE_READONLY. В результате обращение к соседней секции на той же странице падало, хотя на диске ее атрибуты были RW. Так что если и снижать выравнивание секций, то смотреть как будут лежать секции в памяти и как использоваться, чтобы выдать им нужные права.. Либо надо както указать линкеру принудительно желаемый RVA для секции. В линкере от MS я хз как это сделать. не помню=\
Написание экстра-маленьких Win32 приложений на С++ от 1 КБ http://uinc.ru/articles/28/ и вот, в архиве http://dssoft.org.ua/Tiny.zip примеры проэктов приложений Win32 на 2КБ, MFC на 9КБ.