使用C++builder导出LabView的C函数 我有一个DLL,我从VC2008移植到C++ Builder XE2。DLL用于LabVIEW的测试台

使用C++builder导出LabView的C函数 我有一个DLL,我从VC2008移植到C++ Builder XE2。DLL用于LabVIEW的测试台,c++builder,dllexport,labview,teststand,C++builder,Dllexport,Labview,Teststand,在导入VC2008 DLL时,TestStand可以看到函数名及其参数。在使用C++ Builder动态链接库时,它所看到的都是函数名而不是参数。所有导出都是C函数,并使用extern C declspec dllexport 有没有办法使出口正确 我已经读到添加TLB文件将完成这项工作,如果这是真的,我如何创建只导出C函数的TLB?DLL函数参数不能仅从导出中确定,除非它们被调用约定修饰,这在DLL中是不常见的。如果TLB又称类型库解决了问题,那么VC2008 DLL可能是进程内ActiveX

在导入VC2008 DLL时,TestStand可以看到函数名及其参数。在使用C++ Builder动态链接库时,它所看到的都是函数名而不是参数。所有导出都是C函数,并使用extern C declspec dllexport

有没有办法使出口正确


我已经读到添加TLB文件将完成这项工作,如果这是真的,我如何创建只导出C函数的TLB?

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


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

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

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

TESTAPI bool StartTest( long inNumber ) {}
当testapi是extern C_uudeclspec dllexport或extern C_uudeclspec dllimport时,我必须在虚拟文件中写入以下行:

bool __declspec( dllexport ) StartTest( long inNumber ) {}
就是这样。

参考资料:

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


游戏的时间稍晚,但你的问题可能是C++ Builder用一个领先的下划线来装饰导出的函数。假设TLIB仍然与C++Builder一起提供,那么TLIB命令行实用程序应该有助于证明这一点

TLIB mydll.lib, mydll.lst
查看生成的lst文件,查看它是否包含StartTest或_StartTest。LabView可能希望找到一个没有下划线的函数

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

使用uu cdecl调用约定而不是u stdcall

导出普通C函数。没有C++类或成员函数。< /P> 确保函数原型周围有一个外部C{}。 创建一个DEF文件,将导出的函数别名为Microsoft 兼容名称。为名称添加别名,使其不包含前导字符 强调DEF文件将如下所示:

出口 ; MSVC name=C++生成器名称 开始测试=_开始测试 Foo=\u Foo 巴

5-将DEF文件添加到BCB DLL项目并重新生成它

有关更多详细信息,请查看这些古老的文章:

另一篇文章“创建从VC++创建的应用程序中调用的C++Builder DLL”隐藏在此存档中:

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

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


H^2

我建议使用ActiveX对象:您可以在C++Builder中创建一个自动化对象,并在Labview/TestStand中导入此对象。如果使用automation,则在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数组,VS2008 DLL是一个平面C DLL,我知道,是我自己编写的。但它包含所有导出函数的名称和参数。嗯,我注意到,我只在VS2008中使用了函数,但是必须在C++ Builder中使用Extn C。这将有区别,因为C++的DLL的功能会有装饰性。
您真的需要TestStand来查看调用参数是什么吗?如果你能看到函数名,并且你有DLL的源代码。。。您能否定义需要传入的参数?我没有永远使用TestStand,但是你可以在LabVIEW中这样做。我正在将DLL传递给可能不知道如何正确执行此操作的测试人员。结果表明,测试台将读取一个.c/.cpp文件,并以这种方式计算出参数。问题解决了。头文件怎么样?以防您不希望所有代码都被分发?它必须是.c或.cpp文件,所以我从头文件创建了一个虚拟源文件,并添加了{}来代替;。然后我将它包装在if 0中,这样它就不会编译了。TestStand仍然可以阅读,效果非常好。