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

Я пытался создать ссылку на сгенерированные 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, и второе приложение работает нормально!

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

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

Затем я создал простое приложение .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 #)? Если да, то как?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2008

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

Удачи,

Терри.

0 голосов
/ 11 декабря 2008

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

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

...