Требуется воспроизвести swf-файл из ресурсов exe. Проблема в том, что в ActiveX контрол нужно передавать имя файла. Код (Text): ;esi = 0 invoke FindResource,400000h,a,a push esi push Bufer push eax invoke SizeofResource,400000h,eax xchg eax,[esp] mov ebx,eax invoke LoadResource,400000h,eax push eax invoke CreateNamedPipe,flashpipe,PIPE_ACCESS_OUTBOUND+FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE+PIPE_READMODE_BYTE+PIPE_WAIT,1,ebx,ebx,10000,esi mov ebx,eax xorps xmm0,xmm0 movups dqword[Bufer],xmm0 invoke CreateEvent,esi,esi,esi,esi mov [Bufer+16],eax invoke WaitNamedPipe,flashpipe,10000 invoke ConnectNamedPipe,ebx,Bufer invoke WriteFile,ebx cominvk Flash,Set_Movie,flashpipe;gamefile invoke CloseHandle,ebx В этом коде ConnectNamedPipe завершается с ошибкой.
возможно хэндл который вернула CreateNamedPipe, и который ты закопил в ebx уже потерли до вызова ConnectNamedPipe, сохрани его в стек
Взял пример попроще - воспроизведение mid файла из ресурсов. Код (Text): ................ invoke FindResourceA,400000h,a,a push eax invoke SizeofResource,400000h,eax mov [ressize],eax invoke LoadResource,400000h mov [res],eax invoke CreateNamedPipeW,muspipe,PIPE_ACCESS_DUPLEX,0,1,[ressize],[ressize],10000,0 mov [pipe],eax invoke CreateFileW,muspipe,GENERIC_WRITE,0,0,OPEN_ALWAYS,0,0 push eax invoke WriteFile,eax,[res],[ressize],Bufer,0 invoke CloseHandle invoke mciSendStringW,musicres,esi,esi,esi test eax,eax je noerror invoke mciGetErrorStringA,eax,Bufer,256 invoke MessageBoxA,0,Bufer,0,0 noerror: ........................ a db 'A',0 musicres dw 'p','l','a','y',' ' muspipe dw '\','\','.','\','p','i','p','e','\','A','.','M','I','D',0 mciSendStringW Сообщает о том, что файл не найден.
Непонятно зачем вызывать то юникод то анси версии функций, даже если так и задумано то при вызове mciSendStringW регистр esi непонятно что содержит, и musicres не терминирована нулем. Про второй параметр mciSendString в МСДН написано "Pointer to a buffer that receives return information. If no return information is needed, this parameter can be NULL." - указатель на буфер в который вернется некая информация, если она ненужна передавать нуль.
defaultplayer Imho esi содержит 0 (см #1), а musicres содежит нультерминированую L"play \\.\pipe\a.mid".
Изначально хотел воспроизвести Flash-ролик из ресурсов, а в ActiveX-контрол нужно передавать unicode строки. Потом, когда не получилось, решил попробовать тоже самое с миди и чтобы не менять строки поменял функции. А вобще не люблю я unicode и везде, где возможно стараюсь применять ansi. musicres и musicpipe нужно воспринимать как одно целое Изначально там содержится ноль, но в связи с постом #2 я решил все нули передавать константами. Переосмыслив NamedPipe`ы я подумал, что нужно делать так: 1) Создаём пайп 2) Запускаем поток с функцией чтения из пайпа 3) выполняем ConnectNamedPipe в основном потоке 4) выполняем writeFile в основном потоке При этом функция чтения из файла (mciSendString) в дополнительном потоке должна быть автоматически синхронизирована с функцией WriteFile в основном потоке. Код (Text): invoke FindResourceA,400000h,a,a push eax invoke SizeofResource,400000h,eax mov [ressize],eax invoke LoadResource,400000h mov [res],eax invoke CreateNamedPipeW,muspipe,PIPE_ACCESS_DUPLEX,PIPE_TYPE_BYTE+PIPE_READMODE_BYTE+PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,[ressize],[ressize],NMPWAIT_USE_DEFAULT_WAIT,0 mov [pipe],eax invoke CreateThread,0,0,LoadMidi,0,0,Bufer invoke ConnectNamedPipe,[pipe],0 invoke WriteFile,[pipe],[res],[ressize],Bufer,0 ........... LoadMidi: invoke mciSendStringW,musicres,0,0,0 test eax,eax jne LoadMidi invoke MessageBoxA,0,0,0,0 ret a db 'A',0 musicres dw 'p','l','a','y',' ' muspipe dw '\','\','.','\','p','i','p','e','\','A','.','M','I','D',0 Поток LoadMidi входит в бесконечный цикл, т.к. mciSendString не находит файл. ConnectNamedPipe успешно завершается. WriteFile выдаёт ошибку.
ясно, неразобрался просто в функции до конца только что переписал код на масм, у меня WriteFile завершается с TRUE, тоесть все нормально (код если надо могу запостить), а вот mciSendString нивкакую нехочет играть. Пишут что вроде у нее с пробелами в путях проблемы, хз только чего сейчас не играет
Видимо mciSendString содержит внутреннюю проверку на корректность адреса. Хотя такого не должно быть т.к. CreateFile в этом не нуждается. В любом случае надо попробовать с другими функциями (ShellExecute например)