Posted: Fri Sep 21, 2007 12:50 pm Post subject: работа с внешней библиотекой, OLE2
Добрый день! Помогите пожалуйста с такой проблемой.
Необходимо достучаться из R/3 к внешней библиотеке. Но библиотека не зарегистрирована и не регистрируется в системе.
Т.е. просто прописать в транзакции SOLE (таблице TOLE) не получаетсяю. Можно ли как-то вызывать из ABAPa функции этой внешней библиотеки?
Заранее - сделать из библиотеки некий *.exe не подходит... нада чтоб библиотека загружалась именно в области памяти R/3... изза "соображений безопасности начальства".
Буду очнеь благодарен за советы.
Библиотека, о который Вы говорите, вероятней всего представляет из себя dll под Windows.
Из SAP возможен доступ только к ActiveX объектам, поддерживающим интерфейс обмена OLE2. Поэтому напрямую обратиться к этой библиотеке не получится, необходимо писать некий ActiveX контейнер, который загрузит dll и будет предоставлять (транслировать) методы dll в методы ActiveX. Без этого вряд ли обойдетесь.
То что начальство предлагает загружать dll в область памяти SAP - это, на мой взгляд маловероятно, потому что эта библиотека, даже обернутая в ActiveX, будет выполняться на Презентационном сервере (рабочей станции пользователя), а SAP пространство распределено на Сервере Приложений и их не совместить.
Во первых нужно знать, на каком языке будете писать?
Общий план такой:
1) Создаете контейнер ActiveX c набором необходимых интерфеймов, соотвествующих необходимым методам из dll. Выходной модуль будет иметь расширение OCX.
2) Загружаете dll в память программы и реализуете в программе преобразование вызовов ActiveX методов в вызовы методов dll
Загрузка dll в WinAPI c помощью функции LoadLibrary
Пример: http://www.firststeps.ru/mfc/winapi/r.php?41
3) Регистрация Activex на Windows
C:\Windows\system32\regsvr32.exe myprog1.OCX
После готовности OCX вызывайте его как описано в примере. Здесь используется другой ActiveX элемент, замените названия и входные параметры:
This tip works like the MS Word spell checker. The code has been tested in 4.6C on Windows 2000 and Windows XP machines. For this program to work you should have Microsoft Word installed on your machine.
STEP A.
1. Download the file ( Testspellchk.zip) from this link:
http://www.geocities.com/athavan_raja/Testspellchk.zip
2. Unzip the file (Testspellchk.ocx) to your desktop.
3. Register the control. To register start„»run and in the dialog box type in regsvr32.exe and then drag and drop the file (Testspellchk.ocx) you saved onto your desktop in the dialog box and click OK. You will get a message that the registration is successful.
STEP B.
Create a Function module as follows:
a. Import parameter IN_WORD type string
b. Export parameter OUT_WORD TYPE STRING
c. Exception CNTL_ERROR.
Copy and paste the below given code to the Global Data of the function module:
Code:
class cl_spell definition
inheriting from cl_gui_control .
public section .
methods:
constructor
importing
!parent type ref to cl_gui_container
value(shellstyle) type i optional
value(disp_mode) type i optional
value(life_time) type i optional
value(name) type string optional
exceptions
cntl_error
cntl_install_error .
methods:
spellcheck
importing
wf_string type any optional
exporting
result type any .
endclass .
data: wf_rstring(120) ,
wf_len type i .
data: spell_checker type ref to cl_spell ,
my_container type ref to cl_gui_custom_container,
wf_t(120) ,
this_repid like sy-repid .
********implementation
class cl_spell implementation .
method constructor.
data: ctrl_name(80) type c ,
wf_clsid(100) type c .
if not cl_gui_object=>activex is initial .
wf_clsid = 'Testspellchk.spellchkctrl' .
else .
raise cntl_error .
endif .
if not spell_checker is initial .
call method spell_checker->free.
free spell_checker .
endif .
if not my_container is initial .
call method my_container->free.
free my_container .
endif .
ENDFUNCTION.
Note: When you call this function module with a wrongly spelled word as input you will get a pop up like word for change/ignore the word.
If changed, the FM returns the changed word else it returns the original word.
Огромное спасибо! Самый исчерпывающий ответ за последние 3 недели...
Писать я собираюсь на VC++. С ActiveX я просто еще не сталкивался(
С пунктами 2 и 3 все понятно. По пункту №1 у меня вопрос:
создание ActiveX контейнера с ... - это мне необхожимо создавать MFC ActiveX control или dll?
И если у меня в dllке имеется 3 метода, а мне для работы необходимы только 2? Всеравно создавать интерфреймы под все 3?
По пункту №1 у меня вопрос:
создание ActiveX контейнера с ... - это мне необхожимо создавать MFC ActiveX control или dll?
И если у меня в dllке имеется 3 метода, а мне для работы необходимы только 2? Всеравно создавать интерфреймы под все 3?
Создавать нужно MFC ActiveX control. У меня дома лежит старая книжка "Visual C++ за 21 день" 98 года, там есть очень понятный пример по созданию ActiveX. Постараюсь найти дискету с примером. Или поишите в Интернет.
Нужно создать 2 интерфейсных метода. Это же обертка, которую вы сами пишете. Что хотите, то и отдавайте наружу. Можете добавить свои интерфейсные методы.
С названием книги немного наврал.
С. Холзнер "Visual C++ учебный курс". 14 уроков для освоения языка. Издательсво Питер. 1999 год.
Нужная Вам глава здесь
http://www.sapnet.ru/viewtopic.php?p=507#507
Это пример для 5 версии, но картинки соотвествуют также и 6 версии Visual Studio. Насколько помню, в 7 поменялись пункты меню, но принципиально ничего не изменилось, этот код рабочий и для старших версии.
Т.е. механизм таков, что R/3 из таблицы TOLE по CLSID находит *.ocx, подгружает его, тот в свою очередь делает loadlibrary и выполняет функции библиотеки?
И второй вопрос... передаваемые параметры должны совпадать? Те что в R/3 и те что в базовой библиотеке?
1) Да.
2) Видимо возможны исключения, в общем случае на примере вызова методов excel
CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
порядковый номер и тип параметра должны совпадать.
CreateCred - имя, под которым сделана запись в TOLE
Попробовал такое...
В результате при создании объекта sy-subrc=0, т.е. объект создан, а при вызове метода sy-subrc = 2, т.е. метод не вызывается.
В оригинале в оболочеке
Quote:
int iCode=(*pfnMyFunction1)("", &id_len, "", 0, "INFINITE",0)
т.е. чар, инт, чар, инт, чар, инт... порядок вроде соблюден, а вызова всеравно не наблюдается... ((
Age: 165 Joined: 04 Oct 2007 Posts: 1218 Location: Санкт-Петербург
Posted: Mon Nov 26, 2007 6:36 pm Post subject:
Вы для начала создайте test метод без параметров.
В его реализации сделайте запись в локальный файл, чтобы знать, что он вызвался. Если все нормально, добавляетй по одному параметру, пока не найдете, на чем валится. От простого к сложному - правильный метод нахождения ошибок
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.