草庐IT

QueryInterface

全部标签

windows - 是否值得在 QueryInterface() 实现中检查空指针?

IUnknown::QueryInterface()被传递了一个void**参数,表示放置检索到的接口(interface)的地址。STDMETHODQueryInterface(/*[in]*/REFIIDriid,/*[iid_is][out]*/void**ppvObject)QueryInterface()的实现应该检查这个指针是否为空(然后立即返回E_POINTER)还是只写在那里?我看过很多与COM相关的代码,几乎所有地方都没有执行任何检查。假设有人当然可以传递空指针作为这个参数,但真的需要这样的检查吗? 最佳答案 您(

c# - 如何获取 dll 函数的 id(内存地址)?

我想在C#“NvAPI_DRS_EnumProfiles”中使用来自nvapi的函数。我必须使用函数的id调用QueryInterface(id)。一切正常,我在网上找到了我需要的其他功能的ID,但是我找不到这个单一函数的id,也不知道怎么获取。我尝试了很多东西,甚至一个打印内存地址的c程序也没有用。我的代码看起来像这样:http://www.drivenbynostalgia.com/files/SOP.cs谢谢你的帮助:) 最佳答案 lib的NDA版本_NvAPI_Initialize150E828h_NvAPI_Unload0

java - Selenium - org.openqa.selenium.WebDriverException : f. QueryInterface 不是函数

@TestpublicvoidmyDriver()throwsIOException,InterruptedException{FirefoxDrivermyD=newFirefoxDriver();Stringvkw,vxpath,vtestdata;longiWait=1000000000;String[][]xTC,xTS;xTC=readxl("C:\\Selenium\\KDF.xls","Testcase");xTS=readxl("C:\\Selenium\\KDF.xls","Teststeps");for(inti=1;iError:-org.openqa.selen

c++ - 有什么理由反对在 QueryInterface() 实现中直接调用 AddRef() 吗?

在C++中实现IUnknown::QueryInterface()时,有几个关于指针操作的注意事项。例如,当类实现多个接口(interface)时(多重继承)explicitupcastsarenecessary:classCMyClass:publicIInterface1,publicIInterface2{};//insideCMyClass::QueryInterface():if(iid==__uuidof(IUnknown)){*ppv=static_cast(this);//upcastinordertoproperlyadjustthepointer//callAddr

c++ - 处理 CoCreateInstance 返回值

这是创建COM对象的代码示例:CComPtrpFilter;autohr=CoCreateInstance(CLSID_DMOWrapperFilter,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,reinterpret_cast(&pFilter));我在某处看到检查CoCreateInstance()是否成功应该如下所示:if(SUCCEEDED(hr)&&pFilter!=nullptr){//codegoeshere}如果我只检查hr会怎样?还不够吗?我还应该检查filter!=nullptr吗?//wouldthisbeenough?i

c++ - 使用 QueryInterface 方法的目的是什么? (Direct3D)

我明白QueryInterface是什么方法实际上是这样做的——它只返回一个指向特定接口(interface)的指针。但我的问题是,我为什么要使用这种方法?我的意思是,有什么区别QueryInterface(__uuidof(IDXGIResource),(void**)&Resource)和IDXGIResource*资源这些不是很相似吗?如果是这样,为什么我什至需要使用该方法?我应该出于什么原因使用它? 最佳答案 COM假定单个对象将提供多个接口(interface),即接口(interface)将是细粒度的,您将希望一次使用多

c# - 与 COM 中的 QueryInterface 或 C++ 中的 dynamic_cast 相比, "as"的成本是多少?

我仍在尝试将我深厚的旧知识从C/C++映射到我较浅的.Net知识。今天是时候在C#中使用“as”(隐含地“is”和cast)了。我对“as”的心理模型是,它是一个QueryInterface或dynamic_cast(一个带有指针参数的dynamic_cast,而不是引用,也就是说)对于C#。我的问题有两个方面:我的比较公平吗?与QueryInterface或dynamic_cast相比,“as”的相对成本是多少? 最佳答案 是的,比较是公平的,尤其是在处理指针时。这三个中的每一个要么成功并返回目标类型的非空指针,要么返回null。

c++ - 转换 COM 接口(interface)

我今天在我的代码中遇到了一个问题,AFAICT,通过将我的COM对象强制转换为IUnknown**导致访问冲突。它被传递到的函数执行时没有问题,但是当调用我的对象的函数之一时,它会执行一些随机函数并破坏堆栈然后死掉。指示性代码(只是忽略为什么这样做-我知道它很糟糕并且我知道如何修复它但这是一个问题,为什么会出现这样的问题):voidMyClass2::func(IMyInterface*pMyObj){CComPtrpMyObj2;HRESULThRes=pMyObj->GetInternalObject((IUnknown**)&pMyObj2);if(SUCCEEDED(hRes)

c++ - 为什么每次成功的 QueryInterface() 调用之后都是 Release() 调用?

为什么QueryInterface()调用总是跟在Release()调用之后?例如,我在MSDN上看到了如下示例代码:HRESULThr=S_OK;CDecoder*pObj=newCDecoder(&hr);if(SUCCEEDED(hr)){*ppv=NULL;hr=pObj->QueryInterface(riid,ppv);}pObj->Release();returnhr;有人可以在这里解释Release()调用背后的意图吗? 最佳答案 虽然这很常见,但并不总是像这样直接跟随。COM对象是引用计数的。当您最初创建该对象时,

c++ - 使用隐式转换而不是 QueryInterface() 进行向上转换是否合法且具有多重继承?

假设我有一个实现两个或多个COM接口(interface)的类(与here完全一样):classCMyClass:publicIInterface1,publicIInterface2{};QueryInterface()必须为同一接口(interface)的每个请求返回相同的指针(需要显式向上转换才能正确调整指针):if(iid==__uuidof(IUnknown)){*ppv=static_cast(this);//callAddref(),returnS_OK}elseif(iid==__uuidof(IInterface1)){*ppv=static_cast(this);/
12