Native WIN API и MSVCR80.dll

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by /^scriptor$/, 19 May 2009.

  1. /^scriptor$/

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    Пишу в Visual Studio 2005. Выбрал проект Win32 Application. Написал программу на голом вин апи. скомпил релиз, полез проверять на вирус тотал и оказалось, что моя прога юзает MSVCR80.dll
    Какого [вырезано цензурой] дллка от фреймфорка линкуется вместе с моим вин32 приложением?
    Если в настройках выбрать не использовать манифест файл, то прога не запускается.
    Как с помощью VS 2005 скомпилить приложение, использующее только системные длл (не требующее фреймворка)?
     
  2. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    тема просто боян...
    писал я это в http://forum.antichat.ru/thread33202.html

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

    ну а самое главное чтобы отвязатся от DLL надо слинковать ее статически за это отвечает опция /MT - вместо /MD
     
    _________________________
    1 person likes this.
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    чуть не забыл

    void New_WinMain(){ExitProcess(0);}
     
    _________________________
  4. /^scriptor$/

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    thanx, попробую
     
  5. /^scriptor$/

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    но ведь тогда дллка будет внутри ехе, а мне это не надо
     
  6. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    в той длл лежат функции Си и CTR (вроде так называются) обявляя новую точку входа ты обходишь CTR обьявляя /NODEFAULTLIB ты отказываешься от всех стандартных библиотек Си и Си++

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

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

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

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Лезиш в свойства проекта. Общие свойства С/С++ И там Ставишь
    Использовать MFC - использовать стандартные библиотеки Windows.
    или ищи опцию - No Using MFC
     
  8. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 slesh поверь это не спасает ) и юзать или не юзать mfc узказывается еще при создании проекта... а для вин приложений написаных с нуля это win32 empty project :)

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

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    нашел решение.
    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);
      }
    }
     
  10. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    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);

    давай че еще найдешь интересного сюда пиши! ) ибо я сам мало знаю
     
    _________________________
  11. /^scriptor$/

    /^scriptor$/ New Member

    Joined:
    11 Apr 2009
    Messages:
    8
    Likes Received:
    0
    Reputations:
    0
    забыл сказать, что когда юзаем самодельную dg_memcpy нужно отключить оптимизацию, а то умный компилятор заменит ее стандартной memcpy