struct OverlayConfig {
int pos_x, pos_y;
int justify_x, justify_y;
int opacity;
bool bNonPremultAlpha;
bool bNeedInvertAlpha;
int ol_width, ol_height;
PVOID ol_buffer;
};interface IVideoEffectProcessor {
virtual void EffectProcess(PBYTE src, PBYTE dst, DWORD width, DWORD height) = 0;
};//回调函数interface IVideoGDIDrawer {
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};DECLARE_INTERFACE_(IVCamTransConfig, IUnknown)
{
STDMETHOD(AddImageOverlay) (OverlayConfig* pIOC, int whichOne = 0) PURE;
// STDMETHOD(AddImageOverlayEx) (ImageOverlayConfig* pIOC, int whichOne = 0) PURE;
STDMETHOD(AddVideoEffect) (LONG effectType, PLONG effectId, LPTSTR sParamFormat) PURE;
STDMETHOD(SetVideoEffectParams) (LONG effectId, LPCTSTR sParam) PURE;
STDMETHOD(RemoveVideoEffect) (LONG index = 0) PURE;
STDMETHOD(RemoveVideoEffects) () PURE;
STDMETHOD(SetVideoGDIDrawer) (IVideoGDIDrawer* pDrawer) PURE;
STDMETHOD(SetVideoEffectProcessor) (IVideoEffectProcessor* pProcessor) PURE;
// STDMETHOD(SetAdvertisement) (LPCTSTR sAdv) PURE;
};HRESULT CVCamSDKImpl::PlayVideoFile(LPCTSTR fileName)
{
StopPlay();
StopCapture(); // create filter graph
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);
hr = m_pGraph->AddFilter(m_pVCamRenderer, L"Renderer");#if 1
const CLSID CLSID_VCamTrans = {0x9CFB3966,0xB84C,0x4452,{0x9A,0x62,0x33,0xA2,0xC6,0x6E,0xEE,0xB1}};
const IID IID_IVCamTransConfig = {0x799b6eca, 0xbc9f, 0x4bd2, {0x91, 0x80, 0x45, 0x68, 0x46, 0x10, 0x42, 0xcd}}; IBaseFilter* pVCamTrans = NULL;
hr = CoCreateInstance(CLSID_VCamTrans, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pVCamTrans);
hr = m_pGraph->AddFilter(pVCamTrans, L"VCam Effects Filter");
IVCamTransConfig* pConfig;
hr = pVCamTrans->QueryInterface(IID_IVCamTransConfig, reinterpret_cast< void** >(&pConfig));
LONG id;
TCHAR szParams[] = _T("bright[-255..255]={100}, contrast[0..32]={10}");
hr = pConfig->AddVideoEffect(0, &id, szParams);
#endif----------------------------------------------------
主要是接口的定义部分,我自己翻译后,在访问接口中的方法时提示出错,不可存取的对象,以下是接口的定义.帮忙看下是否有错const
CLSID_VCamTrans : TGUID = '{9CFB3966-B84C-4452-9A62-33A2C66EEEB1}';
IID_IVCamTransConfig : TGUID = '{799B6ECA-BC9F-4bd2-9180-4568461042CD}';
type
IVCamTransConfig = interface;
IVCamTransConfig = interface(IUnknown)
['{799B6ECA-BC9F-4bd2-9180-4568461042CD}']
function AddImageOverlay(pIOC : POverlayConfig; whichOne : integer = 0) : HRESULT;stdcall;
function AddVideoEffect(effectType : Longint ; effectId :Plongint; sParamFormat : PChar) : HRESULT;stdcall;
function SetVideoEffectParams(effectId : longint ; sParam : PChar) : HRESULT;stdcall;
function RemoveVideoEffect(index : Longint= 0) : HRESULT;stdcall;
function RemoveVideoEffects : HRESULT ;stdcall;
function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall;
function IVideoEffectProcessor(pProcessor : TIVideoEffectProcessor) : HRESULT ;stdcall;
end;调用
var eid : longint;
Test : Pchar;
begin
eid := 0;
Test := 'bright[-255..255]={100}, contrast[0..32]={10}';
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, m_pVideo);
CoCreateInstance(CLASS_VCamRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter,m_pVCamRenderer);
CoCreateInstance(CLSID_VCamTrans,nil,CLSCTX_INPROC,IID_IBaseFilter,P_VCamTrans);
m_pVideo.AddFilter(m_pVCamRenderer,'Renderer');
m_pVideo.AddFilter(P_VCamTrans,'Trans');
P_VCamTrans.QueryInterface(IID_IVCamTransConfig, m_pCamTranconfig);
m_pCamTranconfig.AddVideoEffect(0,@eid,Test); /运行到这里时,鼠标跟踪显示,对象不可存取,请问是哪里出错了?
前面运行一直正常,也就是说,接口对象有创建,访问后也有值...但是访问不了接口中的函数
int pos_x, pos_y;
int justify_x, justify_y;
int opacity;
bool bNonPremultAlpha;
bool bNeedInvertAlpha;
int ol_width, ol_height;
PVOID ol_buffer;
};interface IVideoEffectProcessor {
virtual void EffectProcess(PBYTE src, PBYTE dst, DWORD width, DWORD height) = 0;
};//回调函数interface IVideoGDIDrawer {
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};DECLARE_INTERFACE_(IVCamTransConfig, IUnknown)
{
STDMETHOD(AddImageOverlay) (OverlayConfig* pIOC, int whichOne = 0) PURE;
// STDMETHOD(AddImageOverlayEx) (ImageOverlayConfig* pIOC, int whichOne = 0) PURE;
STDMETHOD(AddVideoEffect) (LONG effectType, PLONG effectId, LPTSTR sParamFormat) PURE;
STDMETHOD(SetVideoEffectParams) (LONG effectId, LPCTSTR sParam) PURE;
STDMETHOD(RemoveVideoEffect) (LONG index = 0) PURE;
STDMETHOD(RemoveVideoEffects) () PURE;
STDMETHOD(SetVideoGDIDrawer) (IVideoGDIDrawer* pDrawer) PURE;
STDMETHOD(SetVideoEffectProcessor) (IVideoEffectProcessor* pProcessor) PURE;
// STDMETHOD(SetAdvertisement) (LPCTSTR sAdv) PURE;
};HRESULT CVCamSDKImpl::PlayVideoFile(LPCTSTR fileName)
{
StopPlay();
StopCapture(); // create filter graph
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);
hr = m_pGraph->AddFilter(m_pVCamRenderer, L"Renderer");#if 1
const CLSID CLSID_VCamTrans = {0x9CFB3966,0xB84C,0x4452,{0x9A,0x62,0x33,0xA2,0xC6,0x6E,0xEE,0xB1}};
const IID IID_IVCamTransConfig = {0x799b6eca, 0xbc9f, 0x4bd2, {0x91, 0x80, 0x45, 0x68, 0x46, 0x10, 0x42, 0xcd}}; IBaseFilter* pVCamTrans = NULL;
hr = CoCreateInstance(CLSID_VCamTrans, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pVCamTrans);
hr = m_pGraph->AddFilter(pVCamTrans, L"VCam Effects Filter");
IVCamTransConfig* pConfig;
hr = pVCamTrans->QueryInterface(IID_IVCamTransConfig, reinterpret_cast< void** >(&pConfig));
LONG id;
TCHAR szParams[] = _T("bright[-255..255]={100}, contrast[0..32]={10}");
hr = pConfig->AddVideoEffect(0, &id, szParams);
#endif----------------------------------------------------
主要是接口的定义部分,我自己翻译后,在访问接口中的方法时提示出错,不可存取的对象,以下是接口的定义.帮忙看下是否有错const
CLSID_VCamTrans : TGUID = '{9CFB3966-B84C-4452-9A62-33A2C66EEEB1}';
IID_IVCamTransConfig : TGUID = '{799B6ECA-BC9F-4bd2-9180-4568461042CD}';
type
IVCamTransConfig = interface;
IVCamTransConfig = interface(IUnknown)
['{799B6ECA-BC9F-4bd2-9180-4568461042CD}']
function AddImageOverlay(pIOC : POverlayConfig; whichOne : integer = 0) : HRESULT;stdcall;
function AddVideoEffect(effectType : Longint ; effectId :Plongint; sParamFormat : PChar) : HRESULT;stdcall;
function SetVideoEffectParams(effectId : longint ; sParam : PChar) : HRESULT;stdcall;
function RemoveVideoEffect(index : Longint= 0) : HRESULT;stdcall;
function RemoveVideoEffects : HRESULT ;stdcall;
function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall;
function IVideoEffectProcessor(pProcessor : TIVideoEffectProcessor) : HRESULT ;stdcall;
end;调用
var eid : longint;
Test : Pchar;
begin
eid := 0;
Test := 'bright[-255..255]={100}, contrast[0..32]={10}';
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, m_pVideo);
CoCreateInstance(CLASS_VCamRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter,m_pVCamRenderer);
CoCreateInstance(CLSID_VCamTrans,nil,CLSCTX_INPROC,IID_IBaseFilter,P_VCamTrans);
m_pVideo.AddFilter(m_pVCamRenderer,'Renderer');
m_pVideo.AddFilter(P_VCamTrans,'Trans');
P_VCamTrans.QueryInterface(IID_IVCamTransConfig, m_pCamTranconfig);
m_pCamTranconfig.AddVideoEffect(0,@eid,Test); /运行到这里时,鼠标跟踪显示,对象不可存取,请问是哪里出错了?
前面运行一直正常,也就是说,接口对象有创建,访问后也有值...但是访问不了接口中的函数
解决方案 »
- 如何取到新打开网页的句柄??
- 求oicq或者icq类似功能程序(delphi开发)
- 怎样在下拉框中放置树型控件
- 如何按回车打开combobox菜单呢?
- DELPHI初学者关于覆盖基类中静态方法表达语法上的一点困惑
- 我用access做的delphi6.0程序怎样才能在没有安装dephi的机子上运行?直接把运行程序复制过去,建立了odbc连接,运行不了?
- 征集网络编程的思路。
- ASP.NET怎么样去调用ADO.NET。提示错误如下!
- 有没有自动生成一个字的拼音码和五笔码的程序,我想在Delphi中调用
- 怎样依据计算字段进行排序?
- delphi Oracle :delphi连接oracle,从数据字典中查询出数据,通过delphi编程显示输出
- 打印的时候如果有多页的话,如何能够实现从任意页开始打印?
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};
这里在DELPHI中是怎么定义的?搞错了,不是个函数指针.....
function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall;
CLSID_VCamTrans : TGUID = '{9CFB3966-B84C-4452-9A62-33A2C66EEEB1}';
IID_IVCamTransConfig : TGUID = '{799B6ECA-BC9F-4bd2-9180-4568461042CD}';type
TOverlayConfig = packed record
pos_x: Integer;
pos_y: Integer;
justify_x: Integer;
justify_y: Integer;
opacity: Integer;
bNonPremultAlpha: Boolean;
bNeedInvertAlpha: Boolean;
ol_width: Integer;
ol_height: Integer;
ol_buffer: Pointer;
end; TVideoEffectProcessor = packed record
EffectProcess: procedure(var src, dst: BYTE; width, height: DWORD);
end;
PVideoEffectProcessor = ^TVideoEffectProcessor; TVideoGDIDrawer = packed record
GDIDraw: procedure(hdc: HDC; width, height: DWORD);
end;
PVideoGDIDrawer = ^TVideoGDIDrawer; IVCamTransConfig = interface(IUnknown)
['{799B6ECA-BC9F-4bd2-9180-4568461042CD}']
function AddImageOverlay(var pIOC: TOverlayConfig; whichOne: Integer = 0): HRESULT; stdcall;
function AddVideoEffect(effectType: Longint; var effectId: Longint; sParamFormat: PWideChar): HRESULT; stdcall;
function SetVideoEffectParams(effectId: Longint; sParam: PWideChar): HRESULT; stdcall;
function RemoveVideoEffect(index: Longint = 0): HRESULT; stdcall;
function RemoveVideoEffects: HRESULT; stdcall;
function SetVideoGDIDrawer(pDrawer: PVideoGDIDrawer): HRESULT; stdcall;
function SetVideoEffectProcessor(pProcessor: PVideoEffectProcessor): HRESULT; stdcall;
end;
virtual void EffectProcess(PBYTE src, PBYTE dst, DWORD width, DWORD height) = 0;
};//回调函数 interface IVideoGDIDrawer {
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};
------------------------------------------------------------------
翻译如下,
type
IVideoGDIDrawer = interface
procedure GDIDraw(hdc : THandle ; width,height :DWORD);
end;
TIVideoGDIDrawer = class(TInterfacedObject,IVideoGDIDrawer)
procedure GDIDraw(hdc : THandle ; width,height :DWORD);
end;type
IVideoEffectProcessor = interface
procedure EffectProcess(hdc : THandle ; width,height :DWORD) ;stdcall;
end;
TIVideoEffectProcessor = class(TInterfacedObject,IVideoEffectProcessor)
public
procedure EffectProcess(hdc : THandle ; width,height :DWORD) ;stdcall;
end;
调用:
var IVideoGDIDrawerClass : TIVideoGDIDrawer;
IVideoGDIDrawerClass := TIVideoGDIDrawer.Create;
hr := m_pCamTranconfig.SetVideoGDIDrawer(@IVideoGDIDrawerClass);
上面这句话运行过没错,但整个过程运行完后会抛出异常,不知怎么回事,还有楼上的兄弟.将接口定义为压缩型记录,这样可以吗?
EffectProcess: procedure(var src, dst: BYTE; width, height: DWORD);
end;
那这里面的函数体怎么实现呢?
///////////////////////////////////////
//DLL里面,形式很多,不一定是dll的形式
type
TCallback = procedure(s: pchar); stdcall; procedure SetCallback(ACallback: TCallback); stdcall;
begin
FCallback := ACallback;
end;
procedure TcPortOBJ.cPortRChar(Sender: TObject; Count: Integer); //此事件回调主函数里面的已经设置入口的那个函数
var
Str: string;
begin
CPort.ReadStr(Str, Count);
if Assigned(FCallback) then FCallback(pchar(Str));
end;
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//主程序里面type
TCallback = procedure(s: pchar); stdcall;var
Form1: TForm1;procedure SetCallback(ACallback: TCallback); stdcall External 'cPort_DLL.dll';
procedure TForm1.Button4Click(Sender: TObject);
begin
SetCallback(@CallbackExample); //设置回调
end;procedure CallbackExample(s: pchar); stdcall;
begin
Form1.Memo1.Text := Form1.Memo1.Text + ' ' + (s);
end;
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};class CDrawer: public IVideoGDIDrawer {
void GDIDraw(HDC hdc, DWORD width, DWORD height)
{
::LineTo(hdc, 100, 100);
}
};
CDrawer g_Drawer;DECLARE_INTERFACE_(IVCamTransConfig, IUnknown)
{
STDMETHOD(AddImageOverlay) (OverlayConfig* pIOC, int whichOne = 0) PURE;
// STDMETHOD(AddImageOverlayEx) (ImageOverlayConfig* pIOC, int whichOne = 0) PURE;
STDMETHOD(AddVideoEffect) (LONG effectType, PLONG effectId, LPTSTR sParamFormat) PURE;
STDMETHOD(SetVideoEffectParams) (LONG effectId, LPCTSTR sParam) PURE;
STDMETHOD(RemoveVideoEffect) (LONG index = 0) PURE;
STDMETHOD(RemoveVideoEffects) () PURE;
STDMETHOD(SetVideoGDIDrawer) (IVideoGDIDrawer* pDrawer) PURE;
STDMETHOD(SetVideoEffectProcessor) (IVideoEffectProcessor* pProcessor) PURE;
// STDMETHOD(SetAdvertisement) (LPCTSTR sAdv) PURE;
};
hr = pVCamTrans->QueryInterface(IID_IVCamTransConfig, reinterpret_cast< void** >(&pConfig));
hr = pConfig->SetVideoGDIDrawer(&g_Drawer);
VC里面就这么简单,它要的参数是一个接口实现类的指针.....
为什么DELPHI中按照他的思路就是不行呢?