65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MATLAB 构建 COM 组件 - 第一部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (15投票s)

2004年2月28日

6分钟阅读

viewsIcon

285898

downloadIcon

1981

构建可从任何支持 COM 的 IDE 使用 MATLAB COMBuilder 工具箱调用的 COM 组件。

什么是 MATLAB COM Builder?

MATLAB COM Builder 是 MATLAB Compiler 的一个扩展,它使用户能够自动将 MATLAB 应用程序转换为组件对象模型 (COM) 对象。开发人员可以在 MATLAB 中进行建模和分析,然后将模型转换为即用型 COM 对象。这些对象可以立即与任何基于 COM 的应用程序集成。

构建步骤

要创建简单的 COM 组件,您必须经过四个步骤。

  • 创建一个项目
  • 管理 m 文件和 MEX 文件
  • 构建项目
  • 打包和分发组件

项目包含使用 MATLAB COM Builder 构建应用程序所需的所有元素。COM Builder 组件是通过 Visual Basic、Visual C++、Delphi、Power Builder 或任何其他支持 COM 的语言访问的 COM 对象。每个 COM 对象公开一个或多个类。每个类包含一组称为方法(methods)的函数,对应于包含在组件项目中的原始 MATLAB 函数。

创建组件时,您必须另外提供一个或多个类名。组件名称表示要创建的 DLL 文件的名称。类名表示在运行时调用特定方法的类的名称。组件名称和类名之间的关系,以及哪些方法(MATLAB 函数)属于特定类,纯粹是组织上的。通常,在编译许多 MATLAB 函数时,确定函数类别方案并为每个类别创建一个单独的类会有所帮助。每个类的名称应具有描述性,说明该类做什么。

创建一个项目

创建新项目时,输入 MATLAB comtool 命令。此时将出现 MATLAB COM Builder GUI。下图显示了 GUI。

要更改项目设置,请从“项目”菜单中选择“设置”。图 2 显示了项目设置对话框。

Project Settings

组件名称是构建过程生成的 DLL 文件的名称。组件名称必须与稍后添加到项目中的任何 m 文件或 mex 文件不同。通过输入类名并按“添加 >>”按钮,可以向项目添加更多类。

注意:如果您的组件需要任何图形例程(例如 plot 函数),您必须从“编译器选项”中选择“使用句柄图形库”。

管理 m 文件和 MEX 文件

创建项目后,就可以添加与项目相关的 m 文件和 mex 文件了。您可以通过“添加文件”按钮完成此操作。编辑或删除文件非常简单。只需选择文件并按“编辑”或“删除”按钮!添加到项目中的每个对象都会显示在项目树中。

构建项目

通过收集所有必要信息,我们可以构建项目。为此,请从“构建”菜单中选择“COM 对象”或直接单击右侧窗格中的“构建”按钮。构建状态窗格将显示构建过程的状态。如果在构建过程中发生任何错误,状态窗格将显示出来。

打包和分发组件

一旦成功编译了模型并测试了 COM 对象,您就可以为分发给最终用户打包组件了。选择“组件”->“打包组件”以创建一个包含这些文件的自解压可执行文件。

文件 目的
_install.bat 自解压可执行文件运行的脚本
<组件名_项目版本>.dll 编译后的组件
mglinstaller.exe MATLAB 数学和图形安装程序
mwcomutil.dll COM Builder 实用程序库
mwregsvr.exe 在目标机器上注册 DLL 的可执行文件

自解压可执行文件的名称为 <componentname>.exe。在目标机器上运行安装程序将执行以下步骤:

  • mglinstaller 安装 MATLAB C/C++ 数学和图形库。
  • mwregsvr 注册 mwcomutil.dll 和 <ComponentName_ProjectVersion>.dll。

您必须在每台目标机器上重复此分发过程。

构建 MATLAB 组件

