<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 測試測量 > 設(shè)計(jì)應(yīng)用 > LabVIEW中調(diào)用VC++生成的DLL文件

          LabVIEW中調(diào)用VC++生成的DLL文件

          作者: 時間:2016-12-26 來源:網(wǎng)絡(luò) 收藏
          1.// 新建一個空的Win32 Dll 工程,加入新的cpp,寫入下面代碼

          _declspec(dllexport) int sum(int a, int b)
          {
          return a+b;
          } //Build出一個dll:sum.dll
          2.// 新建一個新的Win32 Console程序
          //選擇Simple Console Application,修改main函數(shù)所在的cpp

          本文引用地址:http://www.ex-cimer.com/article/201612/334096.htm

          #include "stdafx.h"
          #include
          using namespace std;
          // for base type and LoadLibrary
          #include
          // define function pointer which will point to sum(a, b)
          typedef int(*Func)(int,int);
          int main(int argc, char* argv[])
          {
          HMODULE dll = ::LoadLibrary("sum.dll"); // 加載剛才那個dll,路經(jīng)要對
          if(dll)
          {
          Func f = (Func)GetProcAddress(dll, ?sum@@YAHHH@Z);

          // 加載那個sum函數(shù)
          if(f)
          cout< else
          cout<<"function call error";
          }
          else
          cout<<"lodad error";
          } //Build & Execute
          3.上面一個不便的地方就是GetProcAddress,第二個參數(shù)是個很復(fù)雜的字符串,需要事先用dumpbin sum.dll /exports得到sum函數(shù)的實(shí)際名稱。所以,一般會在最上面寫dll時,導(dǎo)出函數(shù)前面不僅加上已有的紅字表示導(dǎo)出,還要加上extern "C" ,表示以C方式編譯,因?yàn)镃方式編譯時,函數(shù)名在庫中和在程序代碼中會保持一致,不像C++生成新的編碼后的函數(shù)名。那么,上述的dll函數(shù)聲明就是
          extern "C" _declspec(dllexport) int sum(int a, int b)
          而調(diào)用程序的GetProcAddress行就改為:
          Func f = (Func)GetProcAddress(dll, "sum");
          4.編譯為dll
          5.在labview中用Function->Advance->Call Library Function Node調(diào)用。

          調(diào)用方式為"C",函數(shù)原型為long sum(long,long)。運(yùn)行VI即可得到結(jié)果。

          ===============================================================

          labview中dll的調(diào)用

          通過labview調(diào)用dll文件,我們可以進(jìn)行c、c++代碼的復(fù)用,減輕編程工作量,便于協(xié)同開發(fā),為程序增加新的功能。

          我們以求平方根為例。

          首先,需要建立求解平方根的dll文件。以VC6.0編譯器為例(注意,labview文檔中推薦的編譯器包括微軟的MSC、VC,布包擴(kuò)BCB)。首先,新建一個project,選擇Win32 Dynamic-Link Library類型,我們命名為labSqrt,繼續(xù),選擇a Simple dll Project,完成。則一個項(xiàng)目建立起來。

          注意,上例我們使用的是非MFC的DLL,即不用MFC的類庫結(jié)構(gòu),直接用C語言寫的DLL,其輸出的函數(shù)一般用的是標(biāo)準(zhǔn)C接口,并能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用。

          每一個DLL必須有一個入口點(diǎn),這就象我們用C編寫的應(yīng)用程序一樣,必須有一個WINMAIN函數(shù)一樣。在這個示例中,DllMain是一個缺省的入口函數(shù)。用這個缺省的入口函數(shù)就能使動態(tài)連接庫被調(diào)用時得到正確的初始化。

          入口函數(shù)已經(jīng)自動生成了,你可以在文件中加入你所想要輸出的函數(shù)或變量等等。

          應(yīng)用程序使用DLL中的函數(shù)之前,應(yīng)該先導(dǎo)出這些函數(shù),以便供給應(yīng)用程序使用。要導(dǎo)出這些函數(shù)有兩種方法,一是在定義函數(shù)時使用導(dǎo)出關(guān)鍵字_declspec(dllexport),另外一種方法是在創(chuàng)建DLL文件時使用模塊定義文件.Def。這里我們采取第一種方法,并且添加關(guān)鍵字"extern C",它可以使其他編程語言訪問你編寫的DLL中的函數(shù)。

          extern"C" _declspec(dllexport) void getSqrt(double input,double *output);

          我們完全可以設(shè)定求得的平方根為double型返回值(此處我們用的void類型)。使用兩個輸入?yún)?shù)的原因是,注意一下,output參數(shù)是指針類型,我們用它來得到輸出的值。為什么不直接用double型浮點(diǎn)數(shù)?呵呵,因?yàn)镃語言的函數(shù)調(diào)用屬于傳值調(diào)用,在函數(shù)內(nèi)部不能改變參數(shù)的值,因此,如果直接用浮點(diǎn)數(shù),那初始是多少,返回就是多少,無法得到求得的平方根。所以,切記,需要得到參數(shù)值時,用指針。(當(dāng)然,直接設(shè)置函數(shù)的返回值可以得到,但那樣只能有一個返回值。使用參數(shù)值,我們可以得到多個哦)

          填充函數(shù)體,如下所示


          // labSqrt.cpp : Defines the entry point for the DLL application.

          //

          #indlude"stdafx.h"

          #include"math.h"

          extern"C"_declspec(dllexport)voidgetSqrt(doubleinput,double*output);

          BOOL APPIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)

          {

          returnTRUE;

          }

          extern"C"_declspec(dllexport)voidgetSqrt(doubleinput,double*output)

          {

          if(input >= 0)

          *output = sqrt(input);

          else

          *output = 0.0;

          }


          簡單解釋一下

          添加頭文件說明

          #include"math.h"

          因?yàn)槲覀冇玫搅藬?shù)學(xué)函數(shù)sqrt()。

          函數(shù)體中首先判斷輸入是否非負(fù),是則將其平方根付給參數(shù)output指針指向的元素,否則將0.0賦予。(此程序完全為了說明而用,可以修改使其功能更加強(qiáng)大)

          編譯通過,生成了labSqrt.dll

          創(chuàng)建一個labview的vi,在框圖中,右鍵(Functions)>>Connectivity>>Libraries & Executables>>Call Library Function Node

          雙擊或右鍵選擇Configure,彈出配置對話框。

          第一個選項(xiàng)卡是"Function":第一項(xiàng)需要你選中生成的dll選中以后,第二項(xiàng)中就會出來dll中的函數(shù)名getSqrt,第三項(xiàng)和第四項(xiàng)不用管,分別是"Run in UI thread"和C(我們使用的是C,不是windowsAPI);

          第二個選項(xiàng)卡是"Parameters":在里面配置(添加)函數(shù)的各個輸入?yún)?shù)。首先為return,返回參數(shù),在下面選擇對應(yīng)的void類型。然后點(diǎn)擊“+”號,開始添加函數(shù)參數(shù)

          第一個參數(shù):

          名稱,隨便輸入

          類型,顯然我們的第一個參數(shù)為數(shù)值型(Numeric),double型的(8字節(jié))

          最后一項(xiàng)當(dāng)然是value,而不是指針

          同理,第二個參數(shù)也是numeric的8字節(jié)double,但是pass一項(xiàng)為point to value

          完畢后,下部的phototype顯示:

          void getSqrt(double num,double *result1);

          點(diǎn)擊ok。

          好了,我們再給配置好的文件添加輸入、輸出(呵呵,output可以不初始化,輸入只連input就行)。運(yùn)行一下,看看效果吧!

          整個的過程就是這樣。編寫復(fù)雜的dll 調(diào)用,還將必須考慮其他的一些問題。



          關(guān)鍵詞: LabVIEW調(diào)用VC++DLL文

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();