Форум » [x]Harbour » помогите подключить библиотеку DLL » Ответить

помогите подключить библиотеку DLL

MIKHAIL: Имеется библиотека COM объекта DLL Есть примеры подключения и инициализации в C# и С, в этих языках ничего не понимаю. Библиотека вроде подгружается через hb_libload() А как инициализировать объект из библиотеки ? вот из примера C: [quote] #import "CEBPayment.dll" CEBPayment::ICEBPaymentPluginPtr plugin; ******* CEBPayment::ICEBPaymentPluginPtr plugin(L"CEBPayment.CEBPaymentPlugin"); plugin->config(); [/quote] как я понимаю создается объект plugin в котором есть набор свойств и методов Как его создать и использовать под Harbor ?

Ответов - 19

Andrey: Я делал/разбирался для МиниГуи использование чужих DLL, но СОМ объекты не разбирал. Посмотри там для Харбора есть пример загрузки DLL и использование функций C++ Может пригодиться. Проект - https://cloud.mail.ru/public/JWHz/xCvn6Jycy

Dima: MIKHAIL пишет: #import "CEBPayment.dll" CEBPayment::ICEBPaymentPluginPtr plugin; ******* CEBPayment::ICEBPaymentPluginPtr plugin(L"CEBPayment.CEBPaymentPlugin"); plugin->config(); Откуда эта инфа ? PS Гугл молчит на запрос "CEBPayment.dll"

MIKHAIL: Dima пишет: Гугл молчит на запрос "CEBPayment.dll" Это библиотека для работы с платежным терминалом (эквайринг) Кредит Европа Банк. Разработчик не афиширует ее, поставляет на платной основе. Текст взят из примера на С. Инициализация объекта на C# выглядит так: CEBPayment.CEBPaymentPlugin plugin = new CEBPayment.CEBPaymentPlugin(); Andrey пишет: Посмотри там для Харбора есть пример загрузки DLL и использование функций C++ Пример посмотрел, получается нужно вернуть из библиотеки значение объект, какой тип для этого использовать в calldll() ? И как потом работать с этим объектом, как обычно или через calldll() ?


AndreyZh: Для формирования картинки QR кода использую внешнюю DLL, описание параметров функции брал из мануала. Авось подход поможет? [pre2] /* Генерация QR кода по переданному тексту и маршруту вывода в файл *.bmp До вызова на ПК должна быть установлена библиотека QRCodelib и доступен для вызова DLL файл библиотеки Параметры: cText Преобразуемый в QR Code текст cPath Маршрут вывода картиник кода cBmp Имя файла картинки Возвращает: Имя файла картинки с маршрутом */ FUNC cQRGen(cText,cPath,cBmp) STAT qrDLL LOCA cFile:="", nResp:=0 #Define DC_CALL_STD 0x0020 DEFAULT cPath TO "", cBmp TO "QR.BMP", cText TO "http://check.egais.ru?id=UUID&dt=0404161630&cn=Common_Name" cFile := cPath+cBmp IF !File("QRCodelib.Dll") THEN RETU "" qrDLL := LoadLibrary("QRCodelib.Dll" ) // Подгружается библиотека из DLL файла nResp := DllCall(qrDLL,DC_CALL_STD,"FastQRCode",cText,cFile) // Формирование и вывод в файл FreeLibrary(qrDLL) // Освобождение из памяти ресурсов занятых библой RETU (cFile) [/pre2]

alkresin: Поскольку речь идет о Com-объекте, надо, наверное, использовать не подключение dll, а OLE-механизм, что-то вроде: [pre2] obj := win_OleCreateObject( "CEBPayment.CEBPaymentPlugin" ) obj:config()[/pre2]

Pasha: MIKHAIL пишет: Имеется библиотека COM объекта DLL Так может там есть COM интерфейс, и ничего подключать и не надо ? PS практически одновременно выстрелили

MIKHAIL: alkresin пишет: obj := win_OleCreateObject( "CEBPayment.CEBPaymentPlugin" ) obj:config() Это я попробовал с самого начала, возвращает пустой результат. Уже пробовал вставлять куски программы на С через #pragma, но так как не смыслю в С, выдает ошибки которые не знаю как исправить

