C#调用手动编写的COM组件
手动创建一个非ATL向导生成的COM组件,添加的接口定义文件MyIDL.idl代码如下:(修改自“COM原理与应用源代码\ch3\DictComp\"例子)
import "oaidl.idl";
import "ocidl.idl";
#include <olectl.h>
typedef unsigned short *String;
[
object,
uuid(7A8B9348-B427-45A0-9BE8-E3E6978A1ECA),
helpstring("interface IAdd is used for implementing a super-fast addition Algorithm")
]
interface IDictionary : IUnknown
{
HRESULT Initialize();
HRESULT LoadLibrary(String);
HRESULT InsertWord(String, String);
HRESULT DeleteWord(String) = 0;
HRESULT LookupWord(String, String *);
HRESULT RestoreLibrary(String);
HRESULT FreeLibrary();
};
[
object,
uuid(855F837A-BC5E-47E2-AD94-87614C76BC52),
helpstring("interface IFileIO is used for enabling the COM object to log the operations to a file.")
]
interface ISpellCheck : IUnknown
{
//
HRESULT CheckWord(String, String*);
};
// {013D57F2-78E8-49BF-8F86-EE128CD68966}
// static const GUID <<名称>> =
// { 0x13d57f2, 0x78e8, 0x49bf, { 0x8f, 0x86, 0xee, 0x12, 0x8c, 0xd6, 0x89, 0x66 } };
[
uuid(013D57F2-78E8-49BF-8F86-EE128CD68966),
helpstring("Interfaces for Code-Guru algorithm implementations .")
]
library CodeGuruMathLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
interface IDictionary;
interface ISpellCheck;
}
编译后生成DictComp.tlb类型库文件。之后一直找不到在C#中使用的方法,于是,在论坛发帖问 http://bbs.csdn.net/topics/391914099过之后,又在谷歌中找到了一些说明 http://stackoverflow.com/questions/5834100/import-tlb-into-c-sharp。见下图。注意,工具的路径,操作完提示成功。
之后在C#项目中添加引用,tlb文件就可以用了。项目源码地址:供参考。
C#引用后,如图。
现在还存在的问题是:
导出的类是接口,(抽象类,还没实现函数功能,而已经实现功能的类,没法在C#中使用)。
怎么在C#中调用COM,比如像C++调用一样。能使用COM接口函数如:DllGetClassObject来创建和使用COM组件。如果谁知道,请留言告诉我