1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Soft Заменить NT Virtual Dos Machine на DosBox

Тема в разделе "Hard & Soft", создана пользователем myhouse_1991, 22 авг 2010.

  1. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    В общем стоит Windows XP SP3, задача состоит в том, что нужно заменить встроенный эмулятор NT Virtual Dos Machine (Windows on Windows) на DosBox. Потому как я никогда не использую встроенный эмулятор, а кликать постоянно правой кнопкой мыши и использовать SendTo не очень удобно. Нагуугливал часами, ничего толкового не нашёл. Может быть есть умельцы, которые смогли это сотворить, но при этом не опубликовали статью? Своими руками не получилось.
    Что я пытался сделать:
    1) Шёл по ветке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WOW, изменял cmdline и wowcmdline на "C:\Program Files\DosBox\DOSBox.exe" "%1". Не сработало.
    2) Заменил ntvdm.exe и wowexec.exe на DosBox.exe - не сработало (на счёт Windows File Protection говорить не надо, я это учёл).
     
    Последнее редактирование: 22 авг 2010
    Newbilius нравится это.
  2. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Тема забавная, но вряд ли пройдёт на XP, с большой вероятностью ты все exe на досбокс переведёшь. Выход - надо делать переходник и ассоциировать его с exe как вирусы делают. Программка на пять минут чтобы по заголовку PE отсылала на CreateProcess , либо на досбокс через аргументы.
     
    myhouse_1991 нравится это.
  3. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    А чем забавляет? :)
    Мне вот нравится рендер HQ2X/HQ3X в консоле, очень приятно в 16-битных языках программирования работать, даже ClearType отдыхает ;)

    Меня вот забавляет то, что по-умолчанию команда открытия EXE файла в ключе HKEY_CLASSES_ROOT\exefile\shell\open\command идёт как "%1" %* т.е. EXE файл открывает самого же себя :)

    Ну ладно, попробую так. Я в Delphi больше всего работал, но он кучу лишнего мусора добавит после компиляции :(
     
  4. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Понятно, ты быдлошкольник который даже делфи не осилил. Лучше не трогай тогда...
     
  5. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    Ну это ещё почему? Загрузочный диск и загрузочная флешка всегда под рукой, я знаю, что делаю и реестр довольно долго изучал.

    1) Бывший.
    2) У меня не так много времени, чтобы сидеть и изучать вплоть до 100% (с учётом того, что под делфи вагон и маленькая тележка дополнительных компонентов). Сделать я уже смогу, но вот как лучше сделать так, чтобы съедало как можно меньше ОЗУ и была достаточно быстрой... Читал об KOL для делфи, но не пробовал.
     
  6. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Вот когда поймёшь что KOL и VCL тут слева как и язык в принципе(приведён для примера) - тогда и будешь рангом чуть выше, а пока что бывших не бывает, это образ мышления.
     
  7. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    Идёт намек на ассемблер или на 010101? Я, конечно, понимаю, что говоря напрямую на языке ЭВМ можно написать программу намного лучше, чем на языке высокого уровня, но для этого нужно знать инструкции процессора (причем они менялись) и различные хитрости. Ассемблер меня смутил тем, что переносимость у него нулевая и требует очень много времени, чего у меня просто нет... Да и я бы не мучился со всеми этими языками, если бы знал, какую последовательность байтов (0-FF) вводить, чтобы достичь нужного мне эффекта.

    Впрочем, тема уже пошла не в ту сторону...
     
    Последнее редактирование: 22 авг 2010
  8. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Идёт намёк на WINAPI, на чём совершенно неважно равно как и ничего не тянет из компонентов ни в каком языке/IDE. Плюс мелкий кусок алгоритма определения DOS/WIN EXE, это по PE заголовку который хорошо документирован.

    ---------- Сообщение добавлено в 19:53 ---------- Предыдущее сообщение размещено в 19:04 ----------

    Скелет набросал кстати быстро, но тестировать и дописывать увольте.

    Код:
    program DOSBOXLoader;
    
    uses
      SysUtils,Windows;
    
    var
    c:integer;
    ftype:cardinal;
    cmdline:string='';
    dosbox:string='c:\dosbox\dosbox.exe';
    
    h:_PROCESS_INFORMATION;
    a:_STARTUPINFOW;
    
    
    begin
    try
    if ParamCOunt>0 then begin
    GetBinaryType(Pchar(ParamStr(1)),ftype);
    if ParamCount>1 then for c := 2 to ParamCount() - 1 do cmdline:=cmdline+ParamStr(c)+' ';
    
    if ftype=SCS_32BIT_BINARY then CreateProcess(Pchar(ParamStr(1)),Pchar(cmdline),NIL,NIL,False,0,NIL,Pchar(ExtractFileDir(ParamStr(1))),a,h) else
    if ftype=SCS_DOS_BINARY then CreateProcess(Pchar(dosbox),Pchar('-conf c:\dosbox\dosbox.conf -exit -c "mount c c:\" -c "mount d x:\ -cdrom" -c "cd '+ExtractFileDir(ParamStr(1))+'" -c "'+paramstr(1)+'"'),NIL,NIL,False,0,NIL,Pchar(ExtractFileDir(ParamStr(1))),a,h);
    
    end;
    
      except
        on E:Exception do
          Writeln(E.Classname, ': ', E.Message);
      end;
    end.
    
     
  9. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    Я уже это сделал после вашего первого ответа (но так как пошли всякие разборки - забыл об этом сказать), но в любом случаи спасибо. Также для себя добавил загрузку дополнительных параметров из ini файла.

    Свой test.exe поместил в C:\Windows. В реестре изменил ключ HKEY_CLASSES_ROOT\exefile\shell\open\command на "test.exe" "%1". В итоге работает.
     
  10. DangeonMaster

    DangeonMaster

    Регистрация:
    27 июн 2007
    Сообщения:
    44
    2 myhouse_1991
    Результатом поделитесь? Тоже хочу потестить...
     
  11. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Кстати %1 это фэйл 100%. Учим матчасть, даже у меня в example сделано %*
     
  12. _Dominus_

    _Dominus_

    Регистрация:
    21 сен 2008
    Сообщения:
    411
    ИМХО, бредовая затея. О каком Delphi и API может идти речь, если гражданин cli не осилил?
    Хотя поп корном и колой запасся =)
     
  13. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Какой на хрен cli, ты ещё бреда добавил...
     
  14. _Dominus_

    _Dominus_

    Регистрация:
    21 сен 2008
    Сообщения:
    411
    del
     
    Последнее редактирование: 23 авг 2010
  15. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    Я прекрасно понимаю, что используя такой замещающий параметр, то не будут передаваться дополнительные параметры.

    Да и вообще что вы на меня так набросились 0_o (вот первый ответ на вопрос как раз то, что нужно - неужели нужно выяснение отношений кто кого умнее)? Ну да, я новенький на форуме, но и не совсем глупый, как вы меня представляете... Можете сделать лучше - пожалуйста, только можно обойтись с демонстрацией своих "мускул"?

    И если это возможно - удалите все сообщения кроме первых двух (мой вопрос и ответ), ибо всё остальное не имеет смысловой нагрузки... А если удобней всего удалить тему - пожалуйста, но для других, которые ищут подобное через поисковик, быть может такая информация бы пригодилась...

    Такое ощущение, что как-будто я всех заставляю это делать? Нравится встроенный эмулятор - пользуйся, я же не запрещаю, а мне он не нужен.
     
    Последнее редактирование: 24 авг 2010
  16. _Dominus_

    _Dominus_

    Регистрация:
    21 сен 2008
    Сообщения:
    411
    myhouse_1991, я ж сказал - ИМХО - сугубо мое мнение. Ты не кипятись. :)
     
  17. Newbilius Программуль

    Newbilius

    Регистрация:
    24 авг 2007
    Сообщения:
    4.607
    myhouse_1991, создай тему в мастерской и выложи там. Отличная идея. Ибо если у вас 64-битная ОС, то для запуска DOS-игрушек подходит исключительно эмуляторы.
     
  18. John Freeman

    John Freeman

    Регистрация:
    13 май 2004
    Сообщения:
    14.241
    Вот с проблемой загрузки таким образом 64битников я ещё не парился, но createprocess скорее всего не прокатит если лоадер не той битности что приложение. ShellExecute/ex явно не прокатит же по причине петли.
     
  19. myhouse_1991

    myhouse_1991

    Регистрация:
    22 авг 2010
    Сообщения:
    71
    Проблема получается такая, что у меня не 64 битная ОС и проверить у себя невозможно да и переписывать тогда лучше на C++, чтобы переносимость с одной ОС на другую ОС (точнее разрядности) улучшить и не мучится с проблемами Delphi.

    Из альтернативы можно попробовать сделать следующее - поменять расширение файла с EXE на COM (DOSBox не жалуется на наличие заголовка и беспредельного размера) и в ассоциациях COM файла поменять на запуск с помощью DOSBox'а с нужными вам параметрами.

    Точнее эмуляторы сторонних производителей, а то получается, что 32 битная система как-будто напрямую умеет с 16 битными приложениями работать...

    Можно попробовать посылать консольные команды, что-то вроде start <Параметры> или чистую копию "Выполнить" rundll32.exe shell32.dll, ShellExec_RunDLL <Параметры> (только в 64 битной системе будет rundll64.exe и shell64.dll, но, думаю, функция в той DLL под названием ShellExec_RunDLL сохранится). Хотя в любом случаи лучше компилировать приложение под 64 бита и дописывать код с определением SCS_64BIT_BINARY.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление