Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции в WIN через DOS приложение 
:(
    Опции темы
Robus
  Дата 15.12.2005, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1





Привет всем !


Написана программа под DOS-PM на асме с использованием DPMI и экзотическим программированием видеокарты. Велеколепно работает под все виндовсы. Мне нужно вызвать на заднем плане виндошный EXE или DLL, оставив его как резидент. И каким-нибудь образом передавать данные из DOS приложения. Под DOS это просто, например вешаемся на INT, а тм дело техники. Как что-то подобное сделать под WIN ? Хотелось бы иметь просто программу, без всяких установок в виде драйвера, не буду же я просить пользователя что-то там прописать в INI в винде !

Например в Impulse Tracker'е, есть подобноерешение проблемы. В какой-то версии на заднем плане запускается программа, которая проигрывает всё, что ей посылает IT. Получается IT, под любые звуковые карты понятные винде. Мне нужно подобное !

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

Спасибо за помощь.
PM MAIL   Вверх
SergeCpp
Дата 16.12.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Я делаю такие штуки через файл...

Вот тут исходник виндовый

(CRC вычисляет виндовая прога, а запросы ей даёт Multi-Edit для DOS)

В ДОСе аналогично

Вот Multi-Edit для DOS — можно попробовать

Вот тут исходники макросов Multi-Edit

200 обменов в секунду у меня

Вот ДОСовский макрос

Код

global
{
  int ~crc_io;
}

// using direct CRC.EXE call

str _file_crc( str pathname[ 128 ] ) trans2
{
  if( ~crc_io )
  {
    return ( _file_crc_calc( pathname ) );
  }

  //

  int _ri         = return_int;
  str _rs[ 2048 ] = return_str;

  int _fsa        = file_search_attr;
  str _fsr [ 48 ] = file_search_rec;

  rm( "TMP_FILE_NAME /FN=CRC.TMP" );

  str o_crc[ 80 ] = return_str;

  return_str      = me_path + "UTIL\\CRC.EXE " + pathname;
                     // 16 K
  rm( "MEUTIL^EXEC /MEM=1024/CURSOR=1/REDERR=STDOUT/RED=" + o_crc );

  str crc   [ 8 ];

  if( error_level )
  {
      error_level = 0;
  }
  else
  {
    crc = _file_str( o_crc, 0, 8 );
  }

  file_search_rec  = _fsr;
  file_search_attr = _fsa;

  return_int       = _ri;
  return_str       = _rs;

  return ( crc );
}

// using CRC.EXE as server

int _file_crc_load() trans
{
  if( ~crc_io )
  {
    return ( ~crc_io );
  }

  //

  int _ri         = return_int;
  str _rs[ 2048 ] = return_str;

  int _fsa        = file_search_attr;
  str _fsr [ 48 ] = file_search_rec;

  rm( "TMP_FILE_NAME /FN=CRC.TMP" );

  str io   [ 80 ] = return_str;

  //

  int h;

  if( s_open_file( io, 0x42, h ) != ZERO )
  {
    if( s_create_file( io, h ) != ZERO )
    {
      goto EXIT_0;
    }

    s_close_file( h );

    if( s_open_file( io, 0x42, h ) != ZERO )
    {
      goto EXIT_0;
    }
  }

  //

  int num;

  if( ( s_write_bytes( '|0', h, num ) == 0 ) & ( num == 1 ) )
  {
    str exec_mem[  4 ];
    str exec_crc[ 80 ] = me_path + "UTIL\\CRC.EXE :" + io;

    if( win_nt() )
    {
      rm( "TMP_FILE_NAME /FN=CRC.CMD" );

      _file_new( return_str, "@echo off" \
                             "\r\n"      \
                             "start /B " + exec_crc );

      return_str = get_path( comspec ) + "CMD.EXE /C " + return_str;
      exec_mem   = "4096"; // 64 K
    }
    else
    {
      return_str = exec_crc;
      exec_mem   = "1024"; // 16 K
    }

    rm( "MEUTIL^EXEC /MEM=" + exec_mem +
                    "/CURSOR=1/REDERR=STDOUT/RED=NUL" );
                    //
                    // cursor appears temporarily
                    // because of FreeConsole() (seemingly)

    ~crc_io    = h;
    goto EXIT;
  }

  s_close_file( h );

  //

EXIT_0:
  h                = 0;

EXIT:
  file_search_rec  = _fsr;
  file_search_attr = _fsa;

  return_int       = _ri;
  return_str       = _rs;

  return ( h );
}

void _file_crc_free() trans
{
  int h = ~crc_io;

  if( h )
  {
    int num;

    s_move_file_ptr(       h, 0, 0 );
    s_write_bytes  ( '|1', h, num  );
    s_close_file   (       h       );

    ~crc_io = 0;
  }
}

str _file_crc_calc( str pathname[ 128 ] ) trans2
{
  int  h = ~crc_io;

  if( !h )
  {
    // loading here (even if it is occurs once)
    // substantially slows down CRC loops
    //
    // CRC.EXE server should be loaded separately - outside CRC loop
    // but possibility included - to be used measuredly

    if( !( h = _file_crc_load() ) ) // assignment
    {
      return ( "" );
    }
  }

  //

  _oem2ansi      ( pathname );

  int num;

  s_move_file_ptr( h, 0, 1 );
  s_write_bytes  ( pathname, h, num );

  s_move_file_ptr( h, 0, 0 );
  s_write_bytes  ( char( svl( pathname ) + 1 ), h, num );

  /*
  DELAY_1MS;  // slower than w/o (tested on 40 K files)
  */

  /*
  SLICE_FREE; // slower than w/o (tested on \ME\ check)
  */

  //

  str s[ 9 ];

  do
  {
    s_move_file_ptr( h, 0, 0 );
    s_read_bytes   ( s, h, 9 );
  }
  while( ascii( str_char( s, 1 ) ) );

  return ( str_del( s, 1, 1 ) );
}


Это сообщение отредактировал(а) SergeCpp - 16.12.2005, 10:12
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 16.12.2005, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 2
Всего: 34



по другому имхо никак
дос прога в винде работает скажем так в эмуляторе и виндовса для нее как бы не сушествует

п.с.
хотя при загрузке файлом (досовских) винда их анализирует
был гдето пример в инете как дос-сом файл закрывал сессию винды log off делал
но там какието замарочки с вызовом других апи так что трюк можно отнести к грязным хакам )


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 16.12.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Если Win9x, то можно через VxD работать — у Ральфа Брауна есть в Списке Прерываний...

Для NT-based не знаю...

PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 16.12.2005, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 3
Всего: 18



Цитата
Для NT-based не знаю...


Тоже есть - через специальным образом оформленные вызовы исключения UD. Топик валялся на wasm.ru, есть статья где-то...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.