标签: queryinterface

Delphi:如何实现IUnknown的QueryInterface?

在Delphi中,IUnknown声明为:

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
Run Code Online (Sandbox Code Playgroud)

注意:输出参数是无类型的

在我的TInterfacedObject后代我需要处理QueryInterface,所以我可以返回一个支持所请求的接口的对象:

function TFoo.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
   if IsEqualGUID(IID, IFooBar) then
   begin
      Obj := (TFooBar.Create(Self) as IFooBar);
      Result := S_OK;
   end
   else
      Result := inherited QueryInterface(IID, {out}Obj);
end;
Run Code Online (Sandbox Code Playgroud)

问题就出现了:

Obj := (TFooBar.Create(Self) as IFooBar);
Run Code Online (Sandbox Code Playgroud)

德尔福抱怨:

运算符不适用于此操作数类型

显然我不知道如何或分配给无类型 out参数.我可以随意尝试,希望编译器停止抱怨:

Obj := TFooBar.Create(Self);

Obj := Pointer(TFooBar.Create(Self));

Obj := Pointer(TFooBar.Create(Self) as IFooBar);
Run Code Online (Sandbox Code Playgroud)

忽略我写的所有代码(如果需要):我如何QueryInterface在对象后代中实现TInterfacedObject


我一直试图解决的真正问题可归结为我想:

我想覆盖接口中的方法

以同样的方式:

TList = …
Run Code Online (Sandbox Code Playgroud)

delphi interface queryinterface iunknown

11
推荐指数
1
解决办法
7934
查看次数

为什么每个成功的QueryInterface()调用后跟Release()调用?

为什么QueryInterface()呼叫总是跟着Release()呼叫?例如,我看过MSDN的示例代码如下:

HRESULT hr = S_OK;
CDecoder *pObj = new CDecoder(&hr);

if (SUCCEEDED(hr))
{
    *ppv = NULL;
    hr = pObj->QueryInterface(riid, ppv);
}
pObj->Release();
return hr;
Run Code Online (Sandbox Code Playgroud)

有人可以解释Release()这里打电话的意图吗?

c++ com interface object queryinterface

11
推荐指数
2
解决办法
1万
查看次数

如何获取dll-function的id(内存地址)?

我想在C#"NvAPI_DRS_EnumProfiles"中使用来自nvapi的函数.我必须使用函数的id调用QueryInterface(id).一切都工作正常,我发现我需要在网络上的其他功能的ID,但我找不到这个单一功能的ID,我不知道如何得到它.我尝试了很多东西,甚至一个打印我内存地址的c程序也行不通.

我的代码看起来像这样:http://www.drivenbynostalgia.com/files/SOP.cs

谢谢您的帮助 :)

c# dll queryinterface memory-address nvapi

10
推荐指数
3
解决办法
4412
查看次数

Powershell如何在COM对象上查询接口

我使用Powershell创建了一个COM对象:

$obj = new-object -com MyLib.MyObj
Run Code Online (Sandbox Code Playgroud)

然后我需要查询该"MyLib.MyInterface"对象的接口,但我不知道如何使用PowerShell.

按顺序,假设我有以下C++代码

CComPtr<IInterface1> pInterface1;
CComPtr<IInterface2> pInterface2;
pInterface1->CoCreateInstance(CLSID_XXXX);   //in PowerShell: $obj = new-object -com MyLib.MyObj
pInterface1->QueryInterface(IID_YYYY, &pInterface2); //how to do this in PowerShell?
Run Code Online (Sandbox Code Playgroud)

我如何使用Powershell完成同样的工作

任何意见?

谢谢

com powershell queryinterface

9
推荐指数
2
解决办法
5155
查看次数

IUnknown :: QueryInterface()是否会增加引用计数?

如果我有IUnknown *ptr,我需要调用Release()我获得的每个接口ptr->QueryInterface(),除了ptr->Release()在完成后调用ptr吗?

我曾经认为答案是肯定的,但MSDN引用的这句话让我很困惑:

有时,您可能需要获取对象的弱引用(也就是说,您可能希望获得指向其中一个接口的指针而不增加引用计数),但是通过调用QueryInterface后跟来执行此操作是不可接受的Release.

我不明白为什么这有问题 - 如果我调用ptr->QueryInterface()然后调用Release结果指针,对象上的引用计数是否仍然是正数?这是如何导致指针无效的?

com queryinterface iunknown

7
推荐指数
2
解决办法
3654
查看次数

处理CoCreateInstance返回值

这是创建COM对象的代码示例:

CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));
Run Code Online (Sandbox Code Playgroud)

我已经看到某个地方检查是否CoCreateInstance()成功应该如下所示:

if (SUCCEEDED(hr) && pFilter != nullptr)
{
  // code goes here
}
Run Code Online (Sandbox Code Playgroud)

如果我只检查hr怎么办?这不够吗?我也应该检查一下filter != nullptr吗?

//would this be enough?
if (SUCCEEDED(hr))
{
  // code goes here
}
Run Code Online (Sandbox Code Playgroud)

这个问题还涉及其他COM方法QueryInterface().

c++ com atl queryinterface hresult

4
推荐指数
1
解决办法
1042
查看次数

什么是IconnectionPoint和EventHandling

试图了解这是什么IConnectionPoint以及如何连接到IConnectionPointContainer,IEnumConnectionPoints,IEnumConnectionsEventHandling.

阅读MSDNCodeProject中的artcicles,它解释了其他方法,如:QueryInterface()和其他方法.

我无法弄清楚所有这些东西(IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections)是如何相互关联和事件处理.

我只想创建一个simpleClient,它将触发COM对象中的事件.

如果有任何文章或代码片段可以解释事物如何通过简单和小块代码相互关联将是有帮助的.

值得一提的是我最近开始在C开发,一个初学者.

编辑@sharptooth

对于线" typically your client will receive events and the COM object will trigger those events. "

从许多文章中,我理解的是当我们在那时使用连接点时, the client exposes a set of methods that the server uses.

我只是概述来自TechRepublich的文章的一部分:

客户端服务器与接收源

因此,在标准客户端 - 服务器系统中使用COM进行正常编程和使用连接点之间的主要区别在于,在标准客户端 - 服务器情况下,服务器公开客户端使用的方法列表,并且在连接点情况下,客户端公开服务器使用的一组方法.

c++ windows com iconnectionpoint queryinterface

3
推荐指数
1
解决办法
2836
查看次数

访问冲突在XE2中强制转换IDispatch

我们正在使用一些旧代码(由Binh Ly创建的ComLib.pas),因此我们可以在(OleVariant)对象上使用枚举接口:

type
  TDispNewEnum = dispinterface
    ['{97079E31-6957-11D2-9154-0000B4552A26}'] // dummy
    property _NewEnum: IUnknown readonly dispid -4; // DISPID_NEWENUM
    function _NewEnumFunc: IUnknown; dispid -4; // DISPID_NEWENUM
  end;

procedure TEnumVariant.AttachUnknown (const Unk: IUnknown);
var
  pDisp: IDispatch;
  _NewEnumPropFailed: boolean;
  Unknown: IUnknown;
begin
  Detach;
  Unknown := Unk;
  { extract IEnumVariant }
  if (Unknown <> nil) then
  begin
    { try IEnumVariant }
    if not (Succeeded (Unknown.QueryInterface (IEnumVariant, FEnumVariant))) then
    begin
      FEnumVariant := nil;  // safety!

      { test _NewEnum prop and _NewEnum func }
      if (Succeeded (Unknown.QueryInterface …
Run Code Online (Sandbox Code Playgroud)

delphi idispatch queryinterface iunknown delphi-xe2

3
推荐指数
1
解决办法
1392
查看次数

零结果在Query/GqlQuery中

我怎么知道我的查询结果是使用Query接口还是GqlQuery接口返回零结果?使用.get()零结果会产生错误吗?如果是的话,处理它的最佳方法是什么?

python google-app-engine gql gqlquery queryinterface

2
推荐指数
1
解决办法
929
查看次数

TYPO3 extbase数据库查询

我有一个如下所示的extbase数据库查询.

$query = $this->createQuery();        
$result = $query->statement("Select * FROM table1 WHERE hidden = 0 AND deleted = 0 AND (".$PublicationYears.") AND logo != '' ORDER BY uid ASC LIMIT 0, ".$iLimit." ")->execute();             
return $result;


$PublicationYears = "ttra = '12' or ttra = '13' or ttra = '14'";
Run Code Online (Sandbox Code Playgroud)

我将此查询转换如下,

$query = $this->createQuery();

$query->getQuerySettings()->setRespectStoragePage(FALSE);

$query->matching( $query->logicalAnd(
       $query->equals('deleted', 0),
       $query->equals('hidden', 0)
    ));

$query->matching($query->logicalAnd($PublicationYears));

$query->matching($query->logicalNot(
     $query->equals('logo', '')
 ));

$query->setOrderings(array('uid' => Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING));

$query->setLimit((integer)$iLimit);
$Result = $query->execute();

return $Result;
Run Code Online (Sandbox Code Playgroud)

但结果查询不包含与之相关的查询部分,

$query->matching($query->logicalAnd($PublicationYears));
Run Code Online (Sandbox Code Playgroud)

我认为上面的查询还有其他错误.

请帮我创建正确的查询.

提前致谢.

typo3 queryinterface extbase typo3-6.2.x

2
推荐指数
1
解决办法
2279
查看次数