2011-12-13 7 views
1

У меня есть DLL, которую я портировал с VC2008 на C++ Builder XE2. DLL используется в TestStand LabVIEW.Экспорт функций C для LabView с C++ builder

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

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

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

+0

Вам действительно нужен TestStand, чтобы узнать, какие параметры вызова? Если вы можете увидеть имена функций, и у вас есть исходный код для DLL ... можете ли вы не просто определить, какие параметры должны быть переданы? Я не использовал TestStand навсегда, но вы можете сделать это в LabVIEW. – flndr

+0

Я передаю DLL тестировщикам, которые могут не знать, как это сделать должным образом. Оказывается, тестовый стенд будет читать файл .c/.cpp и определять параметры таким образом. Задача решена. –

+0

Как насчет только заголовочного файла? На всякий случай, если вы не хотите, чтобы весь ваш код был распространен? – flndr

ответ

2

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

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

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

+2

DLL VS2008 - это плоская C DLL, я знаю, я написал ее сам. И все же он содержит имена и аргументы всех экспортируемых функций. Hmmm, я замечаю, что я использую только __declspec (dllexport) для функций в VS2008, но должен использовать extern «C» в C++ Builder. Это будет иметь значение, поскольку функции для C++ DLL будут иметь украшение. –

0

Из ссылки here:

Не следует использовать Экстерн синтаксис "C" для экспорта символов. Синтаксис ехЬегп «C» предотвращает C/C++ DLL адаптер от получения информации о типе для функций и методов параметров.»

0

Немного поздно к игре, но ваша проблема может быть, что C++ Builder украшает экспортируемую функцию с ведущей подчеркиванием. утилита командной строки 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 будет выглядеть так:

    ЭКСПОРТ ; Имя 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

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

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

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

H^2

Смежные вопросы