
#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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)