-
Подскажите пожалуйста, имея idispatch я могу получить ole этого объекта ? или выполнить его метод ?
Спасибо !
-
получить ole этого объекта
Получить, простите, что?!
или выполнить его метод
<интерфейсная ссылка>.<метод>(<параметры>)
Только вот, у IDispatch - не так много методов, которые можно вызвать. Гораздо практичнее - получить нужный интерфейс, и вызывать его методы.
-
подскажи , как получить нужный интерфейс, и вызывать его методы ?
есть 1C, в своей проге я плучаю его IDispatch , как выполнить команду 1С ?
p.s. есть handle 1C (если надо конечно).
-
var
Disp: IDispatch;
V: Variant;
begin
...
V := Disp;
V.SomeMethod(Val1, Val2);
V.SomeMethodNamedArguments(parameter1 := Val1, parameter1 := Val2);
V.SomeProperty := SomeVaule
...
-
можно ли получить список методов которые есть ?
-
например в 1С есть функция "КаталогИБ()" которая возращает путь к каталогу базы
как мне её выполнить имея IDispatch ?
-
> [5] 312Kbps (06.11.06 23:19)
Так пробовал ? var
Disp: IDispatch;
V: Variant;
begin
V := Disp;
V.КаталогИБ();
end;
-
Пробавал, не получается ((( Ошибка ; "Project 1cv7s.exe raised exception class EOleError with massage method 'КаталогИБ' not supported by automation object" (
что можно сделать ? даже и не знаю где искать (
-
Какие интерфейсы поддерживает 1C? Модуль(и) с декларациями поддерживаемых интерфейсов есть?
-
не знаю что тебе ответить (((
можно селать так Ole1C: Olevariant; ..... Ole1C:=CreateOleObject('V1СEnterprise.Application'); Ole1C.Initialize(.....); Ole1C.EvalExpr('КаталогИБ()');
работает но у меня есть IDispatch этой 1С и так понимаю инициализация мне не нужна
но выполнить команду ни как не получается (
-
> у меня есть IDispatch этой 1С
Откуда он у тебя взялся ? Показывай код ..
-
При запуске 1С, она цепляет dll, в которую передается pConnection: IDispatch , самой 1Ски ) Есть специальный визард для делфи, для работы с 1С.
!?!?!?
-
> [9] 312Kbps (06.11.06 23:54)
А так ? Ole1C:=pConnection
Ole1C.EvalExpr('КаталогИБ()');
-
Ну и ?
Ты получил интерфейс, теперь ты можешь вызывать его методы. В чем проблема ?
-
так тоже не работает (((
-
> так тоже не работает
так и говорит - "не работаю" ?
-
когда выполняю так Ole1C:=pConnection Ole1C.EvalExpr('КаталогИБ()');
пишет что "Project 1cv7s.exe raised exception class EOleError with massage method 'КаталогИБ' not supported by automation object"
-
извиняюсь
ошибка: не обнаружен метод EvalExpr
-
Справка по встроенному в 1С:ПРедприятие языку на что дана ?
Там ведь достаточно ясно описано, методом какого конкретно класса является метод EvalExpr() ..
-
Сергей разъесни мне пожалуйста, может я не совсем тупой )
!?!? )
-
разъеснить что ?
-
procedure Tr1C_Link.Init1C(ver: Integer; const path: WideString);
var
vTmp:OleVariant;
begin
Close1C;
if ver=1 then
v1CApp:=CreateOleObject('V77.Application')
else
v1CApp:=CreateOleObject('V75.Application');
vTmp:='NO_SPLASH_SHOW';
try
v1CApp.Initialize(v1CApp.RMTrade,path,vTmp);
except
v1CApp:=UnAssigned;
raise;
end;
end;
procedure Tr1C_Link.Close1C;
begin
v1CApp:=UnAssigned;
v1CDoc:=UnAssigned;
v1CCurDoc:=UnAssigned;
v1CForm:=UnAssigned;
end;
function Tr1C_Link.RetAllDocs: OleVariant;
var
vTmp,vTmpDoc:OleVariant;
begin
cdsDocs.EmptyDataSet;
vTmp:='CreateObject(\"Документ\")';
vTmpDoc:=v1CApp.EvalExpr(vTmp);
vTmpDoc.SelectDocuments;
while vTmpDoc.GetDocument>0 do
begin
cdsDocs.Insert;
vTmp:=vTmpDoc.CurrentDocument;
cdsDocsN.AsInteger:=Integer(vTmp.DocNum);
cdsDocsDate.AsDateTime:=TDate(vTmp.DocDate);
cdsDocsKind.AsString:=String(vTmp.Kind);
end;
Result:=cdsDocs.Data;
end;
Древний код... Дальше сам разбирайся. PS. Я бы посоветовал не заморачиваться с запуском 1С (долго), а просто написать OLE object и запускать его из 1С. Да, пример path: const path='/DD:\Базы_1С\1SBDemo /M /NАдминистратор /P';
-
Попробуй так:
Ole1C:=pConnection; Ole1C := Ole1C.AppDispatch; Ole1C.EvalExpr('КаталогИБ()');
-
один момент по подключению, если в строке пути к базе данных есть пробел, ну например '\Копия Db', то в 1с приходит такой путь '\Копия\' и дальше правильная строка с именем пользователя и пароля как можно это решить?
-
var
Disp: IDispatch;
OV, Ole1c: OleVariant;
begin
OV := OleVariant(Disp);
Ole1c := OleVariant(OV.AppDispatch);
Ole1c.Сообщить('Превед из Delphi !!!', 'i');
end;
Но есть две проблемы: 1. После этого не выгружается 1С даже при закрытии окна (что-то там глючит со счетчиками ссылок AddRef, _Release). 2. Можно ли вытащить IDispatch без использования DLL. вот это не работает:
uses SHDocVw, AddInLib, ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
ShellWindow: IShellWindows;
spDisp: IDispatch;
k: integer;
LE: IInitDone;
OV, Ole1C: OleVariant;
begin
OV := Unassigned;
Ole1c := Unassigned;
ShellWindow := CoShellWindows.Create;
for k := 0 to ShellWindow.Count do
begin
spDisp := ShellWindow.Item(k);
if spDisp = nil then Continue;
LE := nil;
spDisp.QueryInterface(IInitDone, LE);
If LE = nil then Continue;
OV := OleVariant(spDisp);
Ole1c := OleVariant(OV.AppDispatch);
Ole1c.Сообщить('Привет из Delphi');
end;
OV := Unassigned;
Ole1c := Unassigned;
end;
-
Причем здесь вообще какая-то там DLL ?
|