koko1120 发表于 2010-5-30 20:52:02

VC++中调用MATLAB产生的图形失败,请教高手

本帖最后由 koko1120 于 2010-5-30 20:54 编辑

问题一:因为是新手,首次尝试,请问这种利用MATLAB compiler生成的dll文件的方法能在不装MATLAB的机子上独立运行吗?或者需要装什么辅助道具?

问题二:VC是怎么调用MATLAB通过mcc产生的dll文件的,下面是我的代码

硬件VC++6.0和MATLAB 2007b ,XP SP2

matlab'函数:

function y = class_compiler_func(f)
    t = linspace(0,1,400);
    y = sin(2*pi*f*t);
    plot(t,y);
end

我的第一步:
class_compiler_func.ctf
class_compiler_func.dll
class_compiler_func.h
class_compiler_func.lib
以上是matlab mcc后产生的文件,我将它们拷贝到了我的工程文件夹下面,工程名是MCC

我的第二步:
就是建立一个exe工程,有一个窗口,只有一个确定按钮
按确定后跳出一个图
主要是在dlg的cpp文件中的初始化部分添加

// TODO: Add extra initialization here
if (!mclInitializeApplication(NULL,0))
{
MessageBox("Could not initialize the application!");
return FALSE;
}

if (!class_compiler_funcInitialize())
{
MessageBox("Could not initialize the library!");
return FALSE;
}

return TRUE;// return TRUEunless you set the focus to a control
}
然后再最后面两个消息函数
void CCMCDlg::OnOK()
{
// TODO: Add extra validation here
double fValue = 1.0; //Hz
mxArray *f;
mxArray *y = NULL;

f = mxCreateDoubleMatrix(1,1,mxREAL);
memcpy(mxGetPr(f), &fValue, sizeof(double));
mlfClass_compiler_func(1, &y, f);

mclWaitForFiguresToDie(NULL);

mxDestroyArray(f); f = NULL;
mxDestroyArray(y); y = NULL;
//CDialog::OnOK();
}
void CCMCDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
class_compiler_funcTerminate();
mclTerminateApplication();
   

    CDialog::OnClose();
}

我的第三步是设置VC设置:
在VC++ IDE 中选择Tools->Options->Directories
设置<我的Matlab根目录>\extern\include\
设置<我的Matlab根目录>\extern\lib\win32\Microsoft

Project->Setting->link下
在general下面的object/library modules下面添加了mclmcrrt.lib 和我matlab产生的那个lib

执行后,出错显示Could not initialize the library!");为什么,我是按照视频教程做的,为什么视频里面成功了,我确报错,高手请教

taohe 发表于 2010-5-30 21:53:22

问题一:因为是新手,首次尝试,请问这种利用MATLAB compiler生成的dll文件的方法能在不装MATLAB的机子上独立运行吗?或者需要装什么辅助道具?

问题二:VC是怎么调用MATLAB通过mcc产生的dll文件的,下面是我的代 ...
执行后,出错显示Could not initialize the library!");为什么,我是按照视频教程做的,为什么视频里面成功了,。。。

koko1120 发表于 2010-5-30 20:52 http://forum.simwe.com/images/common/back.gif

关于问题一:简短的回答是“可以”。你需要在目标电脑上安装MCR。这个问题在论坛上已经讨论很多次了。这里就不再重复了。

关于问题二:你是如何“执行”的?是在VC里面环视在Windows的文件管理器了?试试把那个ctf文件以及dll文件拷贝到VC程序的编译目录中(Debug或Release),也就是和产生的可执行文件在相同的目录。另外,是什么视频啊?

koko1120 发表于 2010-5-30 21:57:22

2# taohe

谢谢,朋友,我现在又试了下,现在居然可以实现了,但是我单独到debug里面点击exe文件,居然失败,说找不到dll文件,真是纳闷,请教朋友,视频是ilovematlab论坛上的一个VC与matlab混编的视频,问题我已经发到论坛上,谢谢,麻烦您了

taohe 发表于 2010-5-30 22:08:07

嗯,找不到dll应该很好理解:因为需要的那个dll文件不再当前目录,也不在系统的PATH环境变量设置中。你的dll是在当前VC工程文件的目录中。

而如果在VC里执行编译好的exe文件时,当前的VC工程所在目录也是一个有效的目录。

另外,如果真想用混编技术解决实际问题的话,需要多看点文档或者参考资料。

koko1120 发表于 2010-5-30 22:12:52

4# taohe

您说的很有道理,我学习,今天总算有点收获,至少通过一个例子,对一个模糊的东西有点概念了,我知道这样有点急功近利,但是主要是我不知道该如何下手,我现在应为赶时间想把我给你的那个方案做出来,所以有点着急了,不好意思啊,朋友,谢谢了
页: [1]
查看完整版本: VC++中调用MATLAB产生的图形失败,请教高手