vc++编写的COM组件,如何可以被c#引用

马少华 2018-01-31 03:12:44
请教各位com达人,
我在https://github.com/HIT-Alibaba/COM-Example/tree/master/Plain-C%2B%2B下载了一个com的win32源码,编译,注册都没问题,vc调用也正常。CoCreateInstance方式。看了几天的代码,对com编译的基本步骤也有个初步的了解。

现在问题来了,我在c#里面测试的时候,如何才可以引用这个com组件呢,我想以引用的方式调用,并非P/Invoke的方式。这一步卡了好几天了,请试过的老司机帮帮忙。
...全文
1139 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-02-26
  • 打赏
  • 举报
回复
引用 15 楼 evionmzs 的回复:
再请教一下大家 catlmoduleT::dllregisterserver函数到底对注册表做了什么?我想实现的这是这个结果。当然这是学习研究,真正项目可能是用atl了。 注册类,注册接口,注册类库,注册类型库之类的,有没有系统一些的文章?
百度搜相关关键字。
red-fly 2018-02-26
  • 打赏
  • 举报
回复
改成控件试试? 如果改成控件,就可以直接拉到c#窗口上了,使用方便
DRACULAX05 2018-02-24
  • 打赏
  • 举报
回复
C#要引用,必须要实现IDispatch接口,建议直接用ATL的DispathImpl实现双接口
马少华 2018-02-07
  • 打赏
  • 举报
回复
再请教一下大家 catlmoduleT::dllregisterserver函数到底对注册表做了什么?我想实现的这是这个结果。当然这是学习研究,真正项目可能是用atl了。 注册类,注册接口,注册类库,注册类型库之类的,有没有系统一些的文章?
马少华 2018-02-05
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html 64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
好的,我试一下。
赵4老师 2018-02-05
  • 打赏
  • 举报
回复
在64位Windows下: 64位exe和dll在目录c:\windows\system32目录下; 32位exe和dll在目录c:\windows\syswow64目录下; 所以要注意: 在win64位系统下注册32位ocx或dll需要将32位ocx或dll拷贝到c:\windows\syswow64\目录下。 且注册要用c:\windows\syswow64\regsvr32 xxxxxxx.ocx或dll 64 位 Windows 平台注意点之文件系统重定向 http://www.cnblogs.com/jiake/p/4981555.html 64 位 Windows 平台注意点之注册表重定向 http://www.cnblogs.com/jiake/p/4956218.html
马少华 2018-02-05
  • 打赏
  • 举报
回复
引用 11 楼 Saleayas 的回复:
你到注册表里看看到底有没有,在 C# 里面直接 new Add() 就可以了。
注册表里有一些相关信息,但是没有报错的这个接口id 麻烦大神先帮我看看这个idl写得有没有问题
import "oaidl.idl";
import "ocidl.idl";
import "unknwn.idl";

[
	object,
	uuid(1221db62-f3d8-11d4-825d-00104b3646c0),
	helpstring("interface IAdd is used for implementing a super-fast addition Algorithm")
]
interface IAdd : IUnknown
{
	HRESULT     SetFirstNumber(long nX1);

	HRESULT     SetSecondNumber(long nX2);

	HRESULT     DoTheAddition([out, retval] long *pBuffer);
};



[
	object,
	uuid(6bee2d26-f3d8-11d4-825d-00104b3646c0),
	helpstring("interface  IFileIO is used for enabling the COM object to log the operations to a file.")
]
interface IFileIO : IUnknown
{
	HRESULT     EnableLog(long nEnable);
	HRESULT     IsEnabled(long *pEnabled);
};

[
	uuid(3ff1aab8-f3d8-11d4-825d-00104b3646c0),
	helpstring("Interfaces for Code-Guru algorithm implementations .")
]
library CodeGuruMathLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	interface IAdd;
	[
		uuid(9A90FE3D-17BD-4FA4-B4ED-4D17BDE92C80),
		helpstring("Breakfast Component Class")
	] 
	coclass Add
	{
		[default]interface IAdd;
	};
	interface IFileIO;
	[
		uuid(3B9A91C7-8B8F-4130-92F7-0AB2C483FC6B),
		helpstring("Breakfast Component Class")
	]
	coclass FileIO
	{
		[default]interface IFileIO;
	};
}
Saleayas 2018-02-04
  • 打赏
  • 举报
