Запуск 1с из Clarion по OLE

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Есть код на Кларионе. Взят с ClarionLife.net.(автор Балкин А. )
-- PROGRAM

INCLUDE('Keycodes.CLW')
INCLUDE('Errors.CLW')

MAP
Main PROCEDURE
Start1C PROCEDURE
ViewRef1C PROCEDURE
OLEHost PROCEDURE
END

Start1CThread LONG(0);
ViewRef1CThread LONG(0);
OLEThread LONG(0); !Thread хоста OLE объекта
OLEFeq LONG,AUTO; !Номер контрола OLE объекта

CODE
Main;


Main PROCEDURE

AppFrame APPLICATION('1C OLE Automation Server'),AT(,,421,112),FONT('MS Sans Serif',8,,),SYSTEM,MAX,RESIZE
MENUBAR
MENU('&Файл'),USE(?Файл)
ITEM('В&ыход<9>Alt-X'),USE(?FileExit),KEY(AltX),STD(STD:Close)
END
MENU('1&C Предпри<255>тие'),USE(?1CПредприятие)
ITEM('&Запуск'),USE(?Start1C)
ITEM('&Просмотр справочника'),USE(?ViewRef1C)
ITEM('З&акрыть 1С'),USE(?Close1C)
END
END
END

CODE
OPEN(AppFrame);

ACCEPT
CASE EVENT()
OF EVENT:CloseWindow
!Обработка закрытия хоста OLE объекта
END;
CASE ACCEPTED()
OF ?Start1C
IF ~Start1CThread THEN
Start1CThread = START(Start1C,25000);
END;
OF ?ViewRef1C
IF ~ViewRef1CThread THEN
ViewRef1CThread = START(ViewRef1C,25000);
END;
OF ?Close1C
IF OLEThread THEN
SetTarget(,OLEThread);
OLEFEq{'ЗавершитьРаботуСистемы(0)'};
SetTarget();
POST(EVENT:CloseWindow,,OLEThread);
END;
END;
END;

RETURN; !Main

!-----------------------------------------------------------------------
! Поглядеть справочник Номенклатура
!
ViewRef1C PROCEDURE

RefQueue QUEUE
Number STRING(5);
Name STRING(30);
END;

StrRef STRING(50);
RetVal SHORT;

Window WINDOW('Справочник'),AT(,,233,177),FONT('MS Sans Serif',8,,FONT:regular),SYSTEM,GRAY,DOUBLE,MDI
LIST,AT(4,4,226,150),USE(?List1),VSCROLL,FORMAT('30L(2)!M~Номер~@s5@70L(2)!M~Наименование~@s30@'), !
FROM(RefQueue)
BUTTON('Close'),AT(90,160,45,14),USE(?Close)
END


CODE
OPEN(Window);

DO FillQueue;

ACCEPT
CASE Event()
OF EVENT:CloseWindow
ViewRef1CThread = 0;
END;
CASE Field()
OF ?Close
IF Event() = EVENT:Accepted THEN Post(EVENT:CloseWindow).
END;
END;

FREE(RefQueue);
CLOSE(Window);

RETURN; !ViewRef1C

FillQueue ROUTINE
IF OLEThread THEN
SetTarget(,OLEThread);
StrRef=OLEFeq{'CreateObject("Reference.Номенклатура")'}
message('Создали')
RetVal=OLEFeq{StrRef&'.ВыбратьЭлементы(0)'}
message('Подготовили к выборке')
LOOP
RetVal = OLEFeq{StrRef&'.ПолучитьЭлемент()'}
IF RetVal=0 THEN BREAK.
RefQueue.Number = OLEFeq{StrRef&'.Код'};
RefQueue.Name = OLEFeq{StrRef&'.Наименование'};
ADD(RefQueue);
SetTarget();
Display;
SetTarget(,OLEThread);
END;
SetTarget();
message('Вывели')
END;

!-----------------------------------------------------------------------
! Запуск 1С:Предприятия как OLE Automation Server
!
Start1C PROCEDURE
DummyWindow WINDOW,AT(,,41,37),timer(1)
END

CODE
OPEN(DummyWindow)
0{prop:hide}=1
ACCEPT
CASE Event()
OF Event:OpenWindow
Start(OLEHOST,25000)
OF Event:Timer
IF OLEThread THEN 0{prop:timer}=0;Post(Event:CloseWindow).
END;
END; !accept
CLOSE(DummyWindow);

IF OLEThread THEN
SetTarget(,OLEThread);
OLEFeq{'initialize(' & OLEFEq{'RMTrade'} & ',"/M","")'}
SetTarget();
END;

RETURN; !Start1C

!-----------------------------------------------------------------------
! Host Thread для OLE объекта
!
OLEHost PROCEDURE ! Declare Procedure
Window WINDOW('OLEHOST'),AT(,,116,99),GRAY
END

CODE
Open(window)
0{prop:hide}='1'

ACCEPT
CASE Event()
OF EVENT:OpenWindow
OleFeq = CREATE(0,Create:OLE);
IF ~OLEFeq THEN
Message('Не удалось создать OLE Control');
POST(EVENT:CloseWindow);
CYCLE;
END;
OleFeq{PROP:Create} = 'V77.Application';
UNHIDE(OleFeq);
OLEThread = Thread();
END;
END;

CLOSE(Window);
CLEAR(OLEThread);
RETURN;
-------------------------------------------------------------
Так вот. из Clarion55 все работает отлично и хорошо. С61 никакого результата.
Вернее сам процесс 1cv77.exe запускается и все. Как с этим бороться. ?
Написал: Smith(138)
Ответить