帮忙翻译一段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); /运行到这里时,鼠标跟踪显示,对象不可存取,请问是哪里出错了?
前面运行一直正常,也就是说,接口对象有创建,访问后也有值...但是访问不了接口中的函数
...全文
132 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
  • 打赏
  • 举报
回复
高手都跑哪去了???
c#数据库系统心得体会 数据库课程设计主要的目标是利用课程中学到的数据库知识和技术较好的开发设计出数 据库应用系统,去解决各行各业信息化处理的要求。下面是带来的,仅供参考。 c#数据库系统心得体会一: 这次数据库课程设计用的是Microsoft Visual FoxPro 6.0 ,而我们平时用的Microsoft SQL Server 20xx,虽然对VFP完全陌生,但在老师的指引下,我们近乎完美的完成了课程设计。当然 过程是艰辛的。 面对着完全陌生的操作环境VFP,许多同学开始埋怨,要求用SQL,用我们学过的ASP等来 完成设计。但我们慢慢发现用VFP做课程设计其实很有优势,于是它的这个优势激发了我 们去了解它的欲望。老师先将VFP中基本的建数据库,建表以及建表单等向我们演示了一 遍,我们也仿照着做了,发觉并不是很难。但想到这次课程设计做的是一套学生学籍和 成绩管理系统,我们又开始茫然了。那天,老师给我们看了一段可以让文字循环移动的 代码,这使我们产生了好奇心理,有了快速了解它的冲动。因为用面向对象的语言做特 效,这还是第一次。下课之后我把那段我们不了解的语言写的特效代码发到了VFP论坛上 请人帮忙解释,最后我们完全理解了那段代码的意思。 这次课程设计我们克服了炎热的天气(学校机房之前没装空调……后来设计完才装……),也 克服对新知识的恐惧感以及畏难情绪。我们懂得了团队合作的重要性,也懂得了团队中 如何交流、如何分工,如何集体讨论难点。我们充分利用了网络资源(技术论坛,共享的 实例等)。 我们喜欢这次课程设计的感觉,喜欢编程,喜欢团队交流。 c#数据库系统心得体会二: 在我看来,数据库课程设计主要的目标是利用课程中学到的数据库知识和技术较好的开 发设计出数据库应用系统,去解决各行各业信息化处理的要求。通过这次的课程设计, 可以巩固我们对数据库基本原理和基础理论的理解,掌握数据库应用系统设计开发的基 本方法,进一步提高我们综合运用所学知识的能力。 当我们这组决定做大学生就业咨询系统时,我们并没有着手写程序。而是大家一起商量 这个系统概述、系统目标、系统需求、业务流程分析、数据流程分析和数据词典。当这 些都准备好了之后,我们进行模块的分工。每个人都有自己的模块设计,而且写出来的 代码要求可以实现相应模块的功能,得到理想的效果。当每个人都把自己的分工做好了 ,最后会由一个人把这些全部组合搭建在一起。我们使用的是Html和php相互嵌套使用, 当一个系统做好了之后,我会好好地把程序都看一遍,理会其中的奥秘。 我所负责的是数据库的备份和还原还有一些界面的实现。还记得自己刚接触html的时候 ,觉得很感兴趣,所以有一段时间几乎到了痴迷的程度。然而Php是我刚接触不久的一种 编程语言。不过觉得它的功能真的很强大,可以开发出很多大型的系统。但是在做备份 和还原的时候,要考虑的东西还是很多的。当我遇到错误的时候,感到很受打击。值得 欣慰的是,在同学的帮助和大量参考书的查阅下,我把自己的模块做好了。这就是我收 获最大的地方。而且,我明白了遇到困难永不放弃的重要性,我知道了团队合作的重要 性,我领悟了只有坚持不懈才会取得胜利。 知识的获得是无止境的,只要你想学,只要你行动,没有什么会难倒我们的。回首这一 个多星期的课程设计,我很欣慰。因为我有了动力,有了勇气。谢谢老师对我们的不懈 帮助,谢谢学校给了我们这一次实践的机会,也谢谢组员们的关怀。这些美好的回忆美 好的东西将永远伴随着我。 c#数据库系统心得体会三: 数据库课程设计大赛的尘嚣渐渐远去,怀着对这次大赛的些许不舍,怀着对当初课程设 计开始时候的豪情万丈的决心的留恋,怀着通过这次课程设计积累的信心与斗志,我开 始写这篇文章,为自己的足迹留下哪怕是微不足道但是对自己弥足珍贵的痕迹并期望与 大家共勉。 首先,让我的记忆追溯到大二暑假,在老大的指引下(老大劝我学asp.net),我接触到m icrosoft 公司的.net产品。那个时候我已经学过vc和asp,因为windows程序设计实验的课的关系 ,接触过vb,但是没有专门去学他,因为习惯了c++里面的class,int,觉得vb的sub, var 看着就不是很顺心。我是一个好奇心很强的人,突然看到了一个号称".net是用于创建下 一代应用程序的理想而又现实的开发工具",而且主推c#语言,由于对c语言的一贯好感 ,我几乎是立刻对他产生了兴趣。我就开始了对c#的学习,任何语言都不是孤立存在的 ,所以数据交互是很重要的,暑假的时候我把我们这学期的课本数据库系统概论看了一 遍。我记得以前用c语言编程的时候,数据是在内存中申请空间,譬如使用数组等等。很 耗费内存空间。这个时候就是数据库站出来的时候啦,于是我又装上了sql server20xx,以前学a

16,743

社区成员

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

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