1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > VC6.0调用MATLAB生成的COM组件(dll方式:简单加法)

VC6.0调用MATLAB生成的COM组件(dll方式:简单加法)

时间:2021-04-15 05:39:35

相关推荐

VC6.0调用MATLAB生成的COM组件(dll方式:简单加法)

/thread-10041-1-1.html

/thread-545-1-1.html

一、

matlab下m文件

function [y,z] = myadd2(a, b)

% dummy function, just to demonstrate the idea

y = a+b;

z = a+2*b;

end

首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild-setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:

二、

mcc -W cpplib:libmyadd2 -T link:lib myadd2-C

不加 -C 不会生成libmyadd2.ctf文件

结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。

三、

创建一个Win32 Console的VC++工程,把以上四个文件拷贝到VC++工程的源代码所在目录。

接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VC++6.0中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

进行项目必要的设置(注意这里和VC有较大不同,与matlab也不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,

Additionalincludedirectories下填入如下路径

C:\Program Files\MATLAB\Ra\extern\include

点“link”选项卡,Category选择General,在下面的Object/library modules那栏的最后添加

libmyadd2.lib mclmcrrt.lib

两个库之间以及和其他库以空格隔开。

然后Category选择input,

Additionallibrarypath下填写:

C:\ProgramFiles\MATLAB\Ra\extern\lib\win32\microsoft

如图

点击OK。

至此配置完毕

在VCcpp文件中

#include "stdafx.h"后添加#include <iostream>

#include "libmyadd2.h"

return 0上面添加

std::cout << "Hello world!"<< std::endl;

if(!mclInitializeApplication(NULL,0) )

{

std::cout<< "Could not initialize theapplication!" << std::endl;

return-1;

}

// initialize lib

if(!libmyadd2Initialize())

{

std::cout<< "Could not initialize libmyadd2!"<< std::endl;

return-1;

}

try

{

// declare and initializea

mwArray a(2, 2,mxDOUBLE_CLASS);

double *aData;

aData = new double[4];

int i;

for( i=0; i<4;++i)

{

aData[i] =1.0*i;

}

// print output

std::cout<< "a = "<< std::endl;

std::cout<< aData[0]<< ",\t"<< aData[1]<< std::endl;

std::cout<< aData[2]<< ",\t"<< aData[3]<< std::endl;

a.SetData(aData, 4);

// declare and initializeb

mwArray b(2, 2,mxDOUBLE_CLASS);

b(1,1) = 11.;

b(1,2) = 12.;

b(2,1) = 21.;

b(2,2) = 22.;

mwArray y(2, 2,mxDOUBLE_CLASS);

mwArray z(2, 2,mxDOUBLE_CLASS);

// call the function

myadd2(2,y, z, a, b);

// copy data from mwArray toC++ objects

// allocate outputs

double *yData, *zData;

yData = new double[4];

if( yData == NULL )

{

std::cout<< "Failed to allocate memory foryData!" << std::endl;

return-1;

}

zData = new double[4];

if( zData == NULL )

{

std::cout<< "Failed to allocate memory forzData!" << std::endl;

return-1;

}

// copy data from mwArray toC++

y.GetData(yData, 4);

z.GetData(zData, 4);

// print output

std::cout<< "y = "<< std::endl;

std::cout<< yData[0]<< ",\t"<< yData[1]<< std::endl;

std::cout<< yData[2]<< ",\t"<< yData[3]<< std::endl;

std::cout<< "z = "<< std::endl;

std::cout<< zData[0]<< ",\t"<< zData[1]<< std::endl;

std::cout<< zData[2]<< ",\t"<< zData[3]<< std::endl;

// deallocate memory

delete [] aData;

delete [] zData;

delete [] yData;

}

catch( constmwException& e)

{

std::cerr<< e.what()<< std::endl;

}

// terminate the lib

libmyadd2Terminate();

// terminate MCR

mclTerminateApplication();

点击编译、运行即可。

也可将m文件改为:

function [y,z] = myadd2(a, b)

% dummy function, just to demonstrate the idea

y = a+b;

z = a+2*b;

x1=0:0.1:10;

y1=sin(x1);

plot(x1,y1);

msgbox("hello world!");

end

其他不变,再生成dll文件等加载到VC中,其他不变,看一下效果

在main()函数中加一句

system("pause"); //暂停作用

//////////////////////////////////////////////

也可将m文件改为:

function [y,z] = myadd2(a, b,c)

% dummy function, just to demonstrate the idea

y = a+b;

z = a+2*b;

x1=0:0.1:c;

y1=sin(x1);

plot(x1,y1);

msgbox("hello world!");

end

其他不用改,在VC的main()函数中加入:

mwArray c(1, 1,mxDOUBLE_CLASS);

c(1,1)=5;

将调用函数改为:

// call the function

myadd2(2,y, z, a, b,c);

可以了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。