我想我已经在stackoverflow上阅读了有关此错误的所有内容,但我无法解决我的问题: 我有DirectShow PushSource Filter示例项目(.dll),我设法在VS2013中构建,还有另一个sln中的测试项目,它使用了PushSource.dll中的一些方法。 我链接了lib和一切,但无法摆脱这个链接器错误:
FilterGraphTestApp.obj:错误LNK2019:未解析的外部符号“public:static class CUnknown * __stdcall CPushSourceBitmapSet :: CreateInstance(struct IUnknown *,long *)”(?CreateInstance @ CPushSourceBitmapSet @@ SGPAVCUnknown @@ PAUIUnknown @@ PAJ @ Z )在函数_main
中引用
调用CreateInstance成员的代码:
// Get the interface for DirectShow's GraphBuilder
IUnknown *pUnk = NULL;
HRESULT *pHr = NULL;
CBaseFilter *pPSBS = (CBaseFilter*)CPushSourceBitmapSet::CreateInstance(pUnk, pHr);
pGB->AddFilter(pPSBS, L"ImagesToVideoFilter");
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
pMC->Run();
呼叫功能代码:
CUnknown * WINAPI CPushSourceBitmapSet::CreateInstance(IUnknown *pUnk, HRESULT *phr)
{
CPushSourceBitmapSet *pNewFilter = new CPushSourceBitmapSet(pUnk, phr );
if (phr)
{
if (pNewFilter == NULL)
*phr = E_OUTOFMEMORY;
else
*phr = S_OK;
}
return pNewFilter;
}
任何提示我还能尝试什么?
答案 0 :(得分:2)
示例项目为您生成了一个DLL。您不应该将它或关联的LIB链接到您的测试应用程序(FilterGraphTestApp)。试图解决引用的LNK2019将无处可寻。
相反,您应该注册DLL,以便将其自身填充到已注册的DirectShow过滤器列表中。然后使用GraphEdit以交互方式从那里实例化它,或者使用 <asp:TableCell runat="server" onload="init();" >
<canvas id="canvas" width="640" height="480" style="background-color:#FFFFFF"></canvas>
<%--<object width="640" height="480"><embed src="../Images/Animations/animation-pharmacie.swf" width="640" height="480" /></object>--%>
</asp:TableCell>
API和相应的CLSID以编程方式实例化它(或者你可以使用名字对象)。
您也可以绕过COM注册,并包含PushSource头文件以共享一些声明,对于初学者来说,这可以保留。要使用CoCreateInstance
,您将不需要示例项目的DLL,LIB。您不需要示例项目,除非您将源代码从那里借用到您自己的应用程序中并从BaseClasses目录链接文件(或由其构建产生的LIB)以在没有DLL的情况下将实现直接应用到您的应用程序中。这样CPushSourceBitmapSet::CreateInstance
就行了。
答案 1 :(得分:1)
这些都是很好的理由:
您正在使用CreateInstance,但包含此内容的类未在dll中导出。我的意思是
class __declspec(dllexport)YourClass {....}
您可以使用记事本打开dll并搜索“CreateInstance”进行检查,如果找不到,则不会导出到dll。