积极答复者
C# 调用 C++创建的COM组件 出现 Error

问题
答案
-
谢谢 DroidXgnaW 大神你的热心帮助我已经很开心了,在论坛还是有很多人愿意分享
现在好像还有一种调用COM组件的方式我在研究:
我尝试编写了下代码
如下述代码:
[ComImport, Guid("85F5CF11-2A25-4ef9-8F7C-8C3F14A0860A")] class FilgraphManager { } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("07C4A7BC-BBD1-4ced-80A5-A76377929F35")] public interface IIncr { void Add([In] int nOp1, [In] int nOp2, ref int pret); } class Program { static void Main(string[] args) { FilgraphManager g = new FilgraphManager(); IIncr i = (IIncr)g; int t = 90; i.Add(1,2,ref t); Console.WriteLine("t is " + t); } }
可是还是有错误,我想我还没理解的足够好,ComImport和组件的CLSID
来调用组件的接口方法
我还在尝试,希望我能慢慢进步,
真的非常感谢你!
http://www.qingfengju.com/article.asp?id=84
你是按照这种方式来建立的 COM 项目吧!
- 已标记为答案 Wayne1900 2014年2月19日 3:11
全部回复
-
我也尝试过从COM选项卡中找到mycom.dll然后添加可是直接就会报错误
http://www.soaspx.com/dotnet/csharp/csharp_20100511_4287.html
有个 ProgId,从 COM 选项卡中可以找到。
-
我尽可能详细的叙述两种添加 COM 组件引用的方式:
1、在添加引用的对话框中直接选择 mycom.dll 文件。
我假设你的 mycom.dll 的全路径为 D:\ComTest\mycom.dll,在命令行(管理员权限启动)输入并回车:
regsvr32.exe /i D:\ComTest\mycom.dll
在添加引用的对话框中,选择“浏览”,然后找到 D:\ComTest\mycom.dll 文件,选中,并点击确定。
这里的要点就是,你注册的 COM 组件的路径(在注册表中通过 InprocServer32 键值查看)同你引用的 COM 组件的路径要一致。
2、在添加引用的对话框中通过 COM 类型库选择。
在 COM 选项框中显示的名称为 COM 组建的类型库的名称,我假设你的 COM 组件是通过 ATL 的方式建立,那么在 .idl 文件中,找到你的类型库定义,它的结构应该如下:
[
object,
uuid(16299BDF-F3B3-4A82-815C-A71E37512411),
dual,
nonextensible,
helpstring("Imycomxxxxx Interface"),
pointer_default(unique)
]
interface Imycomxxxxx : IDispatch{// 方法省略。
};
[
uuid(AEEFDC84-3E26-4313-B803-546B3954BD30),
version(1.0),
helpstring("mycom 1.0 Type Library") // 这里设置的字符串就是显式在 COM 选项框中的名称。
]
library mycomLib
{
importlib("stdole2.tlb");// 接口、事件省略
};
-
对于第二种方式:
我的COM组件不是通过ATL方式建立,没有下述的SourceCode
[
uuid(AEEFDC84-3E26-4313-B803-546B3954BD30),
version(1.0),
helpstring("mycom 1.0 Type Library") // 这里设置的字符串就是显式在 COM 选项框中的名称。
]
library mycomLib
{
importlib("stdole2.tlb");// 接口、事件省略
};
Sorry,这无法进行有效的参考
- 已编辑 Wayne1900 2014年2月19日 2:29
-
对于第二种方式:
我的COM组件不是通过ATL方式建立,没有下述的SourceCode
[
uuid(AEEFDC84-3E26-4313-B803-546B3954BD30),
version(1.0),
helpstring("mycom 1.0 Type Library") // 这里设置的字符串就是显式在 COM 选项框中的名称。
]
library mycomLib
{
importlib("stdole2.tlb");// 接口、事件省略
};
Sorry,这无法进行有效的参考
MFC 编写 COM 组件,它也有 .idl 文件。
难道都不是?你没用任何框架,纯手工编写的?
-
对的,我都是自己纯手工写的,因为我入门所以我根据教程自己完全手工创建了COM组件
在我的Debug目录下没有。idl文件,如图:
我一直无法C#调用COM组件成功,如上面的错误,显示可能是无效的COM组件;
可是我在我的C++工程里能成功调用这个COM组件的啊?
我不理解了
.idl 文件在源代码中,不在输出目录。
你的问题是没有正确的 Type library 。
没有 Type library 的情况下,在 C# 中,你也可以通过 DllImport CoCreateInstance 而不是通过引用来调用 COM 组件。
我的水平不够,还没有办法不依赖 MFC 或 ATL 来独立创建 COM 项目。所以如果你不将项目切换到 MFC 或 ATL 上来的话,我恐怕无法帮你解决问题。
-
谢谢 DroidXgnaW 大神你的热心帮助我已经很开心了,在论坛还是有很多人愿意分享
现在好像还有一种调用COM组件的方式我在研究:
我尝试编写了下代码
如下述代码:
[ComImport, Guid("85F5CF11-2A25-4ef9-8F7C-8C3F14A0860A")] class FilgraphManager { } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("07C4A7BC-BBD1-4ced-80A5-A76377929F35")] public interface IIncr { void Add([In] int nOp1, [In] int nOp2, ref int pret); } class Program { static void Main(string[] args) { FilgraphManager g = new FilgraphManager(); IIncr i = (IIncr)g; int t = 90; i.Add(1,2,ref t); Console.WriteLine("t is " + t); } }
可是还是有错误,我想我还没理解的足够好,ComImport和组件的CLSID
来调用组件的接口方法
我还在尝试,希望我能慢慢进步,
真的非常感谢你!
-
谢谢 DroidXgnaW 大神你的热心帮助我已经很开心了,在论坛还是有很多人愿意分享
现在好像还有一种调用COM组件的方式我在研究:
我尝试编写了下代码
如下述代码:
[ComImport, Guid("85F5CF11-2A25-4ef9-8F7C-8C3F14A0860A")] class FilgraphManager { } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("07C4A7BC-BBD1-4ced-80A5-A76377929F35")] public interface IIncr { void Add([In] int nOp1, [In] int nOp2, ref int pret); } class Program { static void Main(string[] args) { FilgraphManager g = new FilgraphManager(); IIncr i = (IIncr)g; int t = 90; i.Add(1,2,ref t); Console.WriteLine("t is " + t); } }
可是还是有错误,我想我还没理解的足够好,ComImport和组件的CLSID
来调用组件的接口方法
我还在尝试,希望我能慢慢进步,
真的非常感谢你!
http://www.qingfengju.com/article.asp?id=84
你是按照这种方式来建立的 COM 项目吧!
- 已标记为答案 Wayne1900 2014年2月19日 3:11
-
对的,我的实现就是按照上述的方式实现的,可以去我的源码看,完全就是这种方式所以没有.tlb文件
http://www.qingfengju.com/article.asp?id=84
我已经给出链接了,里面最后一句话已经说了:这样实现的COM组件没有类型库(.tlb文件)。
你可以手动添加 IDL 了文件:
http://blog.sina.com.cn/s/blog_53a14a750100gsdx.html