2011-12-13 103 views
1

我有一個從VC2008移植到C++ Builder XE2的DLL。該DLL用於LabVIEW的TestStand。使用C++ builder導出LabView的C函數

TestStand在導入VC2008 DLL時可以看到函數名稱及其參數。使用C++ Builder DLL時,所有看到的都是函數名稱而不是參數。所有導出都是C函數並使用extern "C" declspec(dllexport)

有沒有辦法讓出口正確?

我讀過添加一個TLB文件將完成這項工作,如果這是真的,我該如何創建一個只導出C函數的TLB?

+0

您是否確實需要TestStand來查看調用參數是什麼?如果你可以看到函數名,並且你有DLL的源代碼......你能不能只定義哪些參數需要傳入?我沒有永遠使用過TestStand,但是你可以在LabVIEW中做到這一點。 – flndr 2011-12-15 21:39:53

+0

我將DLL傳遞給可能不知道如何正確執行此操作的測試人員。原來測試臺將讀取.c/.cpp文件並通過這種方式找出參數。問題解決了。 – 2011-12-15 21:45:18

回答

2

TestStand可以讀取.c/.cpp文件並從該文件派生參數。您仍然加載DLL並選擇要調用的函數。然後「驗證」參數並在對話框中選擇.c/.cpp文件。 TestStand將找到具有相同名稱的函數並插入參數本身。

函數必須非常具體,我不得不創建一個包含原型的虛擬.c文件,因爲TestStand無法處理dllexport和dllimport的#define。它喜歡一個非常具體的格式。對於功能:

TESTAPI bool StartTest(long inNumber) {} 

其中TESTAPI或者是extern "C" __declspec(dllexport)extern "C" __declspec(dllimport我不得不寫下面一行在我的虛擬文件:

bool __declspec(dllexport) StartTest(long inNumber) {} 

這就行了。

1

DLL函數參數不能單獨由導出來確定,除非它們正在通過調用約定進行修飾(這在DLL中是不尋常的)。如果TLB(又名類型庫)解決了這個問題,那麼VC2008 DLL可能是一個In-Process ActiveX/COM對象,而不是一個扁平的C DLL。如果是這樣,那麼在C + Builder中,您可以使用「文件|新建」菜單上的IDE嚮導創建一個「ActiveX庫」項目,然後添加一個「COM對象」添加到庫中。然後,您將擁有一個可以定義對象的TLB,IDE將生成存根代碼,您可以使用該對象的實現來填充代碼。

如果這不是LabViews期望的,那麼我建議你聯繫他們並提問。如果它只需要一個具有扁平C函數的TLB(這是非常不尋常的,因爲TLB是面向對象的),那麼你可以省略「COM對象」部分,並創建一個「ActiveX庫」項目來獲得一個裸機TLB,然後根據需要添加您的定義,然後將您的出口添加到項目中。

0

從參考here

避免使用外部的 「C」 格式,導出的符號。的外部的「C」語法防止C/C++ DLL適配器從獲得用於功能和方法參數類型的信息。」

0

有點晚來進行遊戲,但是您的問題可能是C++生成器裝飾導出的函數與前面的下劃線。該TLIB命令行實用程序將有助於證明這一點(假設tlib還附帶了C++ Builder中)

TLIB mydll.lib, mydll.lst 

查看最終的LST文件,看看它是否包含或_StartTest。LabVIEW是可能希望找到一個沒有下劃線的函數。

您可以將DEF文件添加到C++ Builder項目中,以抑制前導下劃線。試試這個:

  1. 使用__cdecl調用約定而不是__stdcall。

  2. 輸出簡單的「C」功能。沒有C++類或成員函數。

  3. 確保你的函數原型有一個外部「C」{}。
  4. 創建DEF文件,將導出的函數別名爲Microsoft 兼容名稱。別名,以便它們不包含前導 下劃線。 DEF文件將如下所示:

    EXPORTS ; MSVC名稱= C++ Builder的名稱 StartTest = _StartTest 美孚= _Foo 酒吧= _Bar

5- DEF文件添加到您的BCB DLL項目和重建。

退房有關詳細信息,這些古老的文章: http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm

反向文章(創建C++ Builder中的DLL獲得來自VC++創建的應用程序調用)是埋在這個檔案:

http://www.frasersoft.net/program/bcbdev.zip:/文章/ bcbdll.htm。它更詳細地描述了DEF文件技巧,以及其他一些選項。

請注意,我的答案是基於1998年左右的方式。從那以後他們可能已經改變了。如果他們有,那麼C++ Builder命令行工具impdef,tlib,tdump以及這些工具的微軟等價物應該能夠向你顯示你的DLL和MSVC中的具體內容。

H^2