Экспорт функций C для LabView с помощью C ++ Builder - PullRequest
1 голос
/ 13 декабря 2011

У меня есть DLL, которую я перенес из VC2008 в C ++ Builder XE2. DLL используется в TestStand LabVIEW.

TestStand при импорте библиотеки VC2008 может видеть имена функций и их аргументы. При использовании C ++ Builder DLL все, что он видит, - это имена функций, а не аргументы. Все экспорты являются функциями C и используют extern "C" declspec( dllexport ).

Есть ли способ правильно настроить экспорт?

Я прочитал, что добавление файла TLB сделает работу, если это правда, как мне создать TLB, который экспортирует только функции C?

Ответы [ 5 ]

2 голосов
/ 16 декабря 2011

TestStand может читать файл .c / .cpp и получать параметры из этого файла.Вы по-прежнему загружаете DLL и выбираете функцию, которую хотите вызвать.Затем вы «проверяете» параметры и выбираете файл .c / .cpp в диалоговом окне.TestStand найдет функцию с тем же именем и сама вставит параметры.

Функция должна быть очень специфичной, мне пришлось создать фиктивный файл .c, содержащий прототипы, так как TestStand не смог обработать #defines дляdllexport и dllimport.Ему нравится очень специфический формат.Для функции:

TESTAPI bool StartTest( long inNumber ) {}

, где TESTAPI - это либо extern "C" __declspec( dllexport ), либо extern "C" __declspec( dllimport. Мне нужно было написать строку ниже в моем фиктивном файле:

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

..

1 голос
/ 14 декабря 2011

Параметры функции DLL не могут быть определены только из экспорта, если они не оформлены соглашением о вызовах (что необычно делать в DLL). Если TLB (он же библиотека типов) решает проблему, то библиотека VC2008, скорее всего, является внутрипроцессным объектом ActiveX / COM, а не плоской C-библиотекой. Если это так, то в C + Builder вы можете использовать мастера IDE в меню «Файл | Новый» для создания проекта «Библиотека ActiveX», а затем «COM-объект» для добавления в библиотеку. Затем у вас будет TLB, с помощью которого вы можете определить свой объект, и IDE сгенерирует заглушку, которую вы можете заполнить реализацией вашего объекта.

Если это не то, чего ожидает LabViews, тогда я предлагаю вам связаться с ними и спросить. Если все, что ему нужно, это TLB с плоскими функциями C (что очень необычно, поскольку TLB являются объектно-ориентированными), то вы можете пропустить часть «COM Object» и просто создать проект «ActiveX Library», чтобы получить пустые места. TLB, затем добавьте в него ваши определения по мере необходимости, а затем добавьте свой экспорт в проект.

0 голосов
/ 13 марта 2018

Я предлагаю использовать объект 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

0 голосов
/ 03 января 2018

Немного опоздал к игре, но ваша проблема может заключаться в том, что 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. Убедитесь, что у вас есть внешний символ "C" {} вокруг ваших прототипов функций.
  4. Создайте файл DEF, который будет содержать псевдоним экспортируемых функцийна имя, совместимое с Microsoft.Псевдоним имена, чтобы они не содержали подчеркивания.Файл DEF будет выглядеть так:

    EXPORTS;Имя MSVC = имя C ++ Builder StartTest = _StartTest Foo = _Foo Bar = _Bar

5- Добавьте файл DEF в проект DLL BCB и перестройте его.

Посмотрите эти древние статьи для более подробной информации: http://bcbjournal.org/articles/vol4/0012/Using_Visual_C_DLLs_with_CBuilder.htm

Обратная статья (создание библиотек DLL C ++ Builder, вызываемых из созданных приложений VC ++) похоронена в этом архиве:

http://www.frasersoft.net/program/bcbdev.zip: /articles/bcbdll.htm.В нем более подробно описывается прием файла DEF, а также некоторые другие параметры.

Обратите внимание, что мой ответ основан на том, что происходило в 1998 году или около того.Возможно, они изменились с тех пор.Если они есть, то инструменты командной строки C ++ Builder impdef, tlib, tdump, а также эквиваленты этих инструментов от Microsoft должны быть в состоянии показать вам, что именно в вашей DLL по сравнению с MSVC.

H ^ 2

0 голосов
/ 01 ноября 2017

Из ссылки здесь :

Избегайте использования внешнего синтаксиса "C" для экспорта символов. Синтаксис extern «C» не позволяет адаптеру DLL C / C ++ получать информацию о типе для параметров функции и метода. "

...