2008-11-06 28 views

回答

2

我從你的問題中假設你已經有一個可以返回數字給Labview的DLL。從DLL返回一個字符串,我創建了一個DLL與下面的C++函數

void returnString(char myString[]) 
{ 
    const char *aString = "test string"; 
    memcpy(myString, aString, 12); 
} 

在LabVIEW然後我用調用庫函數節點,並將其配置如下

 
    Library Name or Path: c:\path\to\my\custom.dll 
      Function Name: returnString 
      Calling Convention: C 

    Parameters: 
      Parameter: return type 
       type: void 

      Parameter: arg1 
       type: String 
       string format: C String Pointer 

    Function prototype: 
     void returnString(CStr arg1); 

連接後, arg1在程序框圖中輸出到字符串指示器並運行。字符串「test string」應該出現在前面板上。

我想有returnString功能型CSTR反應器中

CStr returnString() 
{ ... 
} 

,但我得到了編譯DLL項目時生成錯誤。

更新

感謝@ bk1e評論別忘了在Labview中爲字符串預先分配空間。

+0

非常感謝,那正是我所需要的。 – alex77 2008-11-06 18:41:03

+1

當使用「C字符串指針」字符串格式時,您的LabVIEW代碼負責預先分配一個足夠大的字符串傳遞給調用庫函數節點,否則您的DLL可能會破壞LabVIEW堆。分配字符串的一種方法是將Initialize Array和Byte Array To String組合起來。 – bk1e 2008-11-07 05:16:28

3

至少有幾個方法可以從一個調用庫函數節點返回一個字符串:

  1. 返回從您的DLL函數的C字符串指針,並配置調用庫函數節點有一個返回「C字符串指針」的類型。請注意,返回的字符串在函數返回後必須有效,因此它不能是指向堆棧中分配的字符串的指針。它必須是以下內容之一:在堆上分配,靜態分配,常量字符串等。

    在LabVIEW目錄中看起來像examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi採用這種方法。

  2. 在VI中分配一個字符串,使用Azim建議的「C String Pointer」參數將它傳遞給調用庫函數節點,並覆蓋DLL中的內容。分配字符串的一種方法是使用Initialize Array創建所需大小的u8數組,然後使用Byte Array To String將其轉換爲字符串。

    確保您傳遞的字符串足夠大以容納字符串的內容,並確保將字符串長度傳遞給DLL,以便知道緩衝區的大小。我相信默認參數是一個空字符串。如果你的VI的第一個猜測不夠大,找出正確的字符串長度可能需要調用兩次DLL。

  3. 使用「String Handle」參數將字符串傳遞給調用庫函數節點,並在您的DLL中使用LabVIEW函數根據需要調整字符串大小。這需要您的DLL專門設計爲與LabVIEW接口,並需要鏈接到LabVIEW提供的靜態庫。

    這種方法的一個例子是用LabVIEW作爲examples/dll/hostname/hostname.vi

相關問題