Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Biulder, IDispatch и 1С-Бухгалтерия

1
12 ноября 2004 года
kot_
7.3K / / 20.01.2000
Запутался немного с сабжем, вобщем то работа с IDispatch для меня относительно новая вещь, раньше заниматься не приходилось, поэтому возможно я просто чего то не понял.
Задача следующая - мне необходимо из одинсы получить список товаров - возможно с фильтрацией по определенному признаку. А опосле внести изменения в некоторые позиции и записать их обратно. Начал я с оле - но честно говоря толи я не совсем разобрался, то ли другие причины - но я толком так и не понял, как именно мне обращатся к объектам ОДИНСЫ - это первое, ну вобщем не заладилось.
Но в процессе работы наткнулся на неплохой пример работы через интерфейсы и начал с ним разбираться.
Вот код запуска:
Код:
HRESULT result;
CLSID   cls77;
IDispatch *pv77;
result = CLSIDFromProgID(WideString("V77M.Application"), &cls77);
result = CoCreateInstance(cls77, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pv77);
VARIANT       vRet;
DISPID dispIDRmTrade, dispIDInitialize;
DISPPARAMS args = {0, 0, 0, 0};
VARIANT vars[3];
BSTR rmTrade = WideString("RMTrade");

result = pv77->GetIDsOfNames(IID_NULL, &rmTrade, 1, 0, &dispIDRmTrade);
BSTR init = WideString("Initialize");
hr = pv77->GetIDsOfNames(IID_NULL, &init, 1, 0, &dispIDInitialize);
args.cArgs = 3;
args.rgvarg = vars;
ZeroMemory(vars, sizeof(vars));
vars[0].vt = VT_BSTR;vars[0].bstrVal = SysAllocString(WideString("NO_SPLASH_SHOW"));
vars[1].vt = VT_BSTR;vars[1].bstrVal = SysAllocString(WideString("/D Q:\\1CV7\\rg_test2  /N ****** /P ****** "));
result = pv77->Invoke(dispIDInitialize, IID_NULL, 0, DISPATCH_PROPERTYGET, &args,
   &vRet, NULL, NULL);

Эта часть почти целиком взята из примера на исходниках.ру, обработка ошибок инициализации опущена - в реальной программе они присутствуют и инициализация переменных сделана по другому чем у автора - с использованием SysAllocString. Код отрабатывает замечательно и без проблем.
Опосля нам нуно что? Правильно, создать объект "Справочники.ТМЦ" для этого существует функция СоздатьОбъект. Вызываю ее так:
Код:
BSTR                bstrCreateObj      = WideString("CreateObject");
DISPID              dispIDCreateObj;
DISPPARAMS args = {0, 0, 0, 0};
VARIANT       vRet;
VARIANT vars[1];
result  = pv77->GetIDsOfNames(IID_NULL, &bstrCreateObj, 1, 0, &dispIDCreateObj);
args.cArgs = 1;
args.rgvarg = vars;
ZeroMemory(vars, sizeof(vars));
vars[0].vt = VT_BSTR;
vars[0].bstrVal = SysAllocString(WideString("Справочник.ТМЦ"));
hr = pv77->Invoke(dispIDCreateObj, IID_NULL, 0, DISPATCH_PROPERTYGET, &args,&vRet, NULL, NULL);

Объект создается. Вопрос собственно вот в чем - как мне теперь работать с созданным объектом? То есть, мне необходимо вызывать его методы, свойства и т.д. - как мне привязать его к интерфейсу? Может просто я запутался - но отдуплится не могу - мне нужно:
 
Код:
IDispatch *tmcObj;
....
tmcObj->Invoke(...)

а как сделать - понять не могу...:)
Попытка:
 
Код:
result = CLSIDFromProgID(WideString("Справочник.ТМЦ"), &ObjTMC);
result = CoCreateInstance(ObjTMC, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&tmcObj);

не создает интерфейса - ведь это внутренний объект ОДИНСЫ. Подскажите!
И еще вопрос - как завершить сервер автоматизации? По освобождении интерфейсов, объект продолжает висеть в памяти и немного действует на нервы...:) Я перебрал все возможные варианты - Quit,Выход, Завершить - ни один не отработал.
310
12 ноября 2004 года
fellow
853 / / 17.03.2003
Надеюсь, помогут какие-нибудь ссылки по 1С-тематике:
http://www.sinor.ru/~my1c/links.html
1
12 ноября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by fellow
Надеюсь, помогут какие-нибудь ссылки по 1С-тематике:
http://www.sinor.ru/~my1c/links.html


Спасибо. Но я на эту страницу уже второй день медетирую:) Я нашел неплохую инфу по данной теме - с использованием ОЛЕ. Сейчас опробую, и если все путем - размещу.

1
12 ноября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by kot_

Спасибо. Но я на эту страницу уже второй день медетирую:) Я нашел неплохую инфу по данной теме - с использованием ОЛЕ. Сейчас опробую, и если все путем - размещу.


И так - вот решение задачи:

Код:
#include "main.h"
#include <ComObj.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Variant Serv;
Variant Trade;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
Serv = CreateOleObject("V77M.Application");
Trade = Serv.OlePropertyGet("RMTrade");
if ( VarType(Trade) == varDispatch )
{
return;
}
Serv.Exec(Function("Initialize") << Trade << "/D Q:\\1CV7\\rg_test2 /N ****** /P ******" << "" );
Label1->Caption = "Присоединились !";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Serv = Unassigned;
Label1->Caption = "Отсоединились";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
Variant Spr = Serv.Exec(Function("EvalExpr")
                      <<"СоздатьОбъект(\"Справочник.ТМЦ\")");
  Spr.Exec(Function("ВыбратьЭлементы"));
  while (Spr.Exec(Function("ПолучитьЭлемент")) > 0)
    {
      TreeView1->Items->Add(NULL,Spr.OlePropertyGet("Наименование"));
    }
}
//---------------------------------------------------------------------------

Заимствовано на здесь, в подробной статье. Я не привожу комментариев - если кому интересно - заходите читайте в оригинале.
Но все же интересно понять как правильно работать с собственно с интерфейсом - не одной бухгалтерией жив человек.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог