我有一个从VC2008移植到C++生成器XE2的动态链接库。动态链接库在LabVIEW的TestStand中使用。
导入VC2008 DLL时,TestStand可以看到函数名及其参数。在使用C++生成器DLL时,它的所有sees都是函数名,而不是参数。所有导出都是C函数,并使用extern "C" declspec( dllexport )。
有没有一种方法可以正确地进行导出?
我读到添加一个TLB文件就可以完成这项工作,如果这是真的,我如何创建一个只导出C函数的TLB?
发布于 2011-12-16 05:50:18
TestStand可以读取.c/.cpp文件并从该文件派生参数。仍然加载DLL并选择要调用的函数。然后‘验证’参数,并在对话框中选择.c/.cpp文件。TestStand将查找具有相同名称的函数,并自行插入参数。
函数必须非常具体,因为TestStand不能处理dllexport和dllimport的#定义,所以我必须创建一个包含原型的虚拟.c文件。它喜欢一种非常特殊的格式。对于函数:
TESTAPI bool StartTest( long inNumber ) {}其中TESTAPI是extern "C" __declspec( dllexport )或extern "C" __declspec( dllimport,我必须在我的虚拟文件中写下下面这一行:
bool __declspec( dllexport ) StartTest( long inNumber ) {}这就够了。
发布于 2011-12-14 11:09:42
DLL函数参数不能仅从导出中确定,除非它们由调用约定修饰(这在DLL中很少见)。如果TLB (也称为类型库)解决了这个问题,那么VC2008动态链接库很可能是进程中的ActiveX/COM对象,而不是平面C动态链接库。如果是这样,那么在C+Builder中,您可以使用“文件|新建”菜单上的集成开发环境向导来创建一个"ActiveX库“项目,然后创建一个"COM对象”来添加到库中。然后,您将拥有一个TLB,您可以用它来定义您的对象,并且IDE将生成存根代码,您可以使用对象的实现填充这些代码。
如果这不是LabViews所期望的,那么我建议您联系他们并询问。如果它只需要一个具有扁平C函数的TLB (这是非常不寻常的,因为TLB是面向对象的),那么您可以省略"COM对象“部分,只需创建一个"ActiveX库”项目来获得一个基本的TLB,然后根据需要向其中添加您的定义,然后将您的导出添加到项目中。
发布于 2017-11-01 21:19:20
从reference here
避免使用外部"C“语法导出符号。外部"C“语法阻止C/C++ DLL适配器获取函数和方法参数的类型信息。”
https://stackoverflow.com/questions/8494500
复制相似问题