我试图弄清楚为什么会发生这种错误并确定是否可以阻止它。
所以,这都是在Windows XP Pro SP3上运行的VS2008中。我正在为名为FalconView 4.1.1.6的映射应用程序编写插件工具栏DLL。 FalconView(fvw.exe)是一个activex应用程序。工具栏通常工作正常,除了偶尔会出现颈部疼痛(我收到的错误信息是在这个问题的最后,因为它很长)。
我有时可以通过在测试笔记本电脑上安装我们软件的发行版本,用调试DLL替换发行版DLL(用于测试目的),卸载工具栏,然后安装工具栏的下一个版本来强制显示此错误消息。轰,有错误。写入和调试时也会发生错误,但不太可预测。我可以通过从项目中删除对fvw的引用,退出vs2008,取消注册Interop.fvw.dll的所有副本(从FalconView提供的tlb文件生成),运行“fvw / regserver”,重新加载,在我的开发机器上解决这个问题。该项目,并将Interop.fvw.dll添加回项目。太痛苦了!这里发生了什么?有办法防止这种情况吗?
谢谢!
有问题的错误: System.InvalidCastException:无法将类型为'fvw.MapClass'的COM对象强制转换为接口类型'fvw.IMap'。此操作失败,因为对IID为“{E353BC6C-E8AB-11D3-80B9-00C04F60B086}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) 。 at System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr,Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture,String [] namedParameters) at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams) at System.RuntimeType.ForwardCallToInvokeMember(String memberName,BindingFlags flags,Object target,Int32 [] aWrapperTypes,MessageData& msgData) at fvw.MapClass.GetElevation(Double lat,Double lon,Int32& elevation) 在Toolbar.rpuav_com.SendElevationData(Hub Station)
请注意{E353BC6C-E8AB-11D3-80B9-00C04F60B086}在我查找时位于注册表中。
答案 0 :(得分:2)
Uggg ......我真的希望我不会回答我自己的问题。某种程度上感觉很错误。
无论如何,问题在于使用了Interop.fvw.dll文件。我们应该使用FalconView提供的那个(使用也提供的fvw.tlb构建)。我们的项目引用了dll和Visual Studio在构建我们的插件的Release版本时将它复制到我们的release文件夹,并在我们调试时复制到Program Files文件夹。不知何故,我不明白这一点,一个新的Interop.fvw.dll被生成(可能是一个实习生,其他员工,或者只是魔术?),血腥的东西在问题项目中被“卡住”。
如何判断重新生成新的interop dll?公钥标记全为零,而FalconView制造商的公钥标记为实际数字。现在,只要他们也签署他们的集会。
我的修复是:
感谢大家的帮助!非常感谢!
答案 1 :(得分:1)
我有时可以通过安装版本来强制显示此错误消息 我们在测试笔记本电脑上的软件版本,取代了发行版DLL 使用调试DLL(用于测试目的),卸载工具栏,和 然后安装下一个版本的工具栏。热潮,有 错误。
类型库导出器(和Visual Studio)为类型库ID和类ID生成的GUID使用程序集版本作为哈希的一部分。因此,如果您的程序集版本更改(即使它只是构建版本或修订版本号)将导致这些GUID更改。如果您的AssemblyVersionAttribute
设置为自动生成的版本号(如1.0。*),则必须注意这一点。
要避免此问题,请将程序集设置为具有静态版本号,或使用类和接口上的[Guid]
属性指定自己的GUID。
答案 2 :(得分:0)
正在抛出/返回E_NOINTERFACE
,因为所谓的接口未实现。通常,当您QueryInterface
来自非NULL
但未实现接口的对象时,就会发生这种情况。也就是说,它完全是应用程序特定的,不太可能与注册表设置相关。由于它是您的应用程序,您可以调试并查看您正在查询fvw.IMap
的确切内容以及为什么它不会公开相关接口。
答案 3 :(得分:0)
我要走出困境并说E_NOINTERFACE错误来自于试图将对象从一个线程编组到另一个线程。
检查以确保为您尝试编组的接口注册了代理/存根DLL。