正在将COM对象添加到托管代码中
Adding COM object to managed code
我有一个头文件,COM接口。我已经创建了一个小的win32程序,它可以工作,但我的主程序是用C#编写的。
所以我想在我的主程序中导入这个COM对象,但当我得到的只有头文件时,我该怎么做呢?
我找过的所有地方都需要一个tlb文件。。?
我是COM对象的新手,所以只要问一下你是否需要一些额外的信息,或者有其他解决方法:)
[更新]首先感谢所有的回复!我尝试了一些不同的方法,但还没有解决我的问题。在我的研究中,我发现了一篇描述COM互操作的文章http://msdn.microsoft.com/en-us/library/aa645736(v=vs.71).aspx#vcwlkcominteropart1clienttutorialanchor2
这对我没有帮助。但我发现,如果我能完成以下任务,我应该能够行动起来:
-
声明COM组件类:
[ComImport, Guid("7C075F7F-FD71-40a2-AC63-0D0C4DB39ECA")] class CCamera { // Cannot have any members here // NOTE that the C# compiler will add a default constructor // for you (no parameters). }
-
创建COM类包装器:
[Guid("AD87369B-3BBA-4f1c-81C5-B92FCEA9A1F4"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface ICamera { //static HRESULT GetCameraInterface(); bool StartPreview(); bool StopPreview(); }
- 使用Casts而不是QueryInterface:
尝试{CCamera cam=新的CCamera();ICamera测试=(ICamera)凸轮;//测试。StartPreview();}catch(异常e){安慰WriteLine(e.StackTrace);}
我得到一个无效的强制转换异常,那么这是因为我错过了在接口中实现一些方法吗?以及如何从c++接口实现以下方法:
static HRESULT GetCameraInterface(void __RPC_FAR *__RPC_FAR *ppvObject);
[解决方案]好吧,我得到了一个解决方案,但我从未解决包装接口的问题。相反,我创建了一个C++dll项目,并公开了我需要的方法。然后在我的C#项目中,我可以将这些方法与DllImport一起使用吗。如果有人需要更多关于我是如何存档的解释,请给我发消息。
如果它被注册为COM对象,那么您可以通过添加引用对话框导入它。右键单击项目-->添加引用。然后选择选项卡"COM",即可选择COM接口。的必需互操作类。NET将自动生成。
您需要使用以下行注册COM dll
regasm COMDll.DLL /tlb
然后您可以将其添加为对项目的引用。
我已经完成了一些研究,发现你可以像使用C一样在idl文件中包含一个头文件,下面是两个链接,向你展示如何在idl中包含头文件,并将idl编译为一个tbl文件,你可以在中使用。净:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367049(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367064(v=vs.85).aspx
我还没有尝试过,如果头文件包含的不仅仅是COM定义,那么你可能会遇到一些困难,所以祝你好运,请告诉我进展如何。
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何将默认代码添加到我在 vim 中打开的每个 cpp 文件?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 异步接口托管 - > 非托管代码
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 从本机代码返回到托管代码会损坏返回的对象
- 将自定义代码添加到Swig包装器中
- 将C++非托管代码转换为 C#
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 访问在托管代码创建的事件上对WaitforsingLeoBject拒绝
- 使用 P/Invoke 时存储非托管代码的数据
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- 从代码添加时无法单击Qt按钮
- Windows 服务导入C++非托管代码
- 正在将非托管/非托管成员添加到托管类
- 将字符串数组从托管代码编组到本机代码
- 将代码添加到 c++ winAPI 脚本时出错
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 将数据从非托管代码传递到托管代码
- 正在将COM对象添加到托管代码中