Именованый пайп

Тема в разделе "WASM.WIN32", создана пользователем murder, 12 сен 2008.

  1. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Требуется воспроизвести swf-файл из ресурсов exe. Проблема в том, что в ActiveX контрол нужно передавать имя файла.

    Код (Text):
    1.  
    2.  ;esi = 0
    3.   invoke  FindResource,400000h,a,a
    4.   push    esi
    5.   push    Bufer
    6.   push    eax
    7.   invoke  SizeofResource,400000h,eax
    8.   xchg    eax,[esp]
    9.   mov     ebx,eax
    10.   invoke  LoadResource,400000h,eax
    11.   push    eax
    12.   invoke  CreateNamedPipe,flashpipe,PIPE_ACCESS_OUTBOUND+FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE+PIPE_READMODE_BYTE+PIPE_WAIT,1,ebx,ebx,10000,esi
    13.   mov     ebx,eax
    14.   xorps   xmm0,xmm0
    15.   movups  dqword[Bufer],xmm0
    16.   invoke  CreateEvent,esi,esi,esi,esi
    17.   mov     [Bufer+16],eax
    18.   invoke  WaitNamedPipe,flashpipe,10000
    19.   invoke  ConnectNamedPipe,ebx,Bufer
    20.   invoke  WriteFile,ebx
    21.   cominvk Flash,Set_Movie,flashpipe;gamefile
    22.   invoke  CloseHandle,ebx
    В этом коде ConnectNamedPipe завершается с ошибкой.
     
  2. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    возможно хэндл который вернула CreateNamedPipe, и который ты закопил в ebx уже потерли до вызова ConnectNamedPipe, сохрани его в стек
     
  3. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Взял пример попроще - воспроизведение mid файла из ресурсов.

    Код (Text):
    1. ................
    2.  
    3.   invoke  FindResourceA,400000h,a,a
    4.   push    eax
    5.   invoke  SizeofResource,400000h,eax
    6.   mov     [ressize],eax
    7.   invoke  LoadResource,400000h
    8.   mov     [res],eax
    9.   invoke  CreateNamedPipeW,muspipe,PIPE_ACCESS_DUPLEX,0,1,[ressize],[ressize],10000,0
    10.   mov     [pipe],eax
    11.   invoke  CreateFileW,muspipe,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0
    12.   push    eax
    13.   invoke  WriteFile,eax,[res],[ressize],Bufer,0
    14.   invoke  CloseHandle
    15.   invoke  mciSendStringW,musicres,esi,esi,esi
    16.   test    eax,eax
    17.   je      noerror
    18.   invoke  mciGetErrorStringA,eax,Bufer,256
    19.   invoke  MessageBoxA,0,Bufer,0,0
    20.   noerror:  
    21.  
    22. ........................
    23.  
    24. a                               db 'A',0
    25. musicres                     dw 'p','l','a','y',' '
    26. muspipe                      dw '\','\','.','\','p','i','p','e','\','A','.','M','I','D',0
    mciSendStringW Сообщает о том, что файл не найден.
     
  4. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Непонятно зачем вызывать то юникод то анси версии функций, даже если так и задумано то при вызове mciSendStringW регистр esi непонятно что содержит, и musicres не терминирована нулем. Про второй параметр mciSendString в МСДН написано "Pointer to a buffer that receives return information. If no return information is needed, this parameter can be NULL." - указатель на буфер в который вернется некая информация, если она ненужна передавать нуль.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    defaultplayer
    Imho esi содержит 0 (см #1), а musicres содежит нультерминированую L"play \\.\pipe\a.mid".
     
  6. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Изначально хотел воспроизвести Flash-ролик из ресурсов, а в ActiveX-контрол нужно передавать unicode строки. Потом, когда не получилось, решил попробовать тоже самое с миди и чтобы не менять строки поменял функции. А вобще не люблю я unicode и везде, где возможно стараюсь применять ansi.

    musicres и musicpipe нужно воспринимать как одно целое

    Изначально там содержится ноль, но в связи с постом #2 я решил все нули передавать константами.

    Переосмыслив NamedPipe`ы я подумал, что нужно делать так:
    1) Создаём пайп
    2) Запускаем поток с функцией чтения из пайпа
    3) выполняем ConnectNamedPipe в основном потоке
    4) выполняем writeFile в основном потоке

    При этом функция чтения из файла (mciSendString) в дополнительном потоке должна быть автоматически синхронизирована с функцией WriteFile в основном потоке.

    Код (Text):
    1.   invoke  FindResourceA,400000h,a,a
    2.   push    eax
    3.   invoke  SizeofResource,400000h,eax
    4.   mov     [ressize],eax
    5.   invoke  LoadResource,400000h
    6.   mov     [res],eax
    7.   invoke  CreateNamedPipeW,muspipe,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE+PIPE_READMODE_BYTE+PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,[ressize],[ressize],NMPWAIT_USE_DEFAULT_WAIT,0
    8.   mov     [pipe],eax
    9.   invoke  CreateThread,0,0,LoadMidi,0,0,Bufer
    10.   invoke  ConnectNamedPipe,[pipe],0
    11.   invoke  WriteFile,[pipe],[res],[ressize],Bufer,0  
    12.  
    13. ...........
    14.  
    15. LoadMidi:
    16.   invoke  mciSendStringW,musicres,0,0,0
    17.   test    eax,eax
    18.   jne     LoadMidi
    19.   invoke  MessageBoxA,0,0,0,0
    20. ret
    21.  
    22. a                               db 'A',0
    23. musicres                     dw 'p','l','a','y',' '
    24. muspipe                      dw '\','\','.','\','p','i','p','e','\','A','.','M','I','D',0
    Поток LoadMidi входит в бесконечный цикл, т.к. mciSendString не находит файл.
    ConnectNamedPipe успешно завершается.
    WriteFile выдаёт ошибку.
     
  7. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    ясно, неразобрался просто в функции до конца

    только что переписал код на масм, у меня WriteFile завершается с TRUE, тоесть все нормально (код если надо могу запостить), а вот mciSendString нивкакую нехочет играть. Пишут что вроде у нее с пробелами в путях проблемы, хз только чего сейчас не играет
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Видимо mciSendString содержит внутреннюю проверку на корректность адреса. Хотя такого не должно быть т.к. CreateFile в этом не нуждается.

    В любом случае надо попробовать с другими функциями (ShellExecute например)