Ставим компонент OCX/DLL на клиентскую машину прямо из Navision

01.12.2010 | Автор: | Рубрика: Общее

Один из эффективных способов расширить функциональность Microsoft Business Solutions–Navision — использовать внешние компоненты OCX/DLL. Однако, прежде чем начать использовать компоненты, их необходимо установить на все клиентские машины, которые подключены к системе. Например, если какой-то пользователь отсутствует в офисе в то время, когда вы их устанавливаете, то на следующий день Navision встретит его радостным сообщением об ошибке :-)

---------------------------
Microsoft Business Solutions-Navision
---------------------------
This message is for C/AL programmers:
Could not create an instance of the OLE control or Automation server identified by
GUID={506B4C1F-587D-4CD3-94A3-00354CF6EFEF} 1.0;
{B0A632A5-B0D1-41E8-A84A-A502B3341363}:Unknown Automation Server.Unknown Class.
Check that the OLE control or Automation Server is correctly installed and registered.
---------------------------
ОК
---------------------------

Сообщение означает всего лишь, что нужный OCX/DLL не найден на компьютере. Пользователь этого, скорее всего, не знает, сообщения испугается :-)

А что делать, если машина вообще находится вне офиса?

Решение есть. Ставить OCX-компоненты в режиме Run-time.

Вам необходимо выяснить имя OCX/DLL, который используется в программе (пускай это будет «Navision pad21.dll») и скопировать его с компьютера, где он УЖЕ установлен, на тот, где его нет. Вообще-то не имеет значения, куда вы решите поместить файл, но хорошим тоном считается класть его либо в папку Navision (где находятся файлы fin.exe/finsql.exe), либо в папку \Program Files\Common Files\Navision. Затем надо запустить режим командной строки (cmd.exe), и использовать утилиту regsvr32.exe, чтобы зарегистрировать компонент в реестре Windows:

cd \Program files\Common Files\Navision
regsvr32 "navision pad21.dll"

Если регистрация компонента прошла успешно, на экран будет выведено следующее сообщение:

---------------------------
RegSvr32
---------------------------
DllRegisterServer in navision pad21.dll succeeded.
---------------------------
ОК
---------------------------

С этого момента, данный OCX/DLL можно использовать в вашем Navision-приложении.

Существует способ сделать то же самое, но прямо в коде Navision. Сперва в коде идет проверка, установлен ли уже необходимый OCX/DLL на клиентской машине. Если нет, то файл OCX/DLL (который мы импортируем в BLOB-поле таблицы базы данных) копируется на клиентскую машину. Затем вызывается regsvr32 для регистрации компонента.

Набор функций, которые можно использовать, ниже.
Для корректной работы вам необходимо создать таблицу OCX/DLL Setup – которая будет хранить компонент, и кодеюнит для регистрации компонента.

OBJECT Table 50000 OCX/DLL Setup
{
FIELDS
{
{ 1;Primary Key          ;Code10  }

{ 2;Notepad DLL          ;BLOB    }
{ 3;Notepad Name         ;Text30  }
{ 4;Notepad Registry Name;Text100 }
{ 5;Notepad Version      ;Text30  }
}
}

OBJECT Codeunit 50000 OCX/DLL Check/Import
VAR
recOcxDllSetup : Record 50000;
OnRun()
fctStart;

PROCEDURE fctImportOCXDLL();
BEGIN

WITH recOcxDllSetup DO BEGIN
IF NOT(GET) THEN
INSERT;
"Notepad DLL".IMPORT('navision pad21.dll',TRUE);
"Notepad Name" := 'navision pad21.dll';
"Notepad Registry Name" := 'Navpad20';
"Notepad Version" := '1.0';
MODIFY;
END;

END;

PROCEDURE fctIsOcxDllInstalled( ptxtRegistryName : Text[100]; ptxtVersion : Text[30]) : Boolean;
VAR
lrecAutServers : Record 2000000046; // Automation Servers
BEGIN
lrecAutServers.SETRANGE(Name, ptxtRegistryName);
lrecAutServers.SETRANGE(Version, ptxtVersion);
EXIT(lrecAutServers.FIND('-'));
END;

PROCEDURE fctInstallOcxDll();
VAR
ltxtFile : Text[250];
lintReturn : Integer;
BEGIN

WITH recOcxDllSetup DO BEGIN
GET;
CALCFIELDS("Notepad DLL");
IF NOT("Notepad DLL".HASVALUE) THEN
ERROR('Не могу найти %1 in %2', "Notepad DLL", TABLECAPTION);
ltxtFile := 'С:\Program Files\Common Files\Navision\' + "Notepad Name";
"Notepad DLL".EXPORT(ltxtFile, FALSE);
lintReturn := SHELL('regsvr32.exe /s ' + '"' + ltxtFile + '"');
IF lintReturn <> 0 THEN
ERROR('Unable to register %1', ltxtFile);
END;

END;

PROCEDURE fctStart();
BEGIN
IF NOT(recOcxDllSetup.GET) THEN
fctImportOcxDll;
IF NOT(fctIsOcxDllInstalled(recOcxDllSetup."Notepad Registry Name",
recOcxDllSetup."Notepad Version")) THEN
fctInstallOcxDll;
END;

Статья – вольный перевод статьи «How To install an OCX/DLL on the client’s PC when needed (at run-time)?» (Luc Van Dyck).

Скачать архив с примером можно здесь.

Автор:

В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.

Количество статей, опубликованных автором: 86.

Добавить комментарий