Что нового

Создать объект DirectShow на форме

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Посмотрел пример на оф.форуме как можно написать проигрыватель с помощью кодека DirectShow, но без AutoItObject.dll скрипт не работает, как можно создать объект не использую данную dll, поискал инфу по ActiveX в нэте, везде пишут про GUID ни какого упоминания нет о например "Microsoft.DirectShow" , не хочется с лишним грузом таскатся.

И в библиотеке WinAPI/WinAPIEx всего 2 функции по работе с GUID может и больше (искал по маске GUID)

DirectShow Player
AutoItObject.rar
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
В бесконечных поисках по реестру нашёл как его вставить, теперь назрел вопрос, как воспроизвести файл, где можно посмотреть команды?

Код:
$oDirectShow = ObjCreate("DShowPreview.VideoPreview.1")
$hForm = GUICreate("", 500, 400)
$ActiveX = GUICtrlCreateObj($oDirectShow, 10, 10, 480, 300)
GUISetState()

With $oDirectShow
	.LoadMove(@ScriptDir & "\Andrea - Dokrai.mp4")
EndWith

While True
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd




Добавлено:
Сообщение автоматически объединено:

Может кому пригодится:

Код:
adbanner.adbanner.1
ADCCtl.ADCCtl.1
Agent.Control.2
ASControls.InstallEngineCtl.1
AUDIOCONTROLS2.AxisCtrl.1
AUDIOCONTROLS2.CurveEditCtrl.1
AUDIOCONTROLS2.KnobCtrl.1
AUDIOCONTROLS2.LEDMeterCtrl.1
AUDIOCONTROLS2.LevelSliderCtrl.1
AVP.AVPAboutView.1
AXIS.AxisCtrl.1
CompatUI.ProgView.1
CompatUI.SelectFile.1
COMSNAP.COMNSView.1
Control.TaskSymbol.1
COVEREDCTRL.CoverEdCtrl.1
CTREEVIEW.CTreeViewCtrl.1
DHTMLEdit.DHTMLEdit.1
DHTMLSafe.DHTMLSafe.1
DirectAnimation.DirectAnimationIntegratedMediaControl.1
DirectAnimation.DirectAnimationWindowedIntegratedMediaControl.1
DirectAnimation.PathControl
DirectAnimation.SequencerControl
DirectAnimation.SpriteControl
DirectAnimation.StructuredGraphicsControl
DShowPreview.VideoPreview.1
EFFECTCTRL.EffectCtrl.1
FlashFactory.FlashFactory.1
Forms.CheckBox.1
Forms.ComboBox.1
Forms.CommandButton.1
Forms.Frame.1
Forms.Image.1
Forms.Label.1
Forms.ListBox.1
Forms.MultiPage.1
Forms.OptionButton.1
Forms.ScrollBar.1
Forms.SpinButton.1
Forms.TabStrip.1
Forms.TextBox.1
Forms.ToggleButton.1
FPDTC.LINKBAR.1
FPDTC.LISTVIEW.1
gotobar.gotobar.1
HtmlDlgHelper.HtmlDlgHelper.1
ImagXpr5.ImagXpress.1
InetCtls.Inet.1
Internet.HHCtrl.1
LEDMETER.LEDMeterCtrl.1
ListPad.ListPad.1
LM.LMReader.1
Microsoft.ActiveXPlugin.1
Microsoft.TSHOOTCtrl.3.1
MigrationWizard.OOBE.1
MMC.IconControl.1
MMCCtrl.MMCCtrl.1
MSComCtl2.Animation.2
MSComCtl2.DTPicker.2
MSComCtl2.FlatScrollBar.2
MSComCtl2.MonthView.2
MSComCtl2.UpDown.2
MSComctlLib.ImageComboCtl.2
MSComctlLib.ImageListCtrl.2
MSComctlLib.ListViewCtrl.2
MSComctlLib.ProgCtrl.2
MSComctlLib.SBarCtrl.2
MSComctlLib.Slider.2
MSComctlLib.TabStrip.2
MSComctlLib.Toolbar.2
MSComctlLib.TreeCtrl.2
MSIE.MsieCtrl.1
Msinfo32.MSInfo.1
MSIOff10.MSIOffCtrl10.1
MsoLang.LanguageResources.1
MSScriptControl.ScriptControl.1
MsTscAx.MsTscAx.2
MsTscAx.MsTscAx.2
MSVidCtl.MSVidCtl.1
MSWebDVD.MSDVDAdm.1
MSWebDVD.MSWebDVD.1
OlePrn.OleInstall.1
OWC.Chart.9
OWC.DataSourceControl.9
OWC.ExpandControl.9
OWC.PivotTable.9
OWC.RecordNavigationControl.9
OWC.Spreadsheet.9
OWC10.ChartSpace.10
OWC10.DataSourceControl.10
OWC10.PivotTable.10
OWC10.RecordNavigationControl.10
OWC10.Spreadsheet.10
OWS.PostData.1
PALIST.AlphaListCtrl.2
Pkmaxctl.VocabCtl.1
Preview.Preview.1
PrmtCtl.Directions.1
PRMTLIB.PromtDictListCtrl.2
PRMTLIB.PromtDirComboCtrl.2
PRMTLIB.PromtDirListCtrl.2
PRMTLIB.PromtTemplateComboCtrl.2
PRMTLIB.PromtTemplateListCtrl.2
PRMTLIB.PromtUWListCtrl.2
PRMTLIB.PromtWWTListCtrl.2
QuickTime.QuickTime.4
RDCHost.RemoteDesktopClientHost.1
RECORDING.RecordingCtrl.1
RefEdit.Ctrl
rmocx.RealPlayer G2 Control.1
ScriptBridge.ScriptBridge.1
SegmentBox.SegmentBoxCtrl.1
Shell.Explorer.2
Shell.FolderView.1
ShockwaveFlash.ShockwaveFlash.1
SoftwareFX.ChartFX.20
SrchUI.SearchAssistant.1
SysColorCtrl.SysColorCtrl.1
TDCCtl.TDCCtl.1
ThumbCtl.ThumbCtl.1
ThumbCtl.ThumbCtl.2
TrialEnd.TrialEnd.1
VCF1.VCF1Ctrl.1
VCFI.VCFiCtrl.1
VideoRenderCtl.VideoRenderCtl.1
VSFLEX.vsFlexArrayCtrl.1
VSFLEX.vsFlexStringCtrl.1
VSPELLER.VSpellCtrl.1
WMPlayer.OCX.7

