Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Native WIN API и MSVCR80.dll (https://forum.antichat.xyz/showthread.php?t=121401)

/^scriptor$/ 19.05.2009 19:02

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

Gar|k 19.05.2009 19:34

тема просто боян...
писал я это в http://forum.antichat.ru/thread33202.html

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

Сообщение от Gar|k
#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

Цитата:

Сообщение от Gar|k
ну а самое главное чтобы отвязатся от 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);

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


Время: 17:49