Pasha: Может эту dll надо зарегистрировать ? Что-то вроде regsvr32 CEBPayment.dll В доке что-то есть по этому поводу ? Как использовать эту dll, и что это вообще такое ?

MIKHAIL: Pasha пишет: Может эту dll надо зарегистрировать ? Да, есть инсталяшка, регистрирует dll Что это такое уже написал выше. По идее, при инициализации должны получить объект и работать с ним как обычно.

alkresin: Может, правильное имя этого COM-объекта не "CEBPayment.CEBPaymentPlugin", а как-то по другому. Попробуйте посмотреть список всех зарегистированных COM-объектов в системе - есть специальные утилиты, ActiveXHelper, например.

Dima: MIKHAIL Доку скинь сюда

MIKHAIL: Dima пишет: Доку скинь сюда дока + демоверсия

Dima: MIKHAIL Так в пукте 2 все ж изложено и надо пробовать

MIKHAIL: Прислали тест на C#, у меня запускается, значит библиотека рабочая

MIKHAIL: Dima естественно я это все проделывал, об этом писал выше... у меня не получается создать объект в программе

Dima: Поигрался и тоже ничего не вышло. Объект создать не получилось. Если играться как с DLL , то сама DLL грузится нормально и хэндл возвращает. А вот вызвать из нее config не получилось

MIKHAIL: информация от разработчика: В С++ подключается так: #import "CEBPayment.dll" - здесь путь до библиотеки, отсюда компилятор импортирует методы. Это нужно один раз для компиляции. Использоваться будет библиотека, прописанная в реестре. CEBPayment::ICEBPaymentPluginPtr plugin; CoInitialize(NULL); CEBPayment::ICEBPaymentPluginPtr plugin(L"CEBPayment.CEBPaymentPlugin"); plugin->config(); CoUninitialize(); И в С# и в C++ использовалось раннее связывание. пробовал вставить код: #pragma BEGINDUMP #import "CEBPayment.dll" CEBPayment::ICEBPaymentPluginPtr plugin; HB_FUNC( MYDL ) { CoInitialize(NULL); CEBPayment::ICEBPaymentPluginPtr plugin(L"CEBPayment.CEBPaymentPlugin"); plugin->config(); CoUninitialize(); } #pragma ENDDUMP сыпятся ошибки: Error E2503 magazin.prg 10637: Missing or incorrect version of TypeLibImport.dll in function HB_FUN_MYDL Error E2451 magazin.prg 10638: Undefined symbol 'CEBPayment' in function HB_FUN_MYDL Error E2379 magazin.prg 10638: Statement missing ; in function HB_FUN_MYDL Warning W8065 magazin.prg 10639: Call to function 'CoInitialize' with no prototype in function HB_FUN_MYDL Error E2379 magazin.prg 10640: Statement missing ; in function HB_FUN_MYDL Error E2451 magazin.prg 10641: Undefined symbol 'plugin' in function HB_FUN_MYDL Warning W8065 magazin.prg 10642: Call to function 'CoUninitialize' with no prototype in function HB_FUN_MYDL видимо что то не хватает или не совместимо...

Dima: я пробовал Impdef но список получился не большой [pre2] LIBRARY CEBPAYMENT.DLL EXPORTS DllCanUnloadNow @3 @0 ; DllCanUnloadNow DllGetClassObject @4 @1 ; DllGetClassObject DllRegisterServer @2 @2 ; DllRegisterServer DllUnregisterServer @1 @3 ; DllUnregisterServer [/pre2]

alkresin: Ну, во-первых, надо включить соответствующие C заголовки: #include <windows.h> #include <ole2.h> #include <ocidl.h> Во вторых, в #pragma BEGINDUMP ... #pragma ENDDUMP это, наверное, не может компилироваться, т.к. это C++ код. а Harbour использует C компилятор. Поэтому надо вынести код в отдельный файл с расширением cpp и откомпилировать: [pre2]void mydl( void ) { ... }[/pre2] и вызывать эту mydl() из HB_FUNC( MYDL ): [pre2]#pragma BEGINDUMP HB_FUNC( MYDL ) { mydl(); } #pragma ENDDUMP[/pre2] Может, что-то получится.



полная версия страницы