2011-12-13 189 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