1

我有一个从 VC2008 移植到 C++ Builder XE2 的 DLL。DLL 用于 LabVIEW 的 TestStand。

TestStand 在导入 VC2008 DLL 时,可以看到函数名称及其参数。当使用 C++ Builder DLL 时,它所看到的只是函数名而不是参数。所有导出都是 C 函数并使用extern "C" declspec( dllexport ).

有没有办法让出口正确?

我已经读过添加一个 TLB 文件就可以完成这项工作,如果这是真的,我如何创建一个只导出 C 函数的 TLB?

4

5 回答 5

2

TestStand 可以读取 .c/.cpp 文件并从该文件派生参数。您仍然加载 DLL 并选择要调用的函数。然后,您“验证”参数并在对话框中选择 .c/.cpp 文件。TestStand 将找到具有相同名称的函数并插入参数本身。

该函数必须非常具体,我必须创建一个包含原型的虚拟 .c 文件,因为 TestStand 无法处理 dllexport 和 dllimport 的#defines。它喜欢一种非常具体的格式。对于功能:

TESTAPI bool StartTest( long inNumber ) {}

要么在哪里TESTAPI,要么我必须在我的虚拟文件中写下以下行:extern "C" __declspec( dllexport )extern "C" __declspec( dllimport

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

这样做。

于 2011-12-15T21:50:17.937 回答
1

DLL 函数参数不能单独从导出中确定,除非它们是由调用约定修饰的(这在 DLL 中是不常见的)。如果 TLB(又名类型库)解决了问题,那么 VC2008 DLL 很可能是进程内 ActiveX/COM 对象,而不是平面 C DLL。如果是这样,那么在 C+Builder 中,您可以使用“文件|新建”菜单上的 IDE 向导来创建“ActiveX 库”项目,然后将“COM 对象”添加到库中。然后,您将拥有一个 TLB,您可以使用它来定义您的对象,并且 IDE 将生成存根代码,您可以使用您的对象的实现来填充它。

如果这不是 LabViews 所期望的,那么我建议您联系他们并询问。如果它只需要一个带有平面 C 函数的 TLB(这是非常不寻常的,因为 TLB 是面向对象的),那么您可以省略“COM 对象”部分,而只需创建一个“ActiveX 库”项目以获得准系统TLB,然后根据需要将您的定义添加到其中,然后将您的导出添加到项目中。

于 2011-12-14T03:09:41.840 回答
0

这里的参考:

避免使用 extern "C" 语法导出符号。extern "C" 语法阻止 C/C++ DLL 适配器获取函数和方法参数的类型信息。”

于 2017-11-01T13:19:20.133 回答
0

游戏有点晚了,但您的问题可能是 C++ Builder 正在使用前导下划线装饰导出的函数。命令行实用程序应该有助于证明这TLIB一点(假设 tlib 仍随 C++Builder 提供)

TLIB mydll.lib, mydll.lst

查看生成的 lst 文件,看看它是否包含StartTest_StartTest. LabView 可能希望找到没有下划线的函数。

您可以将 DEF 文件添加到您的 C++Builder 项目中,该文件将取消前导下划线。试试这个:

  1. 使用 __cdecl 调用约定而不是 __stdcall。

  2. 导出普通的“C”函数。没有 C++ 类或成员函数。

  3. 确保你的函数原型周围有一个 extern "C" {}。
  4. 创建一个将导出函数别名为 Microsoft 兼容名称的 DEF 文件。为名称命名,使其不包含前导下划线。DEF 文件将如下所示:

    出口;MSVC 名称 = C++Builder 名称 StartTest = _StartTest Foo = _Foo Bar = _Bar

5- 将 DEF 文件添加到您的 BCB DLL 项目并重建它。

查看这些古老的文章了解更多详情: http ://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm

反向文章(创建从 VC++ 创建的应用程序调用的 C++Builder DLL)隐藏在此存档中:

http://www.frasersoft.net/program/bcbdev.zip:/articles/bcbdll.htm。它更详细地描述了 DEF 文件技巧,以及一些其他选项。

请注意,我的回答是基于 1998 年左右的情况。从那时起,他们可能已经改变了。如果有,那么 C++Builder 命令行工具 impdef、tlib、tdump 以及这些工具的 Microsoft 等效工具应该能够准确地向您展示您的 DLL 与 MSVC 中的内容。

H^2

于 2018-01-03T19:43:35.240 回答
0

我建议使用 ActiveX 对象:你可以在 C++Builder 中创建一个自动化对象,在 Labview / TestStand 中你可以导入这个对象。如果您使用自动化,在 Lavbiew 中您将拥有正确的参数定义。确保您在 Labview / TestStand 中使用了一组兼容的类型变量。例如,这段代码是从 Labview 传递到 C++ 的数组的实现:

STDMETHODIMP TCanLibraryImpl::DataDownload(VARIANT Data, long* RV)
{
   _precondition_cmodule();   
   *RV = 0;
   TSafeArrayLong1 mySafeArray(Data.parray);
   int dLen =mySafeArray.BoundsLength[0];
   ...
}

在 Labview 中,您将向该函数传递一个 I64 数组

于 2018-03-13T13:44:56.957 回答