如何:将本机 COM 服务器用于 TLBIMP
更新:2007 年 11 月
与其他 .NET 语言不同,Visual C++ 提供允许直接使用非托管函数(包括 COM 接口)的 Interop 功能。利用这一点,开发人员可以避免 Tlbimp.exe 及其缺点。有关更多信息,请参见使用 .NET 中的本机 COM 服务器。
本主题演示如何通过托管代码 类型库导入程序 (Tlbimp.exe) 工具使用 COM 对象。如果给定一个 COM 类型库(或包含 COM 组件和类型库的 DLL),此 .NET Framework 工具会生成可由任何 .NET 语言使用的托管互操作程序集。但是,不建议 Visual C++ 程序员使用此技术(特别是处理大型和/或复杂的 COM 类型库时)。
下面的示例包含使用 Quartz.dll 中定义的 COM 接口时所需的步骤和代码,Quartz.dll 安装在 Windows XP 的 Windows/System32 目录中。这些接口封装了 DirectShow 功能,允许播放 AVI 文件。若要从命令行执行 Tlbimp.exe,需要通过执行 C:\Program Files\Microsoft.NET\SDK\v2.0\Bin 目录中的 Sdkvars.bat 将 .NET Framework 工具添加到系统路径中。
生成互操作程序集
在命令提示窗口中,在 c:\windows\system32 目录中执行 tlbimp quartz.dll 命令。(得到的互操作程序集名称以 COM 类型库的名称为基础;在此示例中,得到的文件为 QuartzTypeLib.dll。)
将互操作程序集移动到特定的目录中,使用该互操作程序集的应用程序将在此执行。
示例
下面的代码定义一个控制台应用程序,该应用程序使用前面生成的互操作程序集显示一个 AVI 文件。
使用有效的 AVI 文件名称执行得到的 .exe 文件,该文件将在窗口中呈现。
// AVIPlayer.cpp
// compile with: /clr
#using <QuartzTypeLib.dll>
using namespace QuartzTypeLib;
using namespace System;
void DisplayUsage() {
Console::WriteLine("AVIPlayer: Plays AVI files.");
Console::WriteLine("Usage: AVIPlayer.EXE <filename>");
}
int main() {
array<String^>^ args = Environment::GetCommandLineArgs();
if (args->Length != 2) {
DisplayUsage();
return 0;
}
String^ filename = args[1];
if (filename->Equals("/?")) {
DisplayUsage();
return 0;
}
FilgraphManager^ graphManager = gcnew FilgraphManager();
IMediaControl^ mc = dynamic_cast<IMediaControl^>(graphManager);
mc->RenderFile(filename);
mc->Run();
Console::WriteLine("press any key");
Console::ReadLine();
}