Источник
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Viktor1703 [?]
теперь назрел вопрос, как воспроизвести файл
Вот именно это (в примере DirectShow Player) вам показали ;)
У объекта DShowPreview.VideoPreview.1 есть единственный метод
Код:
"Device Interface"
void Device([in] IUnknown* pDevice);
Метода LoadMove у него нет.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AutoItObject для того и создан, чтобы вы могли использовать неподдерживаемые AutoIt интерфейсы. В AutoIt 3.3.8.0 AutoItObject почти полностью интегрирован в ЯП, так что можно обойтись без него (см. ObjCreateInterface()). Только, пожалуйста, не нужно меня спрашивать как это сделать, в том примере все есть.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Хорошо не буду спрашивать, а вот с этим объектом будет заморочка, спасибо всем :smile:


Добавлено:
Сообщение автоматически объединено:

Мда, установил я AutoIt 3.3.8.0, посмотрел на функцию ObjCreateInterface(), и увидел что ни фига там нормального примера нет тупо останавливает работу функции WinWait или ХЗ что она там делает, более того ни где нормальной инфы по ней нету, такое ощущение как будто новый язык изучаю.....
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
ObjCreateInterface и _AutoItObject_ObjCreate для AutoItObject одно и тоже.
Посмотрите справку для AutoItObject -> _AutoItObject_ObjCreate
Правда, одной заменой ObjCreateInterface на _AutoItObject_ObjCreate в примере DirectShow Player не обойтись. Нужно будет повозиться.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Блин, жесть....

52237092_1260417903_images.jpg




Добавлено:
Сообщение автоматически объединено:

Похоже в AutoIt'e появилась ещё одна функция которой я пользоваться не буду.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
AutoIt v3.3.8.0

Начало положено вот такой контрол для теста поставил:



И вот ещё



Этот ActiveX контрол показывает полную информацию о мониторе и процессоре.




