gpt4 book ai didi

c++ - 如何在未注册的过滤器上使用属性页?

转载 作者:太空狗 更新时间:2023-10-29 21:14:53 24 4
gpt4 key购买 nike

我使用过滤器 DS LAME 来压缩音频。我从文件“lame.ax”加载它如下:

// pPath - path to LAME "lame.ax"
HRESULT CMyFilter::CreateObjectFromPath(wchar_t *pPath, REFCLSID clsid, IUnknown **ppUnk)
{
// load the target DLL directly
if (!m_hLibFilter) m_hLibFilter = LoadLibrary(pPath);
if (!m_hLibFilter)
{
return HRESULT_FROM_WIN32(GetLastError());
}

// the entry point is an exported function
FN_DLLGETCLASSOBJECT fn = (FN_DLLGETCLASSOBJECT)GetProcAddress(m_hLibFilter, "DllGetClassObject");
if (fn == NULL)
{
return HRESULT_FROM_WIN32(GetLastError());
}

// create a class factory
IUnknownPtr pUnk;
HRESULT hr = fn(clsid, IID_IUnknown, (void**)(IUnknown**)&pUnk);
if (SUCCEEDED(hr))
{
IClassFactoryPtr pCF = pUnk;
if (pCF == NULL)
{
hr = E_NOINTERFACE;
}
else
{
// ask the class factory to create the object
hr = pCF->CreateInstance(NULL, IID_IUnknown, (void**)ppUnk);
}
}
return hr;
}

进一步

HRESULT hr = 0;
IUnknown *ppUnk = 0;
ULONG lRef = 0;
hr = CreateObjectFromPath(L"lame.ax", CLSID_LAMEDShowFilter, (IUnknown **)&ppUnk);
hr = ppUnk->QueryInterface(&m_pFilter);
lRef = ppUnk->Release();

它工作得很好。 LAME 编码音频。

我想显示过滤器设置-属性页,但是这段代码失败了

bool ShowConfigWindow(HWND hParent)
{
ISpecifyPropertyPages *pProp;
HRESULT hr = m_pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp);
if (SUCCEEDED(hr))
{
// Get the filter's name and IUnknown pointer.
FILTER_INFO FilterInfo;
hr = m_pFilter->QueryFilterInfo(&FilterInfo);
IUnknown *pFilterUnk;
m_pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk);

// Show the page.
CAUUID caGUID;
pProp->GetPages(&caGUID);
pProp->Release();
HRESULT hr = OleCreatePropertyFrame(
hParent, // Parent window
0, 0, // Reserved
FilterInfo.achName, // Caption for the dialog box
1, // Number of objects (just the filter)
&pFilterUnk, // Array of object pointers.
caGUID.cElems, // Number of property pages
caGUID.pElems, // Array of property page CLSIDs
0, // Locale identifier
0, NULL // Reserved
);

// Clean up.
pFilterUnk->Release();
FilterInfo.pGraph->Release();
CoTaskMemFree(caGUID.pElems);
}
return true;
}

我找到了 https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/jknSbMenWeM

我应该为每个属性页调用 CoRegisterClassObject,但该怎么做呢?或者什么是正确的方法?

最佳答案

OleCreatePropertyFrame 采用属性页类标识符 (CLSID),因此您需要找到一种方法让它们对 API“可见”。

CoRegisterClassObject 的使用是实现上述任务的方法之一(也许是最简单的方法,另一种方法是无注册 COM)。您需要像在第一个片段中那样检索属性页 CLSID 的 IClassFactory 指针。然后不调用 IClassFactory::CreateInstance,而是使用接口(interface)指针作为 CoRegisterClassObject API 的参数。确保您在与以下 OleCreatePropertyFrame 调用相同的线程上执行此操作。 CoRevokeClassObject 将在之后进行清理。

关于c++ - 如何在未注册的过滤器上使用属性页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39467914/

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