在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) 为什么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#"NvAPI_DRS_EnumProfiles"中使用来自nvapi的函数.我必须使用函数的id调用QueryInterface(id).一切都工作正常,我发现我需要在网络上的其他功能的ID,但我找不到这个单一功能的ID,我不知道如何得到它.我尝试了很多东西,甚至一个打印我内存地址的c程序也行不通.
我的代码看起来像这样:http://www.drivenbynostalgia.com/files/SOP.cs
谢谢您的帮助 :)
我使用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完成同样的工作
任何意见?
谢谢
如果我有IUnknown *ptr,我需要调用Release()我获得的每个接口ptr->QueryInterface(),除了ptr->Release()在完成后调用ptr吗?
我曾经认为答案是肯定的,但MSDN引用的这句话让我很困惑:
有时,您可能需要获取对象的弱引用(也就是说,您可能希望获得指向其中一个接口的指针而不增加引用计数),但是通过调用
QueryInterface后跟来执行此操作是不可接受的Release.
我不明白为什么这有问题 - 如果我调用ptr->QueryInterface()然后调用Release结果指针,对象上的引用计数是否仍然是正数?这是如何导致指针无效的?
这是创建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().
试图了解这是什么IConnectionPoint以及如何连接到IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections和EventHandling.
阅读MSDN和CodeProject中的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进行正常编程和使用连接点之间的主要区别在于,在标准客户端 - 服务器情况下,服务器公开客户端使用的方法列表,并且在连接点情况下,客户端公开服务器使用的一组方法.
我们正在使用一些旧代码(由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) 我怎么知道我的查询结果是使用Query接口还是GqlQuery接口返回零结果?使用.get()零结果会产生错误吗?如果是的话,处理它的最佳方法是什么?
我有一个如下所示的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)
我认为上面的查询还有其他错误.
请帮我创建正确的查询.
提前致谢.