Matlab如何調用動態連接庫DLL文件的函數?

2021-01-08 編碼那些事

1、引言

最近在開發一個項目時,已經用C語言寫好了主要算法部分,並將主要功能的實現以函數形式封裝到了動態連接庫DLL文件中,但客戶要求提供Matlab調用DLL函數的例子,因此,花了點時間研究了下Matlab語言中調用DLL函數的方法,並記錄下來以作後用。

為簡單起見,下面以DLL文件中的一個簡單的函數調用為例進行說明(當然是虛構的一個函數了,但也涉及到了常用參數類型如指針、字符串等的傳遞)。

2、DLL文件中函數原型說明

本例調用C語言編寫的DLL文件「MyDll.dll」裡的函數「MyFunc」,這個函數原型聲明如下:

#define EXPORT extern "C" __declspec(dllexport)

void MyFunc(double x0, double deltx, int length, double *y, double &lastData, char* status);

該函數產生一個初始值為x0、間隔為deltx、長度為length的一維數組y,並給出該數組的最後一個值lastData和函數的運行狀態信息status。從函數的原型聲明中可以看出,該函數中參數數據類型涉及到了「double」類型、「int」類型和「char」類型(字符串類型),在參數傳遞中也涉及到了值傳遞(x0、deltx、length)和指針(y、lastData、status)傳遞方式,較為複雜。為便於理解,下面給出該該函數的C語言實現代碼。

3、Matlab調用方法

對於上面的MyFunc函數,在Matlab中調用主要涉及到了幾個函數的使用,包括loadlibrary/unloadlibrary、libpointer、calllib等函數的使用,分別實現加載/卸載動態庫、定義指針變量、調用函數等功能。

其Matlab中的調用代碼如下所示:

其中,通過代碼「libfunctions MyDll -full;」可以顯示dll文件中所有的函數信息。

運行結果如下圖所示:

可見,在Matlab中已經成功調用了dll文件中的MyFunc函數並得到了正確的運行結果。

4、備註

在使用calllib函數運行dll文件中的函數時,當參數中傳遞字符類型的指針變量(char *)時,其對應的變量如上例中pStatus的值不會改變,必須通過calllib的返回值得到更新後的值。

本文由編碼那些事原創,請關注+轉發+收藏+點讚,帶你一起長知識!

