Как мне вызвать Pb сгенерированный родной Win32 DLL из .Net? Или откуда-нибудь еще?

Я пытался связать с Pb (11.5) сгенерированные родные библиотеки Win32: как из другого приложения Pb, так и из приложения .net (2.0). Мне известно, что зарегистрированные объекты COM видимы для Pb. То, что я хочу сделать, это иметь функции вызова Pb (работает 11.5 Enterprise) в родной Win32 DLL - не COM. Я также хочу пойти другим путем: я хочу, чтобы Win32 exe (как нативный, так и .net) вызывал функцию в сгенерированной Pb dll. У меня был ограниченный успех.

Сценарий 1: Pb генерирует собственный Win32 exe & dll.

Я создал простое приложение, которое включает отдельный pbl (называемый shared.pbl) с некоторыми тривиальными функциями (включая приложение, которое возвращает строку HelloWorld). Проект строится в exe и отдельную dll. Это работает (нажатие кнопки показывает текст HelloWorld в метке).

В отдельном рабочем пространстве Pb я создаю почти идентичное приложение, но без shared.pbl. Я объявляю внешнюю функцию для ссылки на shared.dll из первой рабочей области:

 function int GetSystemMetrics( int index ) library "user32.dll";
 function int f_rtn_int( int number ) library "shared.dll";

запуск приложения - работает кнопка, связанная с GetSystemMetrics (). Нажатие второй кнопки для доступа к shared.dll завершается ошибкой с сообщением «Ошибка вызова внешней функции ...».

Только так , как я был в состоянии получить второе приложение для работы , чтобы добавить в shared.dll на вкладке библиотеки списка на целевых свойствах. Однако это, кажется, вызывает встраивание содержимого dll в сгенерированный exe - я могу удалить shared.dll, и второе приложение работает просто отлично!

Как мне ссылаться на внешнюю Win32 dll в Pb без встроенной dll в сгенерированный код Pb? Помните, что shared.dll был сгенерирован Pb в отдельной рабочей области.

Сценарий 2: .Net exe обращается к dll, сгенерированному Pb

Затем я создал простое приложение .net (.net v2.0, vs2005) с параллельной функциональностью для приложений Pb. Я ссылаюсь на shared.dll:

  [DllImport( "user32.dll" )]
  static extern int GetSystemMetrics( int smIndex );
  [DllImport( "shared.dll" )]
  static extern string f_get_hello_world();

и попробуйте вызвать функцию HelloWorld, и я получаю ошибку .net:

 Unable to find an entry point named 'f_get_hello_world' in DLL 'shared.dll'

Используя редактор / disasembler, я обнаружил, что имя функции было искажено в "_getVtableInfo_f_get_hello_world @ 12". Я пробовал разные варианты именования в объявлении и звонил без удачи.

Можно ли ссылаться на нативную Win32 dll, созданную Pb с другого языка (c ++, c #)? Если так, то как?

10.12.2008 20:15:26
2 ОТВЕТА
РЕШЕНИЕ

По сути, вы этого не делаете. Вы можете создать проект COM-объекта или с 11 или 11.5 вы можете создать сборку .NET. Библиотеки DLL, созданные «родным» поколением, не являются стандартными библиотеками Windows, поэтому их нельзя вызывать обычными методами DLL.

Удачи,

Терри.

2
11.12.2008 05:18:53
Спасибо! Я начал подозревать это. Мы отчаянно нуждаемся в переходе на .Net (откуда я), но должны найти частичный способ сделать это. Не могу позволить себе все переписать.
erhm 11.12.2008 14:37:11

Если Pb подчиняется "extern C" в ваших определениях функций, то он должен экспортировать их с не исправленными именами.

На ваш другой вопрос о том, почему кажется, что все в порядке, чтобы удалить DLL, и программа все еще работает, я могу дать лишь немного вероятное предположение: посмотрите, не сделал ли какой-либо инструмент еще одну копию библиотеки DLL, и она все еще существует.

0
11.12.2008 05:28:12