帮忙翻译一段VC代码...

mdejtod 2008-07-21 05:52:43
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); /运行到这里时,鼠标跟踪显示,对象不可存取,请问是哪里出错了?
前面运行一直正常,也就是说,接口对象有创建,访问后也有值...但是访问不了接口中的函数
...全文
118 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mdejtod 2008-07-23
  • 打赏
  • 举报
回复
怎么都没人啊????
手指风 2008-07-23
  • 打赏
  • 举报
回复
帮顶
mdejtod 2008-07-23
  • 打赏
  • 举报
回复
interface IVideoGDIDrawer {
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中按照他的思路就是不行呢?
jmh521 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lake_cx 的回复:]
interface这是C语言定义接口的方式,按理说应该第一个参数是this指针的
[/Quote]
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
interface IVideoGDIDrawer {
virtual void GDIDraw(HDC hdc, DWORD width, DWORD height) = 0;
};
这里在DELPHI中是怎么定义的?搞错了,不是个函数指针.....
function SetVideoGDIDrawer(pDrawer : TSetVideoGDIDrawer) : HRESULT; stdcall;
oosmile 2008-07-22
  • 打赏
  • 举报
回复
刚好看到
///////////////////////////////////////
//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;
UndefinedCoder 2008-07-22
  • 打赏
  • 举报
回复
virtual
virtual;abstract;
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
怎么没人?在DELPHI中,虚函数和 VC 中的 pure 要怎么定义??
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
不太会用回调函数,能否写个简单的例子给我?
lake_cx 2008-07-22
  • 打赏
  • 举报
回复
interface这是C语言定义接口的方式,按理说应该第一个参数是this指针的
lake_cx 2008-07-22
  • 打赏
  • 举报
回复
回调函数,你自己写个函数,赋值给它,然后传给接口,到时自然会调用到你的函数
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
TVideoEffectProcessor = packed record
EffectProcess: procedure(var src, dst: BYTE; width, height: DWORD);
end;
那这里面的函数体怎么实现呢?
lake_cx 2008-07-22
  • 打赏
  • 举报
回复
#define interface struct
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
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;
};
------------------------------------------------------------------
翻译如下,
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);
上面这句话运行过没错,但整个过程运行完后会抛出异常,不知怎么回事,

还有楼上的兄弟.将接口定义为压缩型记录,这样可以吗?
lake_cx 2008-07-22
  • 打赏
  • 举报
回复
const
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;
mdejtod 2008-07-22
  • 打赏
  • 举报
回复
高手都跑哪去了???

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