<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 測試測量 > 設計應用 > LabVIEW中調用VC++生成的DLL文件

LabVIEW中調用VC++生成的DLL文件

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

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

本文引用地址:http://dyxdggzs.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"); // 加載剛才那個(gè)dll,路經(jīng)要對
if(dll)
{
Func f = (Func)GetProcAddress(dll, ?sum@@YAHHH@Z);

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

調用方式為"C",函數原型為long sum(long,long)。運行VI即可得到結果。

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

labview中dll的調用

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

我們以求平方根為例。

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

注意,上例我們使用的是非MFC的DLL,即不用MFC的類(lèi)庫結構,直接用C語(yǔ)言寫(xiě)的DLL,其輸出的函數一般用的是標準C接口,并能被非MFC或MFC編寫(xiě)的應用程序所調用。

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

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

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

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

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

填充函數體,如下所示


// 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;

}


簡(jiǎn)單解釋一下

添加頭文件說(shuō)明

#include"math.h"

因為我們用到了數學(xué)函數sqrt()。

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

編譯通過(guò),生成了labSqrt.dll

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

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

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

第二個(gè)選項卡是"Parameters":在里面配置(添加)函數的各個(gè)輸入參數。首先為return,返回參數,在下面選擇對應的void類(lèi)型。然后點(diǎn)擊“+”號,開(kāi)始添加函數參數

第一個(gè)參數:

名稱(chēng),隨便輸入

類(lèi)型,顯然我們的第一個(gè)參數為數值型(Numeric),double型的(8字節)

最后一項當然是value,而不是指針

同理,第二個(gè)參數也是numeric的8字節double,但是pass一項為point to value

完畢后,下部的phototype顯示:

void getSqrt(double num,double *result1);

點(diǎn)擊ok。

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

整個(gè)的過(guò)程就是這樣。編寫(xiě)復雜的dll 調用,還將必須考慮其他的一些問(wèn)題。



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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>