Пишу в Visual Studio 2005. Выбрал проект Win32 Application. Написал программу на голом вин апи. скомпил релиз, полез проверять на вирус тотал и оказалось, что моя прога юзает MSVCR80.dll Какого [вырезано цензурой] дллка от фреймфорка линкуется вместе с моим вин32 приложением? Если в настройках выбрать не использовать манифест файл, то прога не запускается. Как с помощью VS 2005 скомпилить приложение, использующее только системные длл (не требующее фреймворка)?
тема просто боян... писал я это в http://forum.antichat.ru/thread33202.html для начала пропиши в файлике начале потом в настройке проекта надо поотробубать кучу всего.... я уже точно не помню потомучто для кажого проекта заново перенастраиваю ну а самое главное чтобы отвязатся от DLL надо слинковать ее статически за это отвечает опция /MT - вместо /MD
в той длл лежат функции Си и CTR (вроде так называются) обявляя новую точку входа ты обходишь CTR обьявляя /NODEFAULTLIB ты отказываешься от всех стандартных библиотек Си и Си++ а /MT поможешь тебе с "переносимостью" твоих exe на другие компы. если ты свои проги будешь писать с динамической подключалкой то тебе придется везде с собой таскать несколько DLL размером в ~500кб потомучто у юзверев без уставновленого MSVCR80.dll твоя прога будет вылетать с сообщением "...переустановите программу..." бла бла (эта дллка кстати входит в какойто пак иногда видел наверно с играми тебе ставится чето типа vcredist_x86.exe и он весит не мало...)
Лезиш в свойства проекта. Общие свойства С/С++ И там Ставишь Использовать MFC - использовать стандартные библиотеки Windows. или ищи опцию - No Using MFC
2 slesh поверь это не спасает ) и юзать или не юзать mfc узказывается еще при создании проекта... а для вин приложений написаных с нуля это win32 empty project беда мелкосовтовской студии много лишнего тот же CRT - это проверки на переполнение буффера и всякие другие заморочки... и просто так его отключить никак незя хех
нашел решение. Code: // Параметры для минимизации размера EXE-файла. #pragma comment(linker,"/MERGE:.rdata=.data") #pragma comment(linker,"/MERGE:.text=.data") #pragma comment(linker, "/SECTION:.text,EWR") #pragma comment(linker, "/NODEFAULTLIB") #pragma comment(linker, "/ENTRY:main") HINSTANCE получаем слудующим образом: Code: HINSTANCE hInst = GetModuleHandleA(NULL); Вместо функций srtlen и strcat юзам винапишные lsrtlen и lstrcat. Вместо memset: Code: void dg_memset(void* output, int value, int len) { if (len) { do { *(unsigned char*)output = (unsigned char)value; output = (void*)((unsigned int)output + 1); }while(--len != 0); } } memcpy: Code: void dg_memcpy(void* output, void* input, int len) { if (len) { do { *(unsigned char*)output = *(unsigned char*)input; input = (void*)((unsigned int)input + 1); output = (void*)((unsigned int)output + 1); } while (--len != 0); } }
memset(buff,0x00,buflen) = ZeroMemory memcpy - CopyMemory memset - FillMemory есть еще MoveMemory а ваще http://msdn.microsoft.com/en-us/library/aa909240.aspx строковые есть стандартные типа StrCpy а ваще http://msdn.microsoft.com/en-us/library/ms646979.aspx работа с файлами макросы есть f=_lcreat("d.txt", 0); _lwrite(f,(LPCCH)mem,4096); _lclose(f); давай че еще найдешь интересного сюда пиши! ) ибо я сам мало знаю
забыл сказать, что когда юзаем самодельную dg_memcpy нужно отключить оптимизацию, а то умный компилятор заменит ее стандартной memcpy