當(dāng)前位置:首頁 > 測試測量 > 測試測量
[導(dǎo)讀]1.// 新建一個空的Win32 Dll 工程,加入新的cpp,寫入下面代碼 _declspec(dllexport) int sum(int a, int b) { return a+b; } //Build出一個dll:sum.dll 2.// 新建一個新的Win32 Console程序 //選擇Simple C

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

#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ù)的實際名稱。所以,一般會在最上面寫dll時,導(dǎo)出函數(shù)前面不僅加上已有的紅字表示導(dǎo)出,還要加上extern "C" ,表示以C方式編譯,因為C方式編譯時,函數(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)。運行VI即可得到結(jié)果。

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

labview中dll的調(diào)用

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

我們以求平方根為例。

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

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

每一個DLL必須有一個入口點,這就象我們用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型浮點數(shù)?呵呵,因為C語言的函數(shù)調(diào)用屬于傳值調(diào)用,在函數(shù)內(nèi)部不能改變參數(shù)的值,因此,如果直接用浮點數(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"

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

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

編譯通過,生成了labSqrt.dll

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

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

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

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

第一個參數(shù):

名稱,隨便輸入

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

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

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

完畢后,下部的phototype顯示:

void getSqrt(double num,double *result1);

點擊ok。

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

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

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