回复
你到注册表里看看到底有没有,在 C# 里面直接 new Add() 就可以了。
马少华 2018-02-03
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
你的 coclass 呢?
[
	uuid(3ff1aab8-f3d8-11d4-825d-00104b3646c0),
	helpstring("Interfaces for Code-Guru algorithm implementations .")
]
library CodeGuruMathLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	interface IAdd;
	[
		uuid(9A90FE3D-17BD-4FA4-B4ED-4D17BDE92C80),
		helpstring("Breakfast Component Class")
	] 
	coclass Add
	{
		[default]interface IAdd;
	};
	interface IFileIO;
	[
		uuid(3B9A91C7-8B8F-4130-92F7-0AB2C483FC6B),
		helpstring("Breakfast Component Class")
	]
	coclass FileIO
	{
		[default]interface IFileIO;
	};
}
这是我网上找的,现在提示com未注册。 但我用regsvr32注册组件提示成功的。
Saleayas 2018-02-03
  • 打赏
  • 举报
回复
你的 coclass 呢?
马少华 2018-02-03
  • 打赏
  • 举报
回复
import "oaidl.idl";
import "ocidl.idl";
import "unknwn.idl";

[
	object,
	uuid(1221db62-f3d8-11d4-825d-00104b3646c0),
	helpstring("interface IAdd is used for implementing a super-fast addition Algorithm")
]
interface IAdd : IUnknown
{
	HRESULT     SetFirstNumber(long nX1);

	HRESULT     SetSecondNumber(long nX2);

	HRESULT     DoTheAddition([out, retval] long *pBuffer);
};



[
	object,
	uuid(6bee2d26-f3d8-11d4-825d-00104b3646c0),
	helpstring("interface  IFileIO is used for enabling the COM object to log the operations to a file.")
]
interface IFileIO : IUnknown
{
	HRESULT     EnableLog(long nEnable);
	HRESULT     IsEnabled(long *pEnabled);
};

[
	uuid(3ff1aab8-f3d8-11d4-825d-00104b3646c0),
	helpstring("Interfaces for Code-Guru algorithm implementations .")
]
library CodeGuruMathLib
{
	importlib("stdole32.tlb");
	importlib("stdole2.tlb");

	interface IAdd;
	interface IFileIO;
}
马少华 2018-02-03
  • 打赏
  • 举报
回复
引用 6 楼 Saleayas 的回复:
告诉你一个简单的方法, 在 VS 里面编译 .idl 文件,或者使用 midl 在命令行编译 idl 文件,这样生成类型库 .tlb 文件。 使用 tlbimp 命令行生成 程序集,里面包含元数据,直接添加引用这个生成的 .dll 文件,就可以编译生成你的程序了。 在 目标机器上运行的时候,需要注册 COM 组件,只要C++ 能够调用组件,你的程序也可以。 发布的时候不需要这个生成的 .dll 文件,这个文件仅仅供编译器用的。
真是这么回事,但是发现生成的托管dll里面只有接口定义,没有类定义。难道是idl定义有问题?请指教
Saleayas 2018-02-03
  • 打赏
  • 举报
回复
告诉你一个简单的方法, 在 VS 里面编译 .idl 文件,或者使用 midl 在命令行编译 idl 文件,这样生成类型库 .tlb 文件。 使用 tlbimp 命令行生成 程序集,里面包含元数据,直接添加引用这个生成的 .dll 文件,就可以编译生成你的程序了。 在 目标机器上运行的时候,需要注册 COM 组件,只要C++ 能够调用组件,你的程序也可以。 发布的时候不需要这个生成的 .dll 文件,这个文件仅仅供编译器用的。
马少华 2018-02-01
  • 打赏
  • 举报
回复
引用 4 楼 super_admi 的回复:
估计你的COM组件注册有问题。特别注意32位和64位的注册,是不一样的。
有没有好点的文章推荐, 我就是下载上面的例子,直接编译的x86版本。然后就是将字符集改为了unicode,其它的都没动。 我系统是 server 2008 r2 x64的。
super_admi 2018-01-31
  • 打赏
  • 举报
回复
估计你的COM组件注册有问题。特别注意32位和64位的注册,是不一样的。
马少华 2018-01-31
  • 打赏
  • 举报
回复
是的,我是这样操作的,但是报错,
肯定是com,还有一些额外的操作没有完成,但不知道是什么。
super_admi 2018-01-31
  • 打赏
  • 举报
回复
COM组件注册后,直接在C#工程里,引用生成的.tlb文件即可。
Saleayas 2018-01-31
  • 打赏
  • 举报
回复
项目工程里面添加引用,添加 COM 组件就可以了。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