青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

振動理論

我的C++實現之路

基于ole的VC和matlab混合編程方法

原創文檔 本文最初發表于VC知識庫

運行環境:VC++ 6.0 MATLAB6.5 Windows XP

  此方法的實現是在網上各位前輩的基礎上完成的。特別是參考了哈工大振動論壇上的一篇文章,現在,就具體談一下怎么把一個M文件或MEX文件,做成可以脫離MATLAB環境的COM組件,并且被VC++調用。

1. 首先,設置合適的編譯器。在MATLAB命令窗口里敲:>>mbuild –setup,完成編譯器的設置。

>>mbuild –setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc C version 2.4 in D:\MATLAB6P5\sys\lcc
[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio
[0] None
Compiler: 2
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:\Program Files\Microsoft Visual Studio
Are these correct?([y]/n): y
The default options file:
"C:\Documents and Settings\lilixin\Application Data\MathWorks\MATLAB\R13\compopts.bat"
is being updated from D:\MATLAB6P5\BIN\WIN32\mbuildopts\msvc60compp.bat...
--> "D:\MATLAB6p5\bin\win32\mwregsvr D:\MATLAB6p5\bin\win32\mwcomutil.dll"
DllRegisterServer in D:\MATLAB6p5\bin\win32\mwcomutil.dll succeeded
--> "D:\MATLAB6p5\bin\win32\mwregsvr D:\MATLAB6p5\bin\win32\mwcommgr.dll"
DllRegisterServer in D:\MATLAB6p5\bin\win32\mwcommgr.dll succeeded
Installing the MATLAB Visual Studio add-in ...
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\template\MATLABWizard.awx
from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.awx
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\template\MATLABWizard.hlp
from D:\MATLAB6P5\BIN\WIN32\MATLABWizard.hlp
Updated C:\Program Files\Microsoft Visual Studio\common\msdev98\addins\MATLABAddin.dll
from D:\MATLAB6P5\BIN\WIN32\MATLABAddin.dll
Merged D:\MATLAB6P5\BIN\WIN32\usertype.dat
with C:\Program Files\Microsoft Visual Studio\common\msdev98\bin\usertype.dat 

2. 設置系統路徑。我的電腦->屬性->高級->環境變量->系統變量->Path選項,增加以下路徑:
頭文件:
d:\MATLAB6p5\extern\include;
庫:
d:\MATLAB6p5\extern\lib\win32\microsoft\msvc60;
DLL:
d:\MATLAB6p5\bin\win32

3. 做一個簡單的M函數(只能是函數不能是文件)。文件名和函數名一致。運行并測試此文件的正確性。
function [out]=arraytest(A)
out=det(A);
B=[A(1,1),A(1,2),A(2,1),A(2,2)]%本來是plot(A),剛開始沒能把數據傳遞好,做了個B陣,做測試用的,
%因為com做好了,就沒有改了,要不有很多垃圾
plot(B);

4. 在命令窗口敲comtool,出現com組件builder。選擇FILE選項->New Project選項。出現以下界面。

Component name選項:設置com組件的名稱,注意不要和上面添加的m文件重名。
Class name選項:設置類名稱MyArraytest。一般將鼠標點擊空白位置,系統會自動生成類名。
Project version選項:版本號。系統默認為1.0,將來要修改或添加其他函數時,可以修改此選項為2.0,3.0等。
Project directory選項:工程所在目錄。
Complier options選項:編譯器配置選項,全部選中。
最后單擊OK。系統會出現對話框,問你是否創立工程目錄,你選YES。

5. 單擊Project Files->plotclass->M-files,然后選中comtool菜單Project->Add File選項,添加上面寫好的plot_test M函數,當然,可以按需要添加更多的M或MEX函數。

6. 單擊Build按鈕,選中Com Object選項,這時com-builder會幫你自動編譯連接該組件,生成所需要的頭文件,源文件,接口描述文件,動態連接庫文件,等等。在右側Build Status顯示框里給出了編譯的過程和信息。在菜單Component->Component Info里有關于接口、類、庫的信息。在d:\MATLAB6p5\work\Myarraytest文件夾里,出現了兩個子文件夾,distrib和src,這是我們VC中需要用到的文件、庫、資源、接口等。在src\plot_idl_i.c中,有關于com類和com接口的GUID。其中CLSID(類的GUID)在VC編程中需要用到。別急,還有一步打包發布。選擇Component->Package Component,系統就會自己幫你打包了。打包文件在distrib文件夾中有Myarraytest可執行文件??截恉:\MATLAB6p5\work\Myarraytest文件夾下所有文件,在另外一個機器上,雙擊Myarraytest可執行程序,注冊com組件,。你的程序,就可以在其他機器上執行了。

7. 打開VC++編譯器,選擇文件->新建->工程->MFC(exe)->命名(newoletest)-對話框->完成(曾經做個幾個測試程序,沒成功,名字可以自己寫)。刪除確定和取消按鈕,新建一個按鈕,我直接使用了ok按鈕,刪除了取消,把ok按鈕中原來的程序刪掉了。

8. 打開類向導,在 Add Class選項內,選中From a typed library,進入d:\MATLAB6p5\work\Myarraytest\src文件夾,選中myarraytest_idl.tlb文件,點擊打開,OK。這時一個COM類便加入進來了,查看一下為IMyarraytest類。

9. 下面就是OLE調用的基本方法了。首先在 CNewoletestApp類的InitInstance()里添加初始化OLE代碼。

BOOL suc=AfxOleInit(); // 初始化OLE

if (suc==FALSE)
{
::AfxMessageBox("初始化OLE失敗!");
 }
  其次,在 CNewoletestDlg里包含plot_idl.h頭文件;并從d:\MATLAB6p5\work\Myarraytest\src\myarraytest_idl_i.c中拷貝類的GUID并復制到PlotView.h文件類定義的上面。
#include "myarraytest_idl.h"


const CLSID CLSID_Myarraytest = {0x9C4328EF,0xEA57,0x4D84,{0x9C,0x97,0xDE,0x4B,0xAE,0x02,0x21,0x5F}};
class CNewoletestDlg : public CDialog
{
// Construction
public:
IMyarraytest pResponse;
.....
}//double a[7][6];是我做其它測試程序用的。
然后,Onok()函數里添加獲得COM指針的函數,代碼如下:
plot.CreateDispatch(CLSID_plotclass,NULL); //創立接口

COleDispatchDriver(); //連接(此句可以不寫)

pResponse.CreateDispatch(CLSID_Myarraytest,NULL); //創立接口
COleDispatchDriver(); //連接(此句可以不寫)
VARIANT x;
VARIANT y;
VariantInit(&x); //初始化
VariantInit(&y);

x.vt=VT_ARRAY|VT_R8; //類型(數組,雙精度型)

SAFEARRAYBOUND rgsabound[2];
rgsabound[0].cElements=2; //數組所含元素數
rgsabound[0].lLbound=0; //數組上界
rgsabound[1].cElements=2; //數組所含元素數 rgsabound[1].lLbound=0; //數組上界
//創立數組 x.parray=SafeArrayCreate(VT_R8,2,rgsabound); //創立二維數組
double b[2][2];
b[0][0]=20;
b[0][1]=24;
b[1][0]=12;
b[1][1]=15;
//鎖定數組 SafeArrayLock(x.parray);

//數組傳遞數據 x.parray->pvData=b;

//調用方法 pResponse.arraytest(0,&y,x);
//解鎖
SafeArrayUnlock(x.parray);
/*
The most generic MATLAB M-function is function [Y1, Y2, ..., varargout] = foo(X1, X2, ..., varargin) This function maps directly to the following IDL signature.
HRESULT foo([in] long nargout,
[in,out] VARIANT* Y1,
[in,out] VARIANT* Y2,
.
[in,out] VARIANT* varargout,
[in] VARIANT X1, [in] VARIANT X2,
..
[in] VARIANT varargin);
This IDL function definition is generated by producing a function with the same name as the original M-function and an argument list containing all inputs and outputs of the original plus one additional parameter, nargout. (nargout is not produced if you compile an M-function containing no outputs.) When present, the nargout parameter is an [in] parameter of type long.It is always the first argument in the list. This parameter allows correct passage of the MATLAB nargout parameter to the compiled M-code. Following the nargout parameter, the outputs are listed in the order they appear on the left side of the MATLAB function, and are tagged as [in,out], meaning that they are passed in both directions. The function inputs are listed next, appearing in the same order as they do on the right side of the original function. All inputs are tagged as [in] parameters. When present, the optional varargin/varargout parameters are always listed as the last input parameters and the last output parameters. All parameters other than nargout are passed as COM VARIANT types. Data Conversion Rules lists the rules for conversion between MATLAB arrays and COM VARIANTs.
*/
// ::AfxMessageBox("調用結束!"); pResponse.DetachDispatch(); pResponse.ReleaseDispatch();
10. 測試。

本文并沒有給出函數調用的返回參數y的后處理,這是本文的一個缺點,我會繼續努力,在數據返回這一方面多做些工作。

posted on 2007-05-25 08:16 唯月釋懷 閱讀(952) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


My Links

Blog Stats

常用鏈接

留言簿(5)

隨筆檔案

文章檔案

My sohu blog

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲网在线观看| 亚洲视频免费在线| 美女露胸一区二区三区| 午夜在线视频观看日韩17c| 国产精品视频一| 久久激情视频免费观看| 久久精品女人的天堂av| 樱桃视频在线观看一区| 亚洲成色最大综合在线| 欧美精品性视频| 亚洲欧美日韩国产中文在线| 欧美一区二区网站| 亚洲国产精品一区| 一本久道久久综合中文字幕| 国产精品亚洲不卡a| 蜜臀久久99精品久久久久久9 | 9色porny自拍视频一区二区| 国产精品高潮呻吟视频| 欧美中文在线观看| 欧美h视频在线| 亚洲免费人成在线视频观看| 久久精品国产欧美亚洲人人爽| 最新成人在线| 中文在线一区| 亚洲福利小视频| 一本色道久久综合亚洲精品不卡| 国语自产偷拍精品视频偷| 亚洲福利视频网| 国产精品羞羞答答| 亚洲精品乱码久久久久| 国产最新精品精品你懂的| 亚洲欧洲精品一区| 黄色资源网久久资源365| 亚洲精品在线观看免费| 狠狠色丁香久久婷婷综合_中| 日韩亚洲精品电影| 在线看日韩欧美| 亚洲一区二区少妇| 日韩午夜中文字幕| 久久精品一区四区| 亚洲欧美日韩国产中文在线| 欧美福利影院| 久久综合中文色婷婷| 欧美午夜精品久久久久免费视 | 欧美一区二区大片| 欧美久久久久久久久| 美女精品在线| 国产日韩欧美中文| 一区二区三区四区五区在线| 日韩午夜激情| 免费人成精品欧美精品| 久久亚洲视频| 国产亚洲精品成人av久久ww| 亚洲作爱视频| 一本综合久久| 欧美日韩国产综合视频在线观看| 欧美www在线| 永久免费视频成人| 久久久久久网| 另类图片综合电影| 伊人久久噜噜噜躁狠狠躁 | 亚洲国产精品一区二区第一页| 韩国成人福利片在线播放| 午夜电影亚洲| 久久成人精品无人区| 国产精品日韩欧美大师| 在线亚洲欧美视频| 欧美一级淫片aaaaaaa视频| 国产精品久久久久久影视| 99精品国产在热久久婷婷| 在线视频精品| 国产精品vip| 午夜精品久久久久久久99樱桃| 欧美在线啊v| 激情欧美一区二区三区| 久久久另类综合| 欧美粗暴jizz性欧美20| 亚洲日韩欧美视频一区| 欧美日韩国产精品| 亚洲色图在线视频| 久久黄色网页| 1769国产精品| 欧美日本二区| 亚洲永久免费av| 另类专区欧美制服同性| 亚洲激情成人| 欧美少妇一区| 性做久久久久久久久| 欧美成va人片在线观看| 日韩视频在线一区| 国产精品嫩草99a| 欧美一级理论性理论a| 欧美v日韩v国产v| 一区二区三区欧美激情| 国产欧美日本一区二区三区| 久久久久成人网| 亚洲日本激情| 久久精品日韩欧美| 亚洲精品永久免费| 国产精品永久| 欧美黄色成人网| 欧美亚洲一区在线| 最近看过的日韩成人| 久久精品国产欧美亚洲人人爽| 亚洲激情自拍| 国产精品免费一区豆花| 美腿丝袜亚洲色图| 亚洲专区免费| 亚洲国产天堂网精品网站| 欧美在线观看视频一区二区| 亚洲日本电影在线| 国产亚洲欧美一区| 欧美视频在线观看免费| 老牛影视一区二区三区| 亚洲欧美bt| 91久久夜色精品国产九色| 久久久免费观看视频| 亚洲欧美日韩一区二区在线 | 亚洲国产美女| 久久一区精品| 性欧美1819sex性高清| 亚洲精品视频在线观看网站 | 欧美人牲a欧美精品| 久久久久久午夜| 亚洲欧美综合一区| 一区二区三区精品久久久| 亚洲二区在线视频| 免费在线观看一区二区| 久久久国产91| 欧美一激情一区二区三区| 亚洲视频大全| 99re6热在线精品视频播放速度| 尤物视频一区二区| 国产在线精品成人一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 欧美日韩福利视频| 欧美精品自拍| 欧美日韩 国产精品| 欧美激情精品久久久久久黑人| 久久蜜臀精品av| 久久综合九色综合欧美就去吻 | 亚洲精品一区二区三区蜜桃久| 免费一级欧美片在线播放| 久久久亚洲影院你懂的| 久久免费视频网| 久久字幕精品一区| 蜜桃久久av| 欧美大片在线观看| 欧美gay视频激情| 美女啪啪无遮挡免费久久网站| 老巨人导航500精品| 欧美3dxxxxhd| 亚洲第一精品夜夜躁人人躁| 亚洲人成人99网站| 99在线视频精品| 亚洲视频欧美在线| 性色av一区二区三区| 久久成人久久爱| 免费成人小视频| 欧美日韩你懂的| 国产日韩欧美综合| 亚洲韩国日本中文字幕| 99国产麻豆精品| 午夜免费电影一区在线观看| 久久久久成人精品| 亚洲大片在线观看| 99热这里只有成人精品国产| 亚洲影院色无极综合| 久久精品国产综合| 欧美韩国一区| 国产伦精品一区二区三区在线观看 | 国产亚洲精品激情久久| 亚洲国产精品成人综合色在线婷婷| 亚洲激情欧美激情| 亚洲欧美区自拍先锋| 久久亚洲一区二区| 亚洲精品视频免费| 欧美一级二区| 欧美国产在线观看| 国产亚洲精品久久久久久| 亚洲精品欧美激情| 久久av在线| 亚洲国产婷婷香蕉久久久久久| 亚洲天堂男人| 另类天堂av| 国产精品一国产精品k频道56| 亚洲成色777777在线观看影院| 亚洲小说欧美另类社区| 美女久久网站| 亚洲欧美在线免费| 欧美日韩国语| 亚洲大胆女人| 欧美在线观看视频一区二区| 亚洲激情网站| 久久av免费一区| 国产精品久久一级| 一本色道久久88综合亚洲精品ⅰ| 麻豆国产精品777777在线| 亚洲网站在线| 欧美女人交a|