设为首页 加入收藏

TOP

VC 调用托管程序集(.Net Managed Assemblies) (二)
2014-11-23 19:22:45 】 浏览:446
Tags:调用 托管 程序 .Net Managed Assemblies
程序集,以及一个同名的 .tlb 文件。

当然你也需要了解下怎样使用命令行工具来实现,毕竟配布到用户机上时会用到。这里介绍下程序集注册工具 (Regasm.exe),VS 实际上帮我们运行了以下命令:

[plain]
regasm myTest.dll /tlb:myTest.tlb

regasm myTest.dll /tlb:myTest.tlbMSDN 官方描述为:注册 myTest.dll 中包含的所有公共类,并生成和注册类型库 myTest.tlb,该类型库包含 myTest.dll 中定义的所有公共类型的定义。

COM 类注册自然是更新注册表了,那配布的时候用户机上同样需要更新注册表,那么怎样知道需要更新哪些信息呢?Regasm.exe 会告诉你:

[plain]
regasm myTest.dll /regfile:myTest.reg

regasm myTest.dll /regfile:myTest.reg
这个命令会生成一个注册表文件,需要更新的内容都在里面了。好了该说 VC 怎样调用了。

VC 调用托管程序集
方便起见我们用空的一个命令行 VC 工程来说明步骤。

1 添加 import 声明,并生成 com 接口
在 .cpp 文件中添加以下内容并编译(生成物中会包含一个 .tlh 的头文件):

[cpp]
#import "myTest.tlb" named_guids raw_interfaces_only

#import "myTest.tlb" named_guids raw_interfaces_onlyPS:这里的文件路径可以是绝对路径,也可以是相对路径。

如果你还引用到一些 .NET 类库中的类型那么也需要追加 import 声明,譬如使用了 System.Drawing 中的类型,那么要追加:

[cpp]
#import "C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.tlb" named_guids raw_interfaces_only

#import "C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.tlb" named_guids raw_interfaces_only2 代码调用
[cpp]
HRESULT hRes;
hRes = CoInitialize(NULL); // 初始化 Com

MyTest::IMediaPtr pIMedia(__uuidof(MyTest::Media)); // 使用智能指针实例化对象

pIMedia->LoadMedia(::SysAllocString(L"d:\\aaa.png")); // 调用方法,OK

MyTest::IMediaInfoPtr pIMediaInfo = pIMedia->GetInfo(); // 调用方法并返回值,NG

CoUninitialize(); // 终止初始化 Com

HRESULT hRes;
hRes = CoInitialize(NULL); // 初始化 Com

MyTest::IMediaPtr pIMedia(__uuidof(MyTest::Media)); // 使用智能指针实例化对象

pIMedia->LoadMedia(::SysAllocString(L"d:\\aaa.png")); // 调用方法,OK

MyTest::IMediaInfoPtr pIMediaInfo = pIMedia->GetInfo(); // 调用方法并返回值,NG

CoUninitialize(); // 终止初始化 Com调用没有返回值的方法时一切正常,调用有返回值的方法时你会发现函数定义被改写了,这是什么情况?原来从 .NET 程序集转换为 com 时,如果有返回值,这个返回值将作为ref参数追加在该函数之后,而返回值会用来返回 HRESULT。这虽然没啥大问题,但用起来却大大的不爽,想用回原来调用方式的情看下文。

托管程序集(.Net Managed Assemblies)再修改
[csharp]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IMedia))]
public class Media : IDisposable, IMedia
{
// 略

[PreserveSig]
public MediaInfo GetInfo()
{ ... }
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IMedia))]
public class Media : IDisposable, IMedia
{
// 略

[PreserveSig]
public MediaInfo GetInfo()
{ ... }
}

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇vc++笔记----CRecordset类 下一篇vc++笔记-----MFC环境下的多任务..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目