PDA

Просмотр полной версии : Native WIN API и MSVCR80.dll


/^scriptor$/
19.05.2009, 19:02
Пишу в Visual Studio 2005. Выбрал проект Win32 Application. Написал программу на голом вин апи. скомпил релиз, полез проверять на вирус тотал и оказалось, что моя прога юзает MSVCR80.dll
Какого [вырезано цензурой] дллка от фреймфорка линкуется вместе с моим вин32 приложением?
Если в настройках выбрать не использовать манифест файл, то прога не запускается.
Как с помощью VS 2005 скомпилить приложение, использующее только системные длл (не требующее фреймворка)?

Gar|k
19.05.2009, 19:34
тема просто боян...
писал я это в http://forum.antichat.ru/thread33202.html

для начала пропиши в файлике начале

#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment( linker, "/MERGE:.text=.data" )
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWR /IGNORE:4078")
#pragma comment(linker,"/ENTRY:New_WinMain")
#pragma comment(linker,"/NODEFAULTLIB")
#pragma comment(linker, "/SUBSYSTEM:WINDOWS" )
#pragma comment(linker, "/INCREMENTAL:NO" )
#pragma optimize( "gsy", on )

ругается на /FILEALIGN:512 /IGNORE:4078 нету таких типа...
обявление новой входной точки помогает избавится от ненужных дописок и проверок MS а вот /NODEFAULTLIB убивает напрочь иногда очень нужные функции типа там sprintf (их можно подрубить в ран-тайме? как?) ну и результаты клевые 1 кб ) пока минимальный мой экзешник... (правда еще куча настроек в проекте отключения манифеста выставления оптимизации кода /MT /GS- и тд.)


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

ну а самое главное чтобы отвязатся от DLL надо слинковать ее статически за это отвечает опция /MT - вместо /MD

Gar|k
19.05.2009, 19:42
чуть не забыл

void New_WinMain(){ExitProcess(0);}

/^scriptor$/
19.05.2009, 20:05
thanx, попробую

/^scriptor$/
19.05.2009, 20:49
ну а самое главное чтобы отвязатся от DLL надо слинковать ее статически за это отвечает опция /MT - вместо /MD

но ведь тогда дллка будет внутри ехе, а мне это не надо

Gar|k
19.05.2009, 21:02
в той длл лежат функции Си и CTR (вроде так называются) обявляя новую точку входа ты обходишь CTR обьявляя /NODEFAULTLIB ты отказываешься от всех стандартных библиотек Си и Си++

а /MT поможешь тебе с "переносимостью" твоих exe на другие компы.

если ты свои проги будешь писать с динамической подключалкой то тебе придется везде с собой таскать несколько DLL размером в ~500кб

потомучто у юзверев без уставновленого MSVCR80.dll твоя прога будет вылетать с сообщением "...переустановите программу..." бла бла (эта дллка кстати входит в какойто пак иногда видел наверно с играми тебе ставится чето типа vcredist_x86.exe и он весит не мало...)

slesh
19.05.2009, 21:23
Лезиш в свойства проекта. Общие свойства С/С++ И там Ставишь
Использовать MFC - использовать стандартные библиотеки Windows.
или ищи опцию - No Using MFC

Gar|k
19.05.2009, 23:14
2 slesh поверь это не спасает ) и юзать или не юзать mfc узказывается еще при создании проекта... а для вин приложений написаных с нуля это win32 empty project :)

беда мелкосовтовской студии много лишнего тот же CRT - это проверки на переполнение буффера и всякие другие заморочки... и просто так его отключить никак незя хех

/^scriptor$/
19.05.2009, 23:42
нашел решение.
// Параметры для минимизации размера 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 получаем слудующим образом:
HINSTANCE hInst = GetModuleHandleA(NULL);

Вместо функций srtlen и strcat юзам винапишные lsrtlen и lstrcat.

Вместо memset:
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:
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);
}
}

Gar|k
20.05.2009, 00:06
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);

давай че еще найдешь интересного сюда пиши! ) ибо я сам мало знаю

/^scriptor$/
20.05.2009, 00:37
забыл сказать, что когда юзаем самодельную dg_memcpy нужно отключить оптимизацию, а то умный компилятор заменит ее стандартной memcpy