从Delphi中的vidcap.h调用IKsTopologyInfo :: CreateNodeInstance

从Delphi中的vidcap.h调用IKsTopologyInfo :: CreateNodeInstance,第1张

概述我正在编写一个在Delphi中管理网络摄像头的小应用程序.我在C中使用了一段代码示例,我需要在Delphi中将其重写为我的应用程序的一部分.所有在Delphi中工作正常,除了单方法调用,它与模块’vidcap.ax’中的地址63252469处的访问冲突一起崩溃.写入地址11D206FD“消息. 以下是C示例代码的一部分(无错误处理): #include <vidcap.h> // 我正在编写一个在Delphi中管理网络摄像头的小应用程序.我在C中使用了一段代码示例,我需要在Delphi中将其重写为我的应用程序的一部分.所有在Delphi中工作正常,除了单方法调用,它与模块’vIDcap.ax’中的地址63252469处的访问冲突一起崩溃.写入地址11D206FD“消息. @H_404_7@

@H_404_7@以下是C示例代码的一部分(无错误处理):

@H_404_7@

#include <vIDcap.h>         // For ikstopologyInfo  #include <ksproxy.h>        // For iksControl  ....  //pKstopologyInfo is passed from the outsIDeiksControl *pKsControl = NulL;  DWORD DWNumNodes = 0;  pKstopologyInfo->get_NumNodes(&DWNumNodes);  for(unsigned int i = 0; i < DWNumNodes; i++)  {    pKstopologyInfo->get_NodeType(i,&guIDNodeType);    if(IsEqualGUID(guIDNodeType,KSNODETYPE_DEV_SPECIFIC))    {      hr = pKstopologyInfo->CreateNodeInstance(i,IID_iksControl,(voID **)&pKsControl);
@H_404_7@这是Delphi中我的代码的相应部分:

@H_404_7@

//KstopologyInfo is ikstopologyInfo passed from the outsIDe  //pKsControl is ^iksControl,which is taken from DirectShow9.pas from DSPack components set.KstopologyInfo.get_NumNodes(@DWNumNodes);  for i:=0 to DWNumNodes-1 do  begin    KstopologyInfo.get_NodeType(i,@guIDNodeType);    if IsEqualGUID(guIDNodeType,KSNODETYPE_DEV_SPECIFIC) then    begin      KstopologyInfo.CreateNodeInstance(i,@pKsControl);
@H_404_7@这里的错误发生在最后一行的Delphi代码中,而在C中它可以正常工作.
逐步调试期间的检查没有显示任何差异 – 在Delphi和C中,DWNumNodes得到11,然后当i == 3和guIDNodeType == {941C7AC0-C559-11D0-8A2B-00A0C9255AC1}时,IsEqualGUID返回TRUE.因此,在这两种情况下,它都使用相同的值i = 3调用CreateNodeInstance,并且IID_iksControl = {28F54685-06FD-11D2-B27A-00A0C9223196}

@H_404_7@遗憾的是,我找不到vIDcap.h转换为Delphi .pas文件,所以我为ikstopologyInfo写了我自己的描述,我想我在CreateNodeInstance方法描述中有错误.这是来自vIDcap.h:

@H_404_7@

virtual HRESulT STDMETHODCALLTYPE CreateNodeInstance(    /* [in] */ DWORD DWNodeID,/* [in] */ REFIID iID,/* [out] */ voID **ppvObject) = 0;
@H_404_7@这是Delphi的变种:

@H_404_7@

function CreateNodeInstance(DWNodeID:DWord; iID:TGuID; p:Pointer):HRESulT; stdcall;
@H_404_7@我用第三个参数 – var Obj,Pointer,PPointer(它是^ Pointer)尝试了很多变体,并尝试将不同的变量值传递给它(iksControl,^ iksControl,^(^ iksControl),指针,^指针 – 并且它们都不起作用.无论如何我得到了同样的错误.

@H_404_7@需要有关如何使其工作的任何建议,以及如何看起来正确的ikstopologyInfo.CreateNodeInstance描述并在Delphi中调用.

解决方法 根据MSDN definition of REFIID: @H_404_7@

@H_404_7@

typedef GUID IID;typedef IID* REFIID;
@H_404_7@因此REFIID是指向GUID的指针,应该被翻译为PGUID,或者,因为iID是输入参数并且似乎是必需的,所以也可以作为const TGUID传递.

@H_404_7@此外,MSDN声明在CreateNodeInstance:

@H_404_7@

@H_404_7@ppvObject receives a pointer to the requested interface on the node object. The caller must release the interface.

@H_404_7@所以第三个参数应该被声明为一个指向接口的指针,以便Delphi能够管理它.将其声明为var IUnkNown,或者作为输出参数,将其声明为IUnkNown会强制参数为IUnkNown类型的变量,因此必须将其转换为实际接口类型才能使用它.

@H_404_7@C声明

@H_404_7@

virtual HRESulT STDMETHODCALLTYPE CreateNodeInstance(    /* [in] */ DWORD DWNodeID,/* [out] */ voID **ppvObject) = 0;
@H_404_7@变

@H_404_7@

function CreateNodeInstance(DWNodeID: DWord; const iID: TGUID; ppvObject: PUnkNown): HRESulT; stdcall;
@H_404_7@可以如下调用:

@H_404_7@

var  KsControl: iksControl;KstopologyInfo.CreateNodeInstance(i,@KsControl);
总结

以上是内存溢出为你收集整理的从Delphi中的vidcap.h调用IKsTopologyInfo :: CreateNodeInstance全部内容,希望文章能够帮你解决从Delphi中的vidcap.h调用IKsTopologyInfo :: CreateNodeInstance所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237313.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存