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

振動理論

我的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可執行文件。拷貝d:\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 唯月釋懷 閱讀(940) 評論(0)  編輯 收藏 引用

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>
            欧美久久电影| 亚洲精品一级| 欧美一进一出视频| 国产欧美一区二区三区另类精品| 亚洲视频第一页| aⅴ色国产欧美| 国产精品红桃| 久久久久久久久一区二区| 欧美专区在线观看| 亚洲国产精品久久久| 亚洲电影天堂av| 欧美成人日韩| 亚洲一区制服诱惑| 欧美一区亚洲一区| 亚洲经典视频在线观看| 日韩午夜剧场| 国产精品永久入口久久久| 久久久久www| 蜜桃伊人久久| 午夜一区二区三区在线观看| 国内揄拍国内精品少妇国语| 欧美激情一区二区三区在线| 国产精品va在线播放我和闺蜜| 欧美日韩少妇| 国产精品人人做人人爽人人添| 国产自产在线视频一区| 免费欧美日韩| 欧美日韩在线直播| 久久久一二三| 欧美日韩二区三区| 久久伊人精品天天| 欧美日韩国语| 久久亚洲精品一区二区| 欧美日韩日日骚| 久久青草福利网站| 欧美日韩亚洲一区二区三区四区| 久久成人国产精品| 欧美精品乱人伦久久久久久| 久久精品最新地址| 欧美精品情趣视频| 久久久国产精品一区二区三区| 久久―日本道色综合久久| 亚洲欧美日韩国产综合| 另类成人小视频在线| 亚洲欧美国产高清va在线播| 久久中文字幕导航| 欧美一区二区三区啪啪| 欧美日韩国产麻豆| 欧美激情视频一区二区三区不卡| 国产免费观看久久| 99国产精品国产精品毛片| 亚洲国产成人精品女人久久久| 午夜免费电影一区在线观看 | 亚洲国产精品久久久久秋霞影院| 欧美午夜无遮挡| 亚洲精品三级| 亚洲精品国产精品国自产在线| 欧美在线观看视频一区二区| 午夜国产不卡在线观看视频| 欧美人与禽性xxxxx杂性| 欧美国产91| 在线精品国产欧美| 久久夜色精品亚洲噜噜国产mv| 久久精品午夜| 合欧美一区二区三区| 久久爱www.| 久久精品夜夜夜夜久久| 国产欧美亚洲一区| 欧美一区二区高清在线观看| 久久gogo国模裸体人体| 国产日韩欧美精品一区| 欧美在线亚洲综合一区| 久久久久久久久蜜桃| 狠狠色丁香婷婷综合久久片| 久久九九精品| 欧美不卡高清| 日韩一区二区久久| 欧美视频中文字幕在线| 亚洲小视频在线观看| 久久国产精品99精品国产| 国产亚洲第一区| 久久久久久久久岛国免费| 久久综合国产精品台湾中文娱乐网| 韩日视频一区| 欧美77777| 一区二区三区精密机械公司| 羞羞漫画18久久大片| 国内视频一区| 免费看的黄色欧美网站| 亚洲国产一区二区a毛片| 在线中文字幕一区| 久久久久久亚洲精品中文字幕| 精品91久久久久| 欧美高清视频一二三区| 99精品国产一区二区青青牛奶 | 国产欧美精品一区aⅴ影院| 欧美影院精品一区| 欧美激情免费在线| 亚洲欧美在线另类| 在线成人激情| 欧美三级视频在线| 久久久www| 日韩一区二区福利| 久久综合久色欧美综合狠狠| 99在线|亚洲一区二区| 国产乱码精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲欧美综合另类中字| 伊人成年综合电影网| 欧美破处大片在线视频| 欧美一区二区女人| 亚洲精品视频在线| 久久综合九色| 午夜精品成人在线| 亚洲精品中文字幕有码专区| 国产三级欧美三级| 欧美日韩1234| 久久美女性网| 亚洲摸下面视频| 99pao成人国产永久免费视频| 久久婷婷丁香| 亚洲欧美色一区| 日韩亚洲视频在线| 在线看国产一区| 国产女人精品视频| 欧美日韩免费看| 久久午夜精品| 久久9热精品视频| 亚洲香蕉伊综合在人在线视看| 亚洲精品美女久久久久| 欧美福利视频网站| 久久综合免费视频影院| 久久爱另类一区二区小说| 亚洲激情一区二区| 亚洲国产成人久久| 韩国一区电影| 韩国久久久久| 国产中文一区二区| 国产精品一二三| 国产精品久久久久久久久免费 | 久久嫩草精品久久久精品| 亚洲在线观看| 亚洲一二三区视频在线观看| av成人黄色| 洋洋av久久久久久久一区| 亚洲精品国产精品国自产在线 | 久久免费精品视频| 国产欧美日韩亚洲| 久久九九免费| 久久男女视频| 农村妇女精品| 欧美激情综合五月色丁香| 欧美大片免费观看在线观看网站推荐| 久久亚洲欧美| 狂野欧美一区| 欧美精品在线免费观看| 欧美日韩亚洲一区三区| 欧美午夜精品伦理| 国产精品久久久爽爽爽麻豆色哟哟| 欧美日韩亚洲天堂| 国产精品影片在线观看| 国产午夜亚洲精品理论片色戒| 国产综合视频| 亚洲黄色在线| 亚洲一区在线观看视频| 欧美自拍偷拍| 欧美黑人在线播放| 亚洲精品乱码久久久久久按摩观| 亚洲伦理在线免费看| 午夜视频在线观看一区二区三区| 亚欧美中日韩视频| 美女视频网站黄色亚洲| 欧美日韩综合视频| 国产综合第一页| 亚洲美女电影在线| 午夜久久黄色| 欧美成年人视频网站| 日韩视频一区二区三区在线播放| 亚洲一区二区精品在线观看| 久久精品五月婷婷| 欧美日韩免费观看一区=区三区| 国产欧美日韩亚州综合| 亚洲精品中文字| 欧美一级视频一区二区| 免费观看亚洲视频大全| 亚洲免费观看在线观看| 欧美在线观看你懂的| 欧美成人精品在线播放| 国产精品一区二区三区久久久| 在线观看国产成人av片| 亚洲午夜久久久| 美女国产一区| 亚洲永久视频| 欧美激情中文不卡| 国产一区二区三区日韩欧美| 99精品视频免费在线观看| 久久中文字幕导航| 亚洲一区二区在线视频| 欧美韩日高清| 在线精品国产欧美|