Код:
$hForm = GUICreate("DirectShow Player", 500, 400)
$oInterface = ObjCreateInterface("{8352EDFE-28C3-4012-90BC-43B0AF7B7E57}", "{00000000-0000-0000-C000-000000000046}")
$ActiveX = GUICtrlCreateObj($oInterface, 10, 10, 200, 200)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd


Надо чательно изучить данную функцию, очень полезна....



Добавлено:
Сообщение автоматически объединено:

Подключать чуть -чуть понял как а вот обращатся и вытягивать информацию ещё не умею....
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Чёто я ни как въехать не могу в эту функцию, нагородил фигню какую то...

Код:
DllCall("shell32.dll", "uint", "SetCurrentProcessExplicitAppUserModelID", "wstr", "{4DA5FB3C-A693-40A6-AE69-5F55029EED9B}")

AutoItWinSetTitle("{5A1289AB-BF24-44D5-9E55-BCC8E7207D10}")

$sCLSID_FilterGraph = "{E436EBB3-524F-11CE-9F53-0020AF0BA770}"
$sIID_IGraphBuilder = "{56A868A9-0AD4-11CE-B03A-0020AF0BA770}"
$tIID_IMediaPosition = CLSIDFromString("{56A868B2-0AD4-11CE-B03A-0020AF0BA770}")
$tIID_IMediaControl = CLSIDFromString("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
$tIID_IMediaEventEx = CLSIDFromString("{56A868C0-0AD4-11CE-B03A-0020AF0BA770}")
$tIID_IVideoWindow = CLSIDFromString("{56A868B4-0AD4-11CE-B03A-0020AF0BA770}")
$tIID_IBasicAudio = CLSIDFromString("{56A868B3-0AD4-11CE-B03A-0020AF0BA770}")
$tIID_IBasicVideo = CLSIDFromString("{56A868B5-0AD4-11CE-B03A-0020AF0BA770}")

$dtagIGraphBuilder = "QueryInterface hresult(ptr;ptr*);" & _
		    "AddRef dword();" & _
		    "Release dword();" & _
			"AddFilter hresult(ptr;wstr);" & _
			"RemoveFilter hresult(ptr);" & _
			"EnumFilters hresult(ptr*);" & _
			"FindFilterByName hresult(wstr;ptr*);" & _
			"ConnectDirect hresult(ptr;ptr;ptr);" & _
			"Reconnect hresult(ptr);" & _
			"Disconnect hresult(ptr);" & _
			"SetDefaultSyncSource hresult();" & _
			"Connect hresult(ptr;ptr);" & _
			"Render hresult(ptr);" & _
			"RenderFile hresult(wstr;ptr);" & _
			"AddSourceFilter hresult(wstr;wstr;ptr*);" & _
			"SetLogFile hresult(dword_ptr);" & _
			"Abort hresult();" & _
			"ShouldOperationContinue hresult();"

$oGraphBuilder = ObjCreateInterface($sCLSID_FilterGraph, $sIID_IGraphBuilder, $dtagIGraphBuilder)

Local $aCall = $oGraphBuilder.QueryInterface(Number(DllStructGetPtr($tIID_IMediaControl)), 0)

$hForm = GUICreate("DirectShow Player", 500, 400)
$ActiveX = GUICtrlCreateObj($oGraphBuilder, 0, 0, 500, 300)
GUISetState()


While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd

Func CLSIDFromString($sString)
	Local $tCLSID = DllStructCreate("dword;word;word;byte[8]")
	Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sString, "ptr*", DllStructGetPtr($tCLSID))
	If @error Then Return SetError(1, @error, 0)
	If $aResult[0] <> 0 Then Return SetError(2, $aResult[0], 0)
	Return $tCLSID
EndFunc




Добавлено:
Сообщение автоматически объединено:

Вот я создаю контрол DirectShow на окне, как теперь к нему обращатся, кто его знает...

Код:
$oDirect = ObjCreateInterface("{457A23DF-6F2A-4684-91D0-317FB768D87C}", "{00000000-0000-0000-C000-000000000046}")
$hForm = GUICreate("DirectShow Player", 500, 400)
$ActiveX = GUICtrlCreateObj($oDirect, 0, 0, 500, 300)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Мне удалось запустить Windows Media Player, правдо от видео файла есть только звук...