相關焦點

  • Matlab如何調用動態連接庫DLL文件的函數?
    1、引言最近在開發一個項目時,已經用C語言寫好了主要算法部分,並將主要功能實現部分以函數形式封裝到了動態連接庫DLL文件中,但客戶要求提供Matlab調用DLL函數的例子,因此,花了點時間研究了下Matlab語言中調用DLL
  • msvcp140.dll文件的作用詳解|動態連結庫|調用|應用程式|電腦|dll
    msvcp140.dll文件有什麼作用?電腦系統中存在著各種各樣的文件!dll文件就是其中一個很重要的文件之一。很多的小夥伴們都對這些文件並不是很很熟悉,今天小編為大家帶來的就是msvcp140.dll文件作用詳解!一起來看看吧!
  • 在MATLAB環境中調用DLL對硬體資源訪問的方法
    為了加深對動態連結庫函數調用的理解,下面以C/C++語言為例簡要介紹動態連結庫的編寫步驟。首先介紹兩組關鍵字: 1)_declspec(dllimport) 這組關鍵字表示從DLL中導入函數或者數據,一般用在DLL對應的頭文件中。 2)_declspec(dllexport) 這組關鍵字表示從DLL中導出函數或者數據,一般用在DLL對應的工程文件中。
  • VC|創建、動態顯式、靜態隱式調用或連結動態連結庫DLL
    編寫應用程式通常都不是從0開始的,或多或少都會用到一些庫,不管是函數庫還是類庫。動態連結庫DLL(dynamic linked library)通常都不能直接運行,也不能接收消息。它們是一些獨立的文件,其中包含能被可執行程序或其它DLL調用來完成某項工作的函數。只有在其它模塊調用動態連結庫中的函數時,它才發揮作用。
  • 如何編寫dll文件
    如何編寫dll文件:可以用幾種語言來實現,如delphi編寫dll,pb編寫dll文件,java 編寫dll,vc 編寫dll,mfc dll 編寫等。——動態連結庫(dll)是包含共享函數庫的二進位文件,可以被多個應用程式同時使用。
  • exe調用DLL的方式
    dll中的函數在被調用時是以函數名或函數編號的方式被索引的。這就意味著採用某編譯器的C++的Name-Mangling方式產生的dll文件可能不通用。因為它們的函數名重命名方式不同。注意到extern 「C」的作用是為了解決函數符號名的問題,這對於動態連結庫的製造者和動態連結庫的使用者都需要遵守的規則。
  • python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢。
  • C#實戰050:C#調用C++動態連結庫及類庫詳解
    動態連結庫動態連結庫全稱Dynamic Link Library(簡稱DLL),通常是由一組實現某種特定功能的函數集合。它包含了該功能的具體實現方法和資源,通過編譯生成一個後綴為DLL的文件供應用程式或者其他dll調用。用戶不需要知道功能的具體實現過程,只需要根據DLL提供的API正確傳參就可以得到想要的結果。
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    引言前段時間在作信號分析處理方面的項目時,需要將時域數據通過快速傅立葉變換(FFT)轉換到頻域以便作進一步的後續處理,由於涉及到實時運算速度方面的要求,需要考慮程序算法的運算性能問題,因此,信號處理算法是在C語言裡面完成的,然後將算法的實現函數封裝到動態連結庫(DLL)文件中,最後在
  • labview中dll的調用(包括生成dll)
    第一頁用於填寫被調用函數的信息(圖2)。Library name or path需給出DLL文件名和路徑,作業系統路徑下的DLL文件,直接輸入文件名也可調用,否則必須輸入全路徑。在這裡已經給出名字的DLL是被靜態加載到程序中的,也就是說當調用了這個DLL的VI被裝入內存時,DLL同時被裝入內存。LabVIEW也可動態加載DLL,只要勾選上Specify path on diagram的選項即可。
  • msvcp140.dll文件的作用詳解
    msvcp140.dll文件有什麼作用?電腦系統中存在著各種各樣的文件!dll文件就是其中一個很重要的文件之一。很多的小夥伴們都對這些文件並不是很很熟悉,今天小編為大家帶來的就是msvcp140.dll文件作用詳解!一起來看看吧!
  • C 實戰033:動態連結庫的創建與使用
    動態連結庫動態連結庫(Dynamic Link Library,縮寫為 DLL)是Windows作業系統中實現共享函數庫的一種方式,這樣一個應用程式可使用多個DLL文件,一個DLL文件也可能被不同的應用程式調用,DLL是一個不可執行的二進位文件,也不接收消息。
  • 「無法定位程序輸入點…於動態連結庫xxx.dll之上」提示的解決方法
    A:動態連結庫DLL是Dynamic Link Library的縮寫,DLL是一個包含可由多個程序,同時使用的代碼和數據的庫,它並不是可執行的文件,它是能向多個程序提供公用代碼函數和數據的封裝庫,程序所需要的一些函數和數據被事先封裝在DLL文件中,當程序運行時可以主程序需要調用這些
  • python3使用ctypes在windows中訪問C和C++動態連結庫函數示例
    版本:3.7.0VS版本:vs2015社區版(免費)相關工具下載:VS版本vs2015社區版(免費)Python3.7.0 (源碼和安裝文件)http://ffmpeg.club/python二 C/C++部分代碼1 首先完成C/C++的動態連結庫,與做python擴展庫不同,ctypes調用的c++庫其實與
  • C語言學習篇(28)——函數庫
    但是有時候我們不想公開自己的原始碼(.c),尤其是商業性代碼,同時又要讓客戶能夠使用他們編寫的代碼,解決的方法就是打包成靜態連結庫(.a,.lib)或動態連結庫(.so, .dll),同時提供對應的頭文件.h, 譬如我們經常使用的stdio.h , string.h等C庫函數,這些統稱為函數庫, 那麼我們今天就來聊聊什麼是函數庫,函數庫有什麼作用,如何製作函數庫等等話題。
  • NX二次開發-C 使用DllImport調用libufun.dll裡的UF函數(反編譯...
    用DllImport去調用(是什麼,怎麼用請自行百度)。libufun.dlllibnxopencpp.dlllibugopenint.dlllibnxopenuicpp.dlllibopenpp.dll比如,我們現在想要調用UF_OBJ_set_color這個函數(這個函數官方已經封裝了,這裡只講調用是怎麼用的),給一個塊設置顏色。
  • 如何在Windows系統查看加載了指定DLL動態連結庫的進程
    我們大家在運維管理Windows計算機系統時,為了安全起見,有時可能需要查看一些加載了指定的DLL動態連結庫文件的進程有哪些。那麼,我們該如何操作處理呢?接下來,小編就來演示一下具體的操作步驟。第五步:例如,需要查看加載了shell32.dll動態連結庫的進程有哪些,執行指令如下所示第六步:稍等片刻,可查詢列出shell32.dll動態連結庫文件被調用的所有進程信息
  • 解決JAVA調用C++ DLL文件Unable to load library的問題
    JAVA項目開發中,有時候會遇到調用C++編寫的動態連結庫的場景(比如調用第三方的動態連結庫、軟體中關鍵部分用C++編碼提供給外部調用)。我們知道JAVA調用動態連結庫(C/C++),可以通過以下二種方式:JNI、JNA。
  • Linux的so文件到底是幹嘛的?淺析Linux的動態連結庫
    我們分析了Hello World是如何編譯的,即使一個非常簡單的程序,也需要依賴C標準庫和系統庫,連結其實就是把其他第三方庫和自己原始碼生成的二進位目標文件融合在一起的過程。經過連結之後,那些第三方庫中定義的函數就能被調用執行了。早期的一些作業系統一般使用靜態連結的方式,現在基本上都在使用動態連結的方式。
  • 如何定義一個和庫函數名一樣的函數,並在函數中調用該庫函數
    read()我們現在要自己定義一個名字一樣的函數read(),main()函數首先調用我們自己定義的函數read()自己定義的函數,要再定義庫文件中的read()函數。其特性如下:靜態函數只能在聲明它的文件中可見,其他文件不能引用該函數不同的文件可以使用相同名字的靜態函數,互不影響其他庫如果有相同的函數名,優先使用本文件的靜態函數