Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > программа как результат работы моего приложения


Автор: gambit 11.1.2011, 01:42
привет. Интересует такой вопрос. Например WinRAR создает самораспоковывающийся архив, фактически это программа. Вот как он его создает, он компилирует на ходу, или из ресурсов берет шаблон exe файла или как? И как подобное реализовать самому. Что бы например я ввожу в textbox, слово "ыврапывра", нажимаю сохранить, сохранялся exe, при запуске которого открывалась форма, и на ней было в label написано - "ыврапывра"

Автор: mrbrooks 11.1.2011, 11:38
Цитата(gambit @  11.1.2011,  01:42 Найти цитируемый пост)
Что бы например я ввожу в textbox, слово "ыврапывра", нажимаю сохранить, сохранялся exe, при запуске которого открывалась форма, и на ней было в label написано - "ыврапывра"

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

Цитата(gambit @  11.1.2011,  01:42 Найти цитируемый пост)
Например WinRAR создает самораспоковывающийся архив, фактически это программа

он сжимает данные и помещает их в простой инсталлятор (возможно свой, возможно нет)

Автор: jonie 11.1.2011, 13:50
Цитата(mrbrooks @  11.1.2011,  11:38 Найти цитируемый пост)

он сжимает данные и помещает их в простой инсталлятор (возможно свой, возможно нет) 

все проще. У него в инсталяционной папке лежат эти самые распаковщики. вин рар тупо делает архив, и приклеивает его оверлеем к exe-шке (т.е. тупо записывает в конец).
Exe при запуске вычисляет свой размер по PE заголовку и распоковывает архив.

вот как получить свой размер:
Код

DWORD CScriptInstaller::getSelfSize()
{
    DWORD result = 0;
    char* pself = reinterpret_cast<char*>(hInst);
    pself += PIMAGE_DOS_HEADER(pself)->e_lfanew + sizeof(DWORD);
    int numSections = PIMAGE_FILE_HEADER(pself)->NumberOfSections;
    pself += sizeof(IMAGE_FILE_HEADER) + sizeof(IMAGE_OPTIONAL_HEADER);

    for(int i=0;i<numSections;++i)
    {
        PIMAGE_SECTION_HEADER ps = reinterpret_cast<PIMAGE_SECTION_HEADER>(pself);
        if(ps->PointerToRawData + ps->SizeOfRawData > result)
        {
            result = ps->PointerToRawData + ps->SizeOfRawData;
        }

        pself += sizeof(IMAGE_SECTION_HEADER);
    }

    return result;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)