gpt4 book ai didi

c++ - 将我的 DDiscMaster2Events 连接/链接到什么以进行驱动器更改事件。微软 COM 对象

转载 作者:行者123 更新时间:2023-11-28 06:55:35 24 4
gpt4 key购买 nike

我打算在 mingw 上实现 Microsoft 的 COM 对象 DDiscMaster2Events 以获取磁盘驱动器更改事件。我找不到这方面的任何例子。我已经让 DDiskFormat2DataEvents 正常工作,所以我希望它与此类似。在 DDiskFormat2DataEvents 中,我必须将我的 DDiskFormat2DataEvents 与 IDiskFormat2Data 连接起来才能获取事件。这通常使用 AfxConnectionAdvise 方法完成。我需要将我的 DDiscMaster2Events 事件接收器连接到什么 com 对象,以接收磁盘更改事件? Visual Studio c++ 示例应该可以回答我的问题。谢谢

最佳答案

这篇文章COM Connection Points中有一些关于如何接收COM事件的信息Thottam R. Sriram 着。

根据其内容,这样的想法可能对您有用:

#include <imapi2.h>
#include <iostream>
#include <cassert>

class DiscMaster2EventsSink : public DDiscMaster2Events {
public:
STDMETHOD(NotifyDeviceAdded)(IDispatch *object, BSTR uniqueId)
{
std::cout << "NotifyDeviceAdded(...)\n";
return S_OK;
}

STDMETHOD(NotifyDeviceRemoved)(IDispatch *object, BSTR uniqueId)
{
std::cout << "NotifyDeviceRemoved(...)\n";
return S_OK;
}

public:
// The uninteresting stuff follows...

DiscMaster2EventsSink()
: m_refCount(1)
{
}

STDMETHOD(QueryInterface)(REFIID riid, void **ppv)
{
*ppv = NULL;

if (riid == IID_IUnknown)
*ppv = static_cast<void*>(static_cast<IUnknown*>(this));
else if (riid == IID_IDispatch)
*ppv = static_cast<void*>(static_cast<IDispatch*>(this));
else if (riid == __uuidof(DDiscMaster2Events))
*ppv = static_cast<void*>(static_cast<DDiscMaster2Events*>(this));

if (*ppv) {
AddRef();
return S_OK;
}

return E_NOINTERFACE;
}

STDMETHOD_(ULONG, AddRef)()
{
return InterlockedIncrement(&m_refCount);
}

STDMETHOD_(ULONG, Release)()
{
ULONG result = InterlockedDecrement(&m_refCount);
if (result == 0)
delete this;
return result;
}

STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
return E_NOTIMPL;
}

STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{
return E_NOTIMPL;
}

STDMETHOD(GetTypeInfoCount)(UINT *pctinfo)
{
*pctinfo = 0;
return S_OK;
}

STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
return E_NOTIMPL;
}

private:
ULONG m_refCount;
};

int main()
{
HRESULT hr;

hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
assert(SUCCEEDED(hr));

IDiscMaster2* pDiscMaster2;
hr = CoCreateInstance(__uuidof(MsftDiscMaster2), NULL, CLSCTX_ALL, __uuidof(IDiscMaster2), (void**)&pDiscMaster2);
assert(SUCCEEDED(hr));

IConnectionPointContainer* pCPC;
hr = pDiscMaster2->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
assert(SUCCEEDED(hr));

IConnectionPoint* pCP;
hr = pCPC->FindConnectionPoint(IID_DDiscMaster2Events, &pCP);
assert(SUCCEEDED(hr));

DiscMaster2EventsSink* pSink = new DiscMaster2EventsSink();

IUnknown* pSinkUnk;
hr = pSink->QueryInterface(IID_IUnknown, (void**)&pSinkUnk);
assert(SUCCEEDED(hr));

DWORD dwAdvise;
hr = pCP->Advise(pSinkUnk, &dwAdvise);
assert(SUCCEEDED(hr));

std::cout << "OK...\n";
std::cin.get();

pSinkUnk->Release();
pSink->Release();
pCP->Release();
pCPC->Release();
pDiscMaster2->Release();
CoUninitialize();
return 0;
}

据我所知,它编译并运行良好(一直是 S_OK),但我看不到任何事件 - 可能是因为我没有外部光驱来创建任何设备添加/删除事件。

(同样显然,使用一些 C++ COM 辅助类会更好。)

希望它仍然可以帮助您,也许即使在 MinGW 下也有一些变化。

关于c++ - 将我的 DDiscMaster2Events 连接/链接到什么以进行驱动器更改事件。微软 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23230473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com