Я пытался создать ссылку на сгенерированные 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 #)? Если да, то как?