Код:
$oDirect = ObjCreateInterface("{6BF52A52-394A-11D3-B153-00C04F79FAA6}", "{54062B68-052A-4C25-A39F-8B63346511D4}")

$hForm = GUICreate("WMPPlayer", 500, 400)
$ActiveX = GUICtrlCreateObj($oDirect, 0, 0, 500, 300)
GUISetState()
$oDirect.url = (@ScriptDir & "\Andrea - Dokrai.mp4")
$oDirect.enableContextMenu = (True)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Может вам это подойдет.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Тот же самый DirectShow только на другом языке в виде dll
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Нашёл другой пример на DirectShow, в нём всего 3 функции для создания интерфейса, 2 из них я сделал на WinAPI, а вот 3я _AutoItObject_WrapperCreate не пойму как работает и как реализовать её с помощью WinAPI, есть сорци AutoItObject.dll но я ни как ни разберусь в них, как реализовать _AutoItObject_WrapperCreate?

Код:
#include <WindowsConstants.au3>
#include <WinAPIEx.au3>
#include "AutoitObject.au3"

Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")
Func _ErrFunc()
	ConsoleWrite("! COM Error !  Number: 0x" & Hex($oError.number, 8) & "   ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF)
	Return
EndFunc   ;==>_ErrFunc


; GUI
Global $hGUI = GUICreate("DirectShow Player - AutoItObject", 540, 500, -1, -1, $WS_OVERLAPPEDWINDOW)
Global $hVolSlider = GUICtrlCreateSlider(10, 462, 120, 15)
GUICtrlSetData(-1, 100)
GUICtrlSetResizing(-1, 64 + 512)
Global $hButtonStop = GUICtrlCreateButton("Stop", 140, 450, 70, 25)
Global $hButtonPlay = GUICtrlCreateButton("Pause", 220, 450, 115, 25)
Global $hButtonBrowse = GUICtrlCreateButton("Load", 430, 450, 90, 25)
Global $hButtonFit = GUICtrlCreateButton("Fit window", 350, 450, 70, 25)


_AutoItObject_StartUp()

Global $oGraphBuilder, $oMediaControl, $oMediaEventEx, $oVideoWindow, $oMediaPosition, $oBasicAudio, $oBasicVideo

Global $iPlaying = 1, $iVol, $iUnFit = 1

GUIRegisterMsg($WM_SIZE, "_AdjustMediaViewPos")
GUIRegisterMsg($WM_GETMINMAXINFO, "_SetMinMax")
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			ExitLoop
		Case $hButtonFit
			If $iUnFit Then
				$iUnFit = 0
				GUICtrlSetData($hButtonFit, "Original size")
			Else
				$iUnFit = 1
				GUICtrlSetData($hButtonFit, "Fit window")
			EndIf
			_SetSize($oVideoWindow, $oBasicVideo, $hGUI)
		Case $hButtonStop
			$oMediaPosition.put_CurrentPosition("long", "double", 0)
			$oMediaControl.Stop()
			GUICtrlSetData($hButtonPlay, "Play")
			$iPlaying = 0
		Case $hButtonPlay
			If $iPlaying Then
				$oMediaControl.Pause()
				GUICtrlSetData($hButtonPlay, "Play")
				$iPlaying = 0
			Else
				$oMediaControl.Run()
				GUICtrlSetData($hButtonPlay, "Pause")
				$iPlaying = 1
			EndIf
		Case $hButtonBrowse
			$sMediaFile = FileOpenDialog("Choose fle", "", "(*.flv;*.gif;*.bmp;*.jpg;*.wmv;*.avi;*.mpg;*.mp4;*.wmv;*.wma;*.mid;*.wav;*.mp3;*.rmi;*.aif;*.au;*.snd;*.kar)|All files(*)", 1)
			If @error Then ContinueLoop
			_ReleaseBuilder($oGraphBuilder, $oMediaControl, $oMediaEventEx, $oVideoWindow, $oMediaPosition, $oBasicAudio, $oBasicVideo)
			_InitBuilder($oGraphBuilder, $oMediaControl, $oMediaEventEx, $oVideoWindow, $oMediaPosition, $oBasicAudio, $oBasicVideo)
			;$oGraphBuilder.RenderFile("int", "wstr", $sMediaFile, "ptr", 0)
			$oMediaControl.RenderFile($sMediaFile)
			$oVideoWindow.put_Caption("long", "wstr", StringRegExpReplace($sMediaFile, ".*\\|\.xm", ""))
			$oVideoWindow.put_Owner("long", "hwnd", Number($hGUI))
			$oVideoWindow.put_WindowStyle("long", "long", 0x42000000) ; WS_CHILD | WS_CLIPCHILDREN
			_SetSize($oVideoWindow, $oBasicVideo, $hGUI)
			$oBasicAudio.put_Volume("long", "long", -Exp((100 - GUICtrlRead($hVolSlider)) / 10.86))
			$oMediaControl.Run()
			GUICtrlSetData($hButtonPlay, "Pause")
			$iPlaying = 1
	EndSwitch
	If $iVol <> GUICtrlRead($hVolSlider) Then
		$iVol = GUICtrlRead($hVolSlider)
		If IsObj($oBasicAudio) Then $oBasicAudio.put_Volume("long", "long", -Exp((100 - $iVol) / 10.86))
		GUICtrlSetTip($hVolSlider, $iVol & " %VOL")
	EndIf
WEnd

_ReleaseBuilder($oGraphBuilder, $oMediaControl, $oMediaEventEx, $oVideoWindow, $oMediaPosition, $oBasicAudio, $oBasicVideo)

;THE END




Func _SetSize($oVideoWindow, $oBasicVideo, $hGUI)
	Local $aClientSize = WinGetClientSize($hGUI)
	Local $aCall = $oBasicVideo.GetVideoSize("long", "long*", 0, "long*", 0)
	Local $iX, $iY
	Local $iWidth = $aClientSize[0], $iHeight = $aClientSize[1] - 80
	If IsArray($aCall) And $iUnFit Then
		If $iWidth > $aCall[1] Or $iHeight > $aCall[2] Then
			$iX = ($iWidth - $aCall[1]) / 2
			$iY = ($iHeight - $aCall[2]) / 2
			$iWidth = $aCall[1]
			$iHeight = $aCall[2]
			If $iY + $iHeight + 80 > $aClientSize[1] Then $iY = $aClientSize[1] - 80 - $aCall[2]
		EndIf
	EndIf
	$oVideoWindow.SetWindowPosition("long", "long", $iX, "long", $iY, "long", $iWidth, "long", $iHeight)
	Return 1
EndFunc   ;==>_SetSize

Func _InitBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oMediaEventEx, ByRef $oVideoWindow, ByRef $oMediaPosition, ByRef $oBasicAudio, ByRef $oBasicVideo)

	Local $tCLSID_FilterGraph = _WinAPI_CLSIDFromString("{e436ebb3-524f-11ce-9f53-0020af0ba770}")
	Local $tIID_IGraphBuilder = _WinAPI_CLSIDFromString("{56a868a9-0ad4-11ce-b03a-0020af0ba770}")

	Local $tIID_IMediaPosition = _WinAPI_CLSIDFromString("{56a868b2-0ad4-11ce-b03a-0020af0ba770}")
	Local $tIID_IMediaControl  = _WinAPI_CLSIDFromString("{56A868B1-0AD4-11CE-B03A-0020AF0BA770}")
	Local $tIID_IMediaEventEx  = _WinAPI_CLSIDFromString("{56A868C0-0AD4-11CE-B03A-0020AF0BA770}")
	Local $tIID_IVideoWindow   = _WinAPI_CLSIDFromString("{56A868B4-0AD4-11CE-B03A-0020AF0BA770}")
	Local $tIID_IBasicAudio    = _WinAPI_CLSIDFromString("{56a868b3-0ad4-11ce-b03a-0020af0ba770}")
	Local $tIID_IBasicVideo    = _WinAPI_CLSIDFromString("{56a868b5-0ad4-11ce-b03a-0020af0ba770}")

	Local $pGraphBuilder
	_WinAPI_CoCreateInstance($tCLSID_FilterGraph, 0, 1, $tIID_IGraphBuilder, $pGraphBuilder)
	If Not $pGraphBuilder Then Return SetError(1, 0, 0)

	Local $tagInterface = "QueryInterface;" & _
			"AddRef;" & _
			"Release;" & _ ; IUnknown
			"AddFilter;" & _
			"RemoveFilter;" & _
			"EnumFilters;" & _
			"FindFilterByName;" & _
			"ConnectDirect;" & _
			"Reconnect;" & _
			"Disconnect;" & _
			"SetDefaultSyncSource;" & _ ; IFilterGraph
			"Connect;" & _
			"Render;" & _
			"RenderFile;" & _
			"AddSourceFilter;" & _
			"SetLogFile;" & _
			"Abort;" & _
			"ShouldOperationContinue;" ; IGraphBuilder

	; Wrapp IGraphBuilder interface
	$oGraphBuilder = _AutoItObject_WrapperCreate($pGraphBuilder, $tagInterface)
	If @error Then Return SetError(2, 0, 0)

	; IMediaControl IDispatch
	Local $aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IMediaControl)), "idispatch*", 0) ; or directly "idispatch*"
	If IsArray($aCall) Then
		$oMediaControl = $aCall[2]
	Else
		Return SetError(3, 0, 0)
	EndIf

	; IMediaEventEx IDispatch
	$aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IMediaEventEx)), "idispatch*", 0) ; or directly "idispatch*"
	If IsArray($aCall) Then
		$oMediaEventEx = $aCall[2]
	Else
		Return SetError(4, 0, 0)
	EndIf

	; Get pointer to IVideoWindow interface
	$aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IVideoWindow)), "ptr*", 0)
	If IsArray($aCall) Then
		$pVideoWindow = $aCall[2]
	Else
		Return SetError(5, 0, 0)
	EndIf

	; IVideoWindow is dual interface. Defining vTable methods:
	Local $tagIVideoWindow = "QueryInterface;" & _
			"AddRef;" & _
			"Release;" & _ ; IUnknown
			"GetTypeInfoCount;" & _
			"GetTypeInfo;" & _
			"GetIDsOfNames;" & _
			"Invoke;" & _ ; IDispatch
			"put_Caption;" & _
			"get_Caption;" & _
			"put_WindowStyle;" & _
			"get_WindowStyle;" & _
			"put_WindowStyleEx;" & _
			"put_WindowStyleEx;" & _
			"put_AutoShow;" & _
			"get_AutoShow;" & _
			"put_WindowState;" & _
			"get_WindowState;" & _
			"put_BackgroundPalette;" & _
			"get_BackgroundPalette;" & _
			"put_Visible;" & _
			"get_Visible;" & _
			"put_Left;" & _
			"get_Left;" & _
			"put_Width;" & _
			"get_Width;" & _
			"put_Top;" & _
			"get_Top;" & _
			"put_Height;" & _
			"get_Height;" & _
			"put_Owner;" & _
			"get_Owner;" & _
			"put_MessageDrain;" & _
			"get_MessageDrain;" & _
			"get_BorderColor;" & _
			"put_BorderColor;" & _
			"get_FullScreenMode;" & _
			"put_FullScreenMode;" & _
			"SetWindowForeground;" & _
			"NotifyOwnerMessage;" & _
			"SetWindowPosition;" & _
			"GetWindowPosition;" & _
			"GetMinIdealImageSize;" & _
			"GetMaxIdealImageSize;" & _
			"GetRestorePosition;" & _
			"HideCursor;" & _
			"IsCursorHidden;" ; IVideoWindow

	; Wrapp it:
	$oVideoWindow = _AutoItObject_WrapperCreate($pVideoWindow, $tagIVideoWindow)
	If @error Then Return SetError(6, 0, 0)

	; Get pointer to IMediaPosition interface
	$aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IMediaPosition)), "ptr*", 0)
	If IsArray($aCall) Then
		$pMediaPosition = $aCall[2]
	Else
		Return SetError(7, 0, 0)
	EndIf

	; IMediaPosition is dual interface. Defining vTable methods:
	Local $tagIMediaPosition = "QueryInterface;" & _
			"AddRef;" & _
			"Release;" & _ ; IUnknown
			"GetTypeInfoCount;" & _
			"GetTypeInfo;" & _
			"GetIDsOfNames;" & _
			"Invoke;" & _ ; IDispatch
			"get_Duration;" & _
			"put_CurrentPosition;" & _
			"get_CurrentPosition;" & _
			"get_StopTime;" & _
			"put_StopTime;" & _
			"get_PrerollTime;" & _
			"put_PrerollTime;" & _
			"put_Rate;" & _
			"get_Rate;" & _
			"CanSeekForward;" & _
			"CanSeekBackward;" ; IMediaPosition

	; Wrapp it:
	$oMediaPosition = _AutoItObject_WrapperCreate($pMediaPosition, $tagIMediaPosition)
	If @error Then Return SetError(8, 0, 0)

	; Get pointer to IBasicAudio interface
	$aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IBasicAudio)), "ptr*", 0)
	If IsArray($aCall) Then
		$pBasicAudio = $aCall[2]
	Else
		Return SetError(9, 0, 0)
	EndIf

	; IBasicAudio is dual interface. Defining vTable methods:
	Local $tagIBasicAudio = "QueryInterface;" & _
			"AddRef;" & _
			"Release;" & _ ; IUnknown
			"GetTypeInfoCount;" & _
			"GetTypeInfo;" & _
			"GetIDsOfNames;" & _
			"Invoke;" & _ ; IDispatch
			"put_Volume;" & _
			"get_Volume;" & _
			"put_Balance;" & _
			"get_Balance;" ; IBasicAudio

	; Wrapp it:
	$oBasicAudio = _AutoItObject_WrapperCreate($pBasicAudio, $tagIBasicAudio)
	If @error Then Return SetError(10, 0, 0)

	; Get pointer to IBasicVideo interface
	$aCall = $oGraphBuilder.QueryInterface("int", "ptr", Number(DllStructGetPtr($tIID_IBasicVideo)), "ptr*", 0)
	If IsArray($aCall) Then
		$pIBasicVideo = $aCall[2]
	Else
		Return SetError(11, 0, 0)
	EndIf

	; IBasicVideo is dual interface. Defining vTable methods:
	Local $tagIBasicVideo = "QueryInterface;" & _
			"AddRef;" & _
			"Release;" & _ ; IUnknown
			"GetTypeInfoCount;" & _
			"GetTypeInfo;" & _
			"GetIDsOfNames;" & _
			"Invoke;" & _ ; IDispatch
			"get_AvgTimePerFrame;" & _
			"get_BitRate;" & _
			"get_BitErrorRate;" & _
			"get_VideoWidth;" & _
			"get_VideoHeight;" & _
			"put_SourceLeft;" & _
			"get_SourceLeft;" & _
			"put_SourceWidth;" & _
			"get_SourceWidth;" & _
			"put_SourceTop;" & _
			"get_SourceTop;" & _
			"put_SourceHeight;" & _
			"get_SourceHeight;" & _
			"put_DestinationLeft;" & _
			"get_DestinationLeft;" & _
			"put_DestinationWidth;" & _
			"get_DestinationWidth;" & _
			"put_DestinationTop;" & _
			"get_DestinationTop;" & _
			"put_DestinationHeight;" & _
			"get_DestinationHeight;" & _
			"SetSourcePosition;" & _
			"GetSourcePosition;" & _
			"SetDefaultSourcePosition;" & _
			"SetDestinationPosition;" & _
			"GetDestinationPosition;" & _
			"SetDefaultDestinationPosition;" & _
			"GetVideoSize;" & _
			"GetVideoPaletteEntries;" & _
			"GetCurrentImage;" & _
			"IsUsingDefaultSource;" & _
			"IsUsingDefaultDestination;" ; IBasicVideo

	; Wrapp it:
	$oBasicVideo = _AutoItObject_WrapperCreate($pIBasicVideo, $tagIBasicVideo)
	If @error Then Return SetError(12, 0, 0)

	Return 1 ; All ok!

EndFunc   ;==>_InitBuilder

Func _ReleaseBuilder(ByRef $oGraphBuilder, ByRef $oMediaControl, ByRef $oMediaEventEx, ByRef $oVideoWindow, ByRef $oMediaPosition, ByRef $oBasicAudio, ByRef $oBasicVideo)
	If IsObj($oMediaControl) Then $oMediaControl.Stop()
	If IsObj($oVideoWindow) Then $oVideoWindow.put_Visible("long", "long", 0)
	If IsObj($oVideoWindow) Then $oVideoWindow.put_Owner("long", "hwnd", 0)
	$oGraphBuilder = 0
	$oMediaControl = 0
	$oMediaEventEx = 0
	$oVideoWindow = 0
	$oMediaPosition = 0
	$oBasicAudio = 0
	$oBasicVideo = 0
EndFunc   ;==>_ReleaseBuilder


Func _AdjustMediaViewPos($hWnd, $iMsg, $wParam, $lParam)
	#forceref $iMsg
	If $hWnd = $hGUI Then
		Local $aClientSize[2] = [BitAND($lParam, 65535), BitShift($lParam, 16)]
		Local $iX, $iY
		Local $iWidth = $aClientSize[0], $iHeight = $aClientSize[1] - 80
		If IsObj($oBasicVideo) Then
			Local $aCall = $oBasicVideo.GetVideoSize("long", "long*", 0, "long*", 0)
			If IsArray($aCall) Then
				If $iUnFit Then
					If $iWidth > $aCall[1] Or $iHeight > $aCall[2] Then
						$iX = ($iWidth - $aCall[1]) / 2
						$iY = ($iHeight - $aCall[2]) / 2
						$iWidth = $aCall[1]
						$iHeight = $aCall[2]
						If $iY + $iHeight + 80 > $aClientSize[1] Then $iY = $aClientSize[1] - 80 - $aCall[2]
					EndIf
				EndIf
			EndIf
		EndIf
		If IsObj($oVideoWindow) Then $oVideoWindow.SetWindowPosition("long", "long", $iX, "long", $iY, "long", $iWidth, "long", $iHeight)
	EndIf
EndFunc   ;==>_AdjustMediaViewPos

Func _SetMinMax($hWnd, $iMsg, $wParam, $lParam)
	#forceref $iMsg, $wParam
	If $hWnd = $hGUI Then
		Local $tMINMAXINFO = DllStructCreate("int;int;" & _
				"int MaxSizeX; int MaxSizeY;" & _
				"int MaxPositionX;int MaxPositionY;" & _
				"int MinTrackSizeX; int MinTrackSizeY;" & _
				"int MaxTrackSizeX; int MaxTrackSizeY", _
				$lParam)
		DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 520)
		DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 80)
	EndIf
EndFunc   ;==>_SetMinMax

Func _WinAPI_CLSIDFromString($sGUID)
	$tGUID = DllStructCreate('ulong Data1;ushort Data2;ushort Data3;byte Data4[8]')
	$iRet = DllCall('ole32.dll', 'uint', 'CLSIDFromString', 'wstr', $sGUID, 'ptr', DllStructGetPtr($tGUID))
	If (@error) Or ($iRet[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
    Return $tGUID
EndFunc

Func _WinAPI_CoCreateInstance($CLSID, $pUnkOuter, $dwClsContext, $riid, ByRef $ppv)
	$ppv = 0
	Local $iRet = DllCall($gh_AU3Obj_ole32dll, 'long', 'CoCreateInstance', 'ptr', DllStructGetPtr($CLSID), 'ptr', $pUnkOuter, 'dword', $dwClsContext, 'ptr', DllStructGetPtr($riid), 'ptr*', 0)
	If @error Then
	    Return SetError(1, @error, 0)
	EndIf
	$ppv = $iRet[5]
	Return SetError($iRet[0], 0, $iRet[0] = 0)
EndFunc
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Наконец то стали появляться нормальные примеры по использованию ObjCreateInterface(), нашёл на оф. форуме пример DShow WebCam и немного переделал скрипт, пока что протестировал только на Windows XP SP3, в архиве исходники и скопилированный пример для тех у кого версия AutoIt ниже 3.3.8.0/3.3.8.1

DShow WebCam


Добавлено:
Сообщение автоматически объединено:

Чуть помучился, но работает, пока что начало UDF для воспроизведения видео на форме :IL_AutoIt_1:
 
Верх