Наткнулся на статью "Проигрывание AVI файлов в OpenGL" http://pmg.org.ru/nehe/nehe35.htm и подумал а что если сделать прлеиер файлов только не добавлением ActveX Controla в диалог а минимальным открытием video файлов и отображением кадров в окно в общем то файлы играются только пока ещё без звука и не все . Ну со звуком ещё не разбирался ,а вот что не все показывают это другое вот программка Код (Text): #include<windows.h> // #include <vidguids.h> #include <KS.h> #include <KSMEDIA.h> #include <uuids.h> //#include <WiaDef.h> // #include <vfw.h> // #pragma comment( lib, "KSGuid.lib" ) #pragma comment( lib, "WiaGuid.lib" ) #pragma comment( lib, "Uuid.lib" ) // #pragma comment( lib, "vfw32.lib" ) HDC hDC; //HINSTANCE hThisInst; HINSTANCE dliagofd; HWND hWnd; // RECT Rect; HDRAWDIB hdd; // Дескриптор для нашего рисунка unsigned char* data = 0; AVISTREAMINFO psi; // Указатель на структуру содержащую информацию о потоке PAVISTREAM pavi; // Дескриптор для открытия потока PGETFRAME pgf; // Указатель на объект GetFrame BITMAPINFOHEADER bmih; // Заголовочная информация для DrawDibDraw декодирования long lastframe; // Последний кадр анимации int width; // Ширина видео int height; // Высота видео char *pdata; // Указатель на данные текстуры int mpf; // Сколько миллисекунд отображен кадр LONG frame; int ier=5; OPENFILENAME gofd; char fname[250]; // LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { PAINTSTRUCT ps; switch(msg) { case WM_CREATE: AVIFileInit(); //инициализируем библиотеку gofd.lStructSize=sizeof(OPENFILENAME); gofd.hwndOwner=hWnd; gofd.hInstance=dliagofd; gofd.lpstrFilter="video(*)\0*\0mpeg(*.mpeg)\0*.mpeg\0\0"; gofd.lpstrCustomFilter=NULL; gofd.nFilterIndex=0; gofd.lpstrFile=fname; gofd.nMaxFile=MAX_PATH; gofd.nMaxFileTitle=NULL; gofd.lpstrInitialDir=NULL; gofd.lpstrTitle="open video"; gofd.Flags= NULL; /*OFN_EXPLORER ; /*|OFN_FILEMUSTEXIST| OFN_HIDEREADONLY|OFN_LONGNAMES| OFN_PATHMUSTEXIST;*/ gofd.lpstrDefExt=NULL; //**********************// if(GetOpenFileNamePreview(&gofd)) // dialog вы бора файла { strcpy(fname,gofd.lpstrFile); ier=0; switch( AVIStreamOpenFromFile(&pavi,fname, streamtypeVIDEO ,0,OF_READ,NULL ) ) { case AVIERR_BADFORMAT: MessageBox(NULL," "," AVIERR_BADFORMAT",MB_OK); ier=1; break; case AVIERR_MEMORY: MessageBox(NULL," "," AVIERR_memory",MB_OK); ier=1; break; case AVIERR_FILEREAD: MessageBox(NULL," "," AVIERR_FILEREAD",MB_OK); ier=1; break; case AVIERR_FILEOPEN: MessageBox(NULL," "," AVIERR_FILEOPEN",MB_OK); ier=1; break; case REGDB_E_CLASSNOTREG: MessageBox(NULL," "," AVIERR_CLASSNOTREG",MB_OK); ier=1; break; } } if(ier==0) { AVIStreamInfo(pavi, ?, sizeof(psi)); // Записываем информацию о потоке в psi width=psi.rcFrame.right-psi.rcFrame.left; // Ширина = правая граница минус левая height=psi.rcFrame.bottom-psi.rcFrame.top;// Высота равна верх минус низ lastframe=AVIStreamLength(pavi); // Последний кадр потока // Вычисление приблизительных миллисекунд на кадр mpf=AVIStreamSampleToTime(pavi,lastframe)/lastframe; hdd = DrawDibOpen(); pgf=AVIStreamGetFrameOpen(pavi, NULL); frame=1; GetClientRect(hWnd,&Rect); SetTimer(hWnd,1,mpf,0); } break; case WM_DESTROY: if(ier==0){ DrawDibClose(hdd); // Closes The DrawDib Device Context AVIStreamGetFrameClose(pgf); // Deallocates The GetFrame Resources AVIStreamRelease(pavi); // Release The Stream } AVIFileExit(); ReleaseDC(hWnd, hDC); PostQuitMessage(0); break; case WM_TIMER: InvalidateRect(hWnd,NULL,FALSE); break; case WM_PAINT: hDC=BeginPaint(hWnd, &ps); if(ier==0){ frame=frame+1; if(frame==(lastframe-1)){ frame=0; }; LPBITMAPINFOHEADER lpbi; // Holds The Bitmap Header Information lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame); // Grab Data From The AVI Stream pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD); // Pointer To Data Returned By AVIStreamGetFrame // Convert Data To Requested Bitmap Format DrawDibDraw(hdd,hDC, 0, 0, Rect.right, Rect.bottom, lpbi, pdata, 0, 0, width, height, 0); } EndPaint(hWnd, &ps); break; case WM_SIZE: GetClientRect(hWnd,&Rect); break; default: return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str,int nWinMode) { MSG msg; WNDCLASS wcl; dliagofd=hThisInst; wcl.hInstance=hThisInst; wcl.lpszClassName = "OpenGLWinClass"; wcl.lpfnWndProc = WindowFunc; wcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wcl.hIcon = NULL; wcl.hCursor = LoadCursor(NULL,IDC_ARROW); wcl.lpszMenuName = NULL; wcl.cbClsExtra = 0; wcl.cbWndExtra = 0; wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); RegisterClass(&wcl); hWnd = CreateWindowEx(0,"OpenGLWinClass", "Win API Template", WS_OVERLAPPEDWINDOW , 0, 0, 700, 500, NULL, NULL, hThisInst, NULL); ShowWindow(hWnd,nWinMode); UpdateWindow(hWnd); while( GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } показывает avi и некоторые mpg,mpeg файлы а вот wmv вообще непоказывает AVIStreamOpenFromFile&pavi,fname,streamtypeVIDEO ,0,OF_READ,NULL) в статье "AVI в OPENGL" последний параметр этой функции был вуставлен в ноль (пусть система сама решает каким кодеком ей жевать файл) но при открытии некоторых файлов система выдаёт AVIERR_CLASSNOTREG(жевать файл нечем). дак я подумал а если подставить свой параметр (чтобы выбрать кодек ) ведь другие программы находят его. только что это за параметр я знаю очень приблизительно Вродибы это что то вроде ключа в реестре , и тогда какой функцией его приобразовать чтобы подставить за место нуля должно получиться вот это CLSID * pclsidHandler <font color="red]Модератор: длинный кодезь - аттачем. Читаем правила.</font><!--color-->