通过使用 MATLAB COM Builder 构建组件,开发人员可以从任何受益于 COM 功能的语言或环境(如 Visual Basic、Visual C++、Access、Excel 等)中使用它。集成 MATLAB 构建的组件的过程很简单,但通常您必须处理使用 MATLAB COM Builder 组件的任何代码中的七个项目:

  1. 向 COM Builder 对象添加类方法和属性
  2. 向 COM Builder 对象添加事件
  3. 创建类实例
  4. 调用类实例的方法
  5. 处理 vararginvarargout 参数
  6. 处理方法调用期间的错误
  7. 修改标志

向 COM Builder 对象添加类方法和属性

类属性允许对象在方法调用之间保持内部状态。MATLAB COM Builder 会自动将构成类的 M 文件共享的所有全局变量转换为该类的属性。通过在使用全局关键字声明变量时,该变量将被视为工作区中的全局变量。MATLAB m 文件充当类方法。在这种情况下,每个 m 文件都定义一个类方法。

以下是一个示例:傅里叶变换的常见用途是找到埋藏在有噪声的时域信号中的信号的频率分量。考虑以 1000 Hz 采样的数据。形成一个包含 50 Hz 和 120 Hz 的信号,并用一些零均值随机噪声对其进行干扰。通过观察原始信号很难识别频率分量。转换为频域后,通过进行 512 点快速傅里叶变换 (FFT) 来找到有噪声信号 (y) 的离散傅里叶变换。

我们可以开发两个 m 文件,一个用于向原始信号添加一些噪声,另一个用于计算功率谱(对各种频率的功率的测量)。这两个 m 文件如下所示:

AddNoise.m

function [n]=AddNoise()
global x;       %Original Signal
global y;       %Noisy Signal

if (isempty(x))
n = [];
return;
end

y = x + 2*randn(size(x));       %add some noise

subplot(211)
plot(y(1:50))
title('Signal Corrupted with Zero-Mean Random Noise')
xlabel('time (milliseconds)')

n=y;

以及 PowerSpectrum.m

function [m]=PowerSpectrum()
global x;       %Original Signal
global y;       %Noisy Signal

if (isempty(y))
m = [];
return;
end

f = 1000*(0:256)/512;
Y = fft(y,512);
Pyy = Y.* conj(Y) / 512;
subplot(212)
plot(f,Pyy(1:257))
title('Frequency content of y')
xlabel('frequency (Hz)')
m=Pyy;

第一个文件添加了一些噪声,第二个文件计算了有噪声信号的功率谱,这两个 m 文件都绘制了它们的结果。正如您所见,我们声明了两个全局变量:x, y。它们都被视为 Fourier 类的属性。稍后我们可以在 Visual Basic 中看到它们。将它们都添加到 MATLAB COM Builder 项目中(图 3)。

现在,构建组件并打开一个 IDE,例如 Visual Basic。要查看发生了什么,请打开一个新项目,然后从“项目”菜单中选择“引用”。将显示以下对话框,从列表中选择“Fourier 1.0 类型库”。正如您所见,组件的位置是我们使用 comtool 构建组件的位置。图 4 显示了项目的引用。

References of project

好的。单击您的 VB 窗体并添加以下代码:

Private Sub Form_Load()
Dim myVar As New Fourier.Fourier
Dim x(1 To 601) As Double
Dim t(1 To 601) As Double

m = 1
For i = 0 To 0.6 Step 0.001
    t(m) = i
    x(m) = Sin(2 * pi * 50 * t(m)) + Sin(2 * pi * 120 * t(m))
    m = m + 1
Next

myVar.x = x
Call myVar.addnoise(0, 0)
Call myVar.powerspectrum(0, 0)
End Sub

魔术就在这里。当您键入时,VB 会显示您的组件的方法和属性(参见图 5)。

您已成功从 MATLAB 创建了一个 COM 组件!

按 F5 查看结果。图 6 显示了结果。

尽情享用!

© . All rights reserved.