Qaxbase error calling idispatch member item exception thrown by server

Qt + COM (ActiveX) = Властелин упрвления сервером 1С предприятия Доброго времени суток господа! Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С. […]

Содержание

  1. Qt + COM (ActiveX) = Властелин упрвления сервером 1С предприятия
  2. Qaxbase error calling idispatch member item exception thrown by server
  3. Qaxbase error calling idispatch member item exception thrown by server
  4. Qaxbase error calling idispatch member item exception thrown by server

Доброго времени суток господа!
Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С.
Подскажите как это в Qt можно реализовать?

Например есть чудесный, скриптовый язык PowerShell, в нём можно релизовать следующее:
//подключаю ком объект
$connector = New-Object -ComObject “V82.ComConnector”
//подключаюсь к базе 1С
$connection = $connector.Connect(“Srvr=”“сервер1С”“;Ref=”“база”“;Usr=”“пользователь”“;Pwd=”“пароль”“;”)
//смотрим пользователей в базе
$users = Get-Property -comObj $connection -prName “ПользователиИнформационнойБазы”

Вроде разобрался как использовать COM соединение

Извиняюсь, господа, а от куда столько негатива и бреда? Какой вирус, какая зарплата, какой велосипед? Есть 1с, есть AD, связать группы пользователей AD + добавлять/удалять в 1с, может быть ещё какую-нибудь плюшку.
И причем вирус с гуи, если ни одного класса виджен и/или диалог не задейстовано?

зы Если по делу писать нечего, лучше не писать (или направить туда, где могут подсказать), а не бестолковофлудием заниматься.

Ошибка в том, что метод Connect именно ВОЗВРАЩАЕТ IDispatch* , через который и надо выполнять все дальнейшие действия с 1С.
V82.COMConnector это соединитель, а не соединение. Объект соединения возвращает его метод Connect.

В скрипте повершел правильно написано.
А вот с++ коде не так.

DmitrO
Спасибо за разъяснение! Но, что это за тип возвращаемый такой IDispatch* не могу понять.
Допустим можно сделать вызов и получить через методы querySubObject и dynamicCall данные QAxObject * и QVariant соответственно. Но блин про IDispatcher нет ни слова в типе возвращаемых данных http://qt-project.org/doc/qt-5.0/activeqt/qaxbase.html#querySubObject-2

Ладно, ОК. Создадим указатель на активикс объект с адресом на результат, который мы получим при вызове внутреннего метода 1С connect.

Через 30 сек после запуска вывалится всё та же ошибка!

QAxBase: Error calling IDispatch member Connect: Exception thrown by server
<. (172)>: . . . . .
. (. ): . . . . — ‘. ‘: <.
. _. (186)>: . . . . . .
. (. ): . . .
. . . .
Help :
Connect to the exception(int,QString,QString,QString) signal to catch this exception

Почему? Я же результат объекту передал!

DmitrO
Я в 12 сообщении тоже самое попробовал, и всё равно та-же ошибка :(, что Error calling IDispatch member Connect: Exception thrown by server

etc
Большую часть съедает платформа .NET (больше стони мегабайт (в то и две)) на которой собственно этот PowerShell и работает. Ну и + задержки самого скриптового языка.
А на C++ com при старте в поток, пока грузится тем временем к базе LDAP коннект и выборка юзверей из AD.

Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя небыло в справочнике пользователей, поэтому и не пускал 🙂

Теперь вот голову ломаю, как правильно список пользователей выбрать .

Тут вопрос не в том как можно, можно хоть на питоне, хоть на вбс, хоть на повершеле (и еще десятки других скриптовых обработчиков / и систем с компиляцией в «типо» байткод).
Вопрос в том, как это на Qt сделать правильно. (фанат GNU, C++ и т.д.).

Сейчас уже вопрос наверно не кутистам, а к 1сникам.
Подскажите пожалуйста, как правильно выбрать всех пользователей из справочника?
Например, захожу в конфигуратор — открыть конфигурацию
Слева есть список объектов и всего всего, есть пункт Справочники — Пользователи
Как правильно сделать NewObject чтобы получить ссылку на этих пользователей?
но в ответ ругается
[CPP]QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
Help :
Connect to the exception(int,QString,QString,QString) signal to catch t
his exception[/CPP]
По коду 1001 я понял, что это отсутствие данного метода, собственно поэтому и ошибка Error calling IDispatch member NewObject что никакой указатель не вернулся.
Но если сделать
[CPP]QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники;»));[/CPP]
То какая то другая ошибка будет (кодировку не могу победить, извините), не 1001, т.е. как бы существует Справочники, но что-то не то вызываю.

Вопрос — как правильно сделать соединитель на Справочники.Пользователи и потом через метод String выбрать всех пользователей?
зы И ещё, если кто знает, подскажите пожалуйста, где можно посмотреть подробные логи действий на 1С сервере, ведь ошибка которая мне вопросиками отдается, должна же она где то на сервере храниться?!

Но блин получаю ошибку
QAxBase: Error calling IDispatch member NewObject: Bad parameter count

Т.е. как бы возвращается не указатель на менеджер пользователей, а что-то другое?
Делаю для того, чтобы потом GetUsers с объектом ab сделать.

2000$? Сам в свое время тыкал, но отказался от этой идеи.

А вот если нативную компоненту сделали бы. Это бы был бы шаг вперед..

Да нет, что то вы черезчур утрируете закрытость къюта
http://www.digia.com/ru/What-we-do/Qt/Qt-licensing/
Главное статично не линковать, да и всё. (было бы много проблем с лицензированием, кеды, влк и т.д. уже бы от къюта отказались бы)

Вопрос лицензирования конечно очень интересен, но хотелось бы по участвовать в дискуссиях по коннекту к 1С через COM средствами къюта

Источник

Qaxbase error calling idispatch member item exception thrown by server

Студент

Группа: Участник
Сообщений: 68
Регистрация: 12.1.2009
Пользователь №: 485

Репутация: 2

Привет.
Здесь столкнулся с такой заботой.
QAxObject *range = StatSheet->querySubObject( «Range(const QVariant&)»,QVariant(QString(«A1:B6»))); (выделяем диапозон для работы)
QAxObject *range = StatSheet->querySubObject( «Range(const QVariant&)»,QVariant(QString(«A1»))) (выделяем 1 ячейку)
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&)»,QVariant(QString(«1»))) ( выделяем 1 ячейку(аналог Cells(1,1))
QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&)»,QVariant(QString(«2»))) (выделяем вторую ячейку (аналог Cells(1,2))

Но у меня есть таблица БД.В ней поля.СЛедовательно,должна соблюдаться структура при выводе данных в Эксель

1 поле 2 поле 3 поле 4 поле 5 поле

Но!Как мне обратиться скажем к Cells(2,2). или Cells(3,4). Причем это обязательно нужно сделать через цифры (Cells(X,Y) (X,Y- целочисленные указатели на ячейки))
Потому что через A1 нельзя вызывать(в таком случае будет слишком мудрено вызываться ячейка B1)

Хм. Ребят,подождите. Сейчас одна идейка возникла. Может написать

QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&,const QVariant&)»,QVariant(QString(«2»)),QVariant(QString(«1»)))

QAxObject *range = StatSheet->querySubObject( «Cells(const QVariant&;const QVariant&)»,QVariant(QString(«4»)),QVariant(QString(«8»)));

Пишет значение в ячейку D1(принял первый параметр равный 4) (((
Он почему то принимает только первый параметр,и всё.

Какие будут предложения?

Сообщение отредактировал abra — 24.3.2009, 19:46

Источник

Qaxbase error calling idispatch member item exception thrown by server

I am trying to access the elements of an Excel file (*xlsx extension) by using the class QAxObject, but my code crashes giving the above error when I call:

I am using Qt 5.7 on Windows 64 bit with MinGw. Any suggestion of what could be the problem? It seems like Worksheets is not a subobject of workbooks, but everyone is using that keyword to access the sheets of excel.

Thanks in advance

I would test with some VBA to see if it does like it.

Hi
This fails ( for me, even i added file at path)
QAxObject* workbook = workbooks->querySubObject(«Open (const QString&)», QString(«C:Qtex2.xlsx»));

so workbooks is NULL (hence you crash)

The workbook opening does not fail, indeed if I give him an inexistent file I receive an error telling me that file does not exists. SO the file is surely found, and if I remove the last line (quering for the workbooks) I have no errors.

I used both the working examples given in your links, trying also:

But the error is the same (Sheets instead of Worksheets)

@CBenussi
Did you try
QAxObject * workbooks = excel.querySubObject(«WorkBooks»);
workbooks->dynamicCall(«Add»);
QAxObject * workbook = excel.querySubObject(«ActiveWorkBook»);
QAxObject * worksheets = workbook->querySubObject(«WorkSheets»);

I just tried, same error.

@CBenussi
Hi ok.
I cant find any info on why it should not work.
I dont have office at home so can’t check if I can reproduce it.

Have you tried the same in VBA?

Update:
This works at work with office 2010.
it lists the sheets
1 «Sheet1»
2 «Sheet2»
3 «Sheet3»

Not working, but I think I understood what is the problem (it works with VBA though). When I open Excel from Qt programmatically, a window shows asking for Microsoft Office activation, then it is probably that which is blocking the access to the sheets:

I need to deactivate it in some way

Update: CAnnot find a way to load the screenshot, sorry. The window is titled: «this copy of microsoft office is not activated 2013», to go on I just need to click on «close» and everything is fine.

@CBenussi
Hi
Yes that could block automation as you can ask it to be hidden and in that way could
use non valid Excel if always hidden.
I tried it with 2 other pcs and both gave me list so it can work.

Just register it and it will shut up. 🙂
Alternativ u can get 2016 for 30 days
https://products.office.com/en-us/try

Update: CAnnot find a way to load the screenshot, sorry.

Источник

Qaxbase error calling idispatch member item exception thrown by server

Возникла пара вопросов:
1. Как вставить картинку в ячейку?
2. Как создать новый workbook и в нем sheet с заданным именем?
3. Как изменить формат представления данных в ячейке? (например, я ввожу число «5.2» — а отображается «5 февраля»)
4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).

Если кто что знает, отпишитесь плиз )) Спасибо!

На VBA это будет так:
следовательно, делаем примерно так:
код не проверял, но думаю должен работать.

Если работает, то можно будет данный код добавить в вики, как и твой.

p.s. будет время приведу пример, как сделать остальные пункты.

Вспомнил что когда-то давно что-то писал на VBA. Вобщем, общая идея работы с ActiveQT — эта библиотека позволяет работать с любыми библиотеками/приложениями, поддерживающими COM. Список методов и свойств объектов можно посмотреть в tlb-хе соответствующего приложения (например, через OLEView). Если етсь *.tlh или idl-ник — можно и там напрямую через текстовые редакторы. В случае с Excel идеально помогает VBA. Запускаем Excel, жмем Alt+F11, пишем процедуру открытия книги например и там эксперементируем. По «F2» можно посмотреть список классов их методов и свойств. Выбираем метод — давим «F1», читаем как им пользоваться. Далее читаем документацию по функциям ActiveQt — querySubObject/dynamicCall/setProperty/property.

1. Как вставить картинку в ячейку?
На VBA будет так:

Пробовал переписать так:

не фурычит. pShape2 == NULL и картинка не грузица. В querySubObject если нужно вызывать функцию, нужно описать сигнатуру этой функции.. А сигнатура такая:

Я много как пробовал: не хотит пока. Че писать пока не понял (особенно насчет MsoTriState).

2. Как создать новый workbook и в нем sheet с заданным именем?

Создаем новую книгу (при этом совершенно необязательно что-то там открывать с диска)

Удалить листы можно так:

Новый лист создать можно так:

3. Как изменить формат представления данных в ячейке? (например, я ввожу число «5.2» — а отображается «5 февраля»)
На VBA так:

На ActiveQT чет не особо работает. Поэтому решил проблему так:

4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).

Вот так можно задать границы области печати (и задать ориентацию (собсно ка ViGOur писал выше)):

Источник

Forum Updated on Feb 6th

This topic has been deleted. Only users with topic management privileges can see it.

  • I am trying to access the elements of an Excel file (*xlsx extension) by using the class QAxObject, but my code crashes giving the above error when I call:

        QAxObject* excel = new QAxObject("Excel.Application");
        excel->setProperty("Visible", false);
        QAxObject* workbooks = excel->querySubObject("WorkBooks");
        QAxObject* workbook = workbooks->querySubObject("Open (const QString&)", QString("C:\Qt\ex2.xlsx"));
        QAxObject* sheet = workbook->querySubObject("Worksheets");
    

    I am using Qt 5.7 on Windows 64 bit with MinGw. Any suggestion of what could be the problem? It seems like Worksheets is not a subobject of workbooks, but everyone is using that keyword to access the sheets of excel.

    Thanks in advance

  • Hi
    What version of Excel?
    Seems to be from Office 2013 and later
    https://msdn.microsoft.com/en-us/library/office/ff194464.aspx

    I would test with some VBA to see if it does like it.

  • @CBenussi

    Hi
    This fails ( for me, even i added file at path)
    QAxObject* workbook = workbooks->querySubObject(«Open (const QString&)», QString(«C:Qtex2.xlsx»));

    so workbooks is NULL (hence you crash)

    Did you use this sample ?
    https://wiki.qt.io/Using_ActiveX_Object_in_Qt

    There is also
    https://forum.qt.io/topic/1840/working-with-excel-sheet

  • Hi,

    The workbook opening does not fail, indeed if I give him an inexistent file I receive an error telling me that file does not exists. SO the file is surely found, and if I remove the last line (quering for the workbooks) I have no errors.

    I used both the working examples given in your links, trying also:

        QAxObject *excel;
        QAxObject *wbooks;
        QAxObject *book;
        QAxObject *sheets;
        QAxObject *cell;
        excel = new QAxObject("Excel.Application");
        excel->setProperty("Visible", false);
        wbooks = excel->querySubObject("Workbooks");
        book = wbooks->querySubObject("Open (const QString&)", "C:\Qt\ex2.xlsx" );
        sheets = book->querySubObject("Sheets");
    
    

    But the error is the same (Sheets instead of Worksheets)

  • @CBenussi
    Did you try
    QAxObject * workbooks = excel.querySubObject(«WorkBooks»);
    workbooks->dynamicCall(«Add»);
    QAxObject * workbook = excel.querySubObject(«ActiveWorkBook»);
    QAxObject * worksheets = workbook->querySubObject(«WorkSheets»);

  • Hi,

    I just tried, same error…

  • @CBenussi
    Hi ok.
    I cant find any info on why it should not work.
    I dont have office at home so can’t check if I can reproduce it.

    Have you tried the same in VBA?

    Update:
    This works at work with office 2010.
    it lists the sheets
    1 «Sheet1»
    2 «Sheet2»
    3 «Sheet3»

      QAxObject* excel = new QAxObject("Excel.Application");
      excel->setProperty("Visible", true);
      QAxObject* workbooks = excel->querySubObject("WorkBooks");
      QAxObject* workbook = workbooks->querySubObject("Open (const QString&)", QString("e:\ex2.xlsx"));
      if (!workbook) {
        qDebug() << "workbook NULL";
        return;
      }
    
      QAxObject* worksheets = workbook->querySubObject("WorkSheets");
    
      if (!worksheets) {
        qDebug() << "sheet NULL";
        return;
      }
    
      int intCount = worksheets->property("Count").toInt();
      for (int i = 1; i <= intCount; i++) {
        int intVal;
        QAxObject* worksheet = workbook->querySubObject("Worksheets(int)", i);
        qDebug() << i << worksheet->property("Name").toString();
      }
    }
    
    
  • Not working, but I think I understood what is the problem (it works with VBA though). When I open Excel from Qt programmatically, a window shows asking for Microsoft Office activation, then it is probably that which is blocking the access to the sheets:

    prompt

    I need to deactivate it in some way

    Update: CAnnot find a way to load the screenshot, sorry. The window is titled: «this copy of microsoft office is not activated 2013», to go on I just need to click on «close» and everything is fine.

  • @CBenussi
    Hi
    Yes that could block automation as you can ask it to be hidden and in that way could
    use non valid Excel if always hidden.
    I tried it with 2 other pcs and both gave me list so it can work.

    Just register it and it will shut up. :)
    Alternativ u can get 2016 for 30 days
    https://products.office.com/en-us/try

    Update: CAnnot find a way to load the screenshot, sorry.

    Use external site. like postimg.org or any other.

  • @CBenussi
    Yep you should fix that with a valid key OR
    if it was a trial, you can rearm it for 30 days
    https://technet.microsoft.com/en-us/library/dn385362.aspx

  1. 20th November 2013, 17:50


    #1

    Question QAxBase exception signal

    Hi all,

    I’m using QAxBase objects (ms excel automation) and would like to connect the QAxBase::exception(int,QString,QString,QString) signal to manage errors but i can’t …

    So, i’ve opened «qaxbase.h» source code and found :

    1. #ifdef qdoc

    2. Q_SIGNALS:

    3. void signal(const QString&,int,void*);

    4. void propertyChanged(const QString&);

    5. void exception(int,const QString&,const QString&,const QString&);

    6. #endif

    To copy to clipboard, switch view to plain text mode 

    of course «qdoc» is not defined … so, what am i missing ?

    I have hardly googled, read the docs, searched on this forum but i found nothing …
    (I think there’s no link between the «#define qdoc» in the code and the «QDoc» html doc generator tool, so googling on qdoc is’nt an easy task but maybe i’m wrong)

    I’m using qt4 (same results with 4.7.4 and 4.8.5)
    I’ve put «CONFIG += qaxcontainer» in my pro file and nothing more.
    My code compile and runs well …

    Please give me an answer even if its stupid (i’m really good at stupid mistakes ) or a link to the answer i havn’t been able to find.

    thanks in advance


  2. 25th November 2013, 18:04


    #2

    Default Re: QAxBase exception signal

    a little up please …

    I don’t find how to edit my post, so, i continue it
    There’s no answers, tell me if i’m doing anything wrong (am i violating forum rules ? maybe the bold text is provocating, i thought it would permit a faster read of my problem … please just tell me)

    Anyway, another formulation of my problem would be :

    Why the signals of QAxBase object are declared within a «#ifdef qdoc» directive ?

    thanks again


  3. 11th December 2013, 12:38


    #3

    Default Re: QAxBase exception signal

    another up … (two weeks later, i can, can’t i?)

    ok, let’s assume the exception signal is just a joke and just exists in documentation but not in the code !
    it’s just defined in qaxbase.h to generate documentation and make custommer trust active Qt is worth the bsd licence !

    please tell me i’m wrong and criticize my disrespectful behavior !


  4. 12th December 2013, 00:17


    #4

    Default Re: QAxBase exception signal

    Your lack of response could be because few people use ActiveQt, and fewer have tried to use your particular corner of it.

    Exactly how are you trying to connect?
    Are the unspecified errors at compile, link, program run time, or during ActiveX operations?
    What are the exact errors?
    Can you post a complete, small example that demonstrates the problem?


  5. 12th December 2013, 12:06


    #5

    Default Re: QAxBase exception signal

    thank you so much for your answer !!!!

    Your lack of response could be because few people use ActiveQt, and fewer have tried to use your particular corner of it.

    I know that the good guys uses dumpcpptool. But, I’m not doing anything particular, just using a Qt class and connecting one of it signals to the slot of another Qt class … nothing more than connecting the «clicked()» signal of a QPushButton …

    Exactly how are you trying to connect?

    well, normally : connect(QAxObject *,SIGNAL(exception(int, QString, QString, QString), this, SLOT(myErrorHandleSlot(int, QString, QString, QString))
    but when typing, the autocompletion didn’t work, so, I checked my includes and includepath, …. everything were OK. So , at last, I’ve gone to the qaxbase.h source code and found the exception signal defined within an #ifdef qdoc preprocessor statement … so, of course, i cannot connect. I could let this connect line code, it will compile but during runtime i’ll get an error like «no such signal …» (using Qt4)

    Are the unspecified errors at compile, link, program run time, or during ActiveX operations?
    What are the exact errors?

    The errors are during ActiveX operations but are normal errors which can occur using excel, for instance, trying to write two cells within one, …
    my code compile and runs well, but, when an operation fails, an explicit message outputs on console and says «connect to the exception signal to retrieve these message»

    As I can’t connect to this signal, I just can know that the operation fails but not why and i can’t show an explicit message to the user.

    Can you post a complete, small example that demonstrates the problem?

    Of course : http://www.itest.fr/Download/AxExcel.zip

    The connection with exception signal is in xlapp.cpp file, line 38 :

    1. XLApp::XLApp(QObject *parent) :

    2. _xl(NULL),_workBooks(NULL)

    3. {

    4. _xl = new QAxWidget("Excel.Application");

    5. // QObject::connect(_xl,SIGNAL(exception(int,QString,QString,QString)),

    6. // this,SLOT(saveLastError(int,QString,QString,QString)));

    7. setVisible(false);

    8. _workBooks = _xl->querySubObject("Workbooks");

    9. }

    To copy to clipboard, switch view to plain text mode 

    Running the program should output an error message containing the informations of the exception signal i’d like to retrieve when executing the line 16 of main.cpp :

    1. book->saveAs("Not*saveable");

    To copy to clipboard, switch view to plain text mode 

    it should ouput these wonderfull lines :
    error code = 1004
    Source = Microsoft Excel
    Description = A really really good description but in french in my case … (something like «file access error. Check the folder exists, …»)


  6. 12th December 2013, 15:01


    #6

    Default Re: QAxBase exception signal

    Sorry, i should have made a really simpler example (still complete and compilable):

    project file, let’s say «AxExcel.pro»

    1. QT += core gui

    2. TARGET = TestAxExcel

    3. TEMPLATE = app

    4. CONFIG += qaxcontainer

    5. SOURCES += main.cpp

    6. HEADERS += exceptreceiver.h

    To copy to clipboard, switch view to plain text mode 

    file exceptreceiver.h :

    1. #ifndef EXCEPTRECEIVER_H

    2. #define EXCEPTRECEIVER_H

    3. #include <QObject>

    4. #include <QDebug>

    5. class ExceptReceiver : public QObject

    6. {

    7. Q_OBJECT

    8. public:

    9. public slots:

    10. {

    11. qDebug()<<errorCode<<source<<description<<help;

    12. }

    13. };

    14. #endif // EXCEPTRECEIVER_H

    To copy to clipboard, switch view to plain text mode 

    file main.cpp :

    1. #include <QApplication>

    2. #include <QAxObject>

    3. #include "exceptreceiver.h"

    4. int main(int argc, char *argv[])

    5. {

    6. QAxObject xlObj("Excel.Application");

    7. ExceptReceiver er;

    8. if(QAxObject *wbs = xlObj.querySubObject("Workbooks"))

    9. {

    10. if(QAxObject *workbook = wbs->querySubObject("Add()"))

    11. {

    12. workbook->dynamicCall("SaveAs(const QString &)","not*saveable");

    13. delete workbook;

    14. }

    15. delete wbs;

    16. }

    17. return 0;

    18. }

    To copy to clipboard, switch view to plain text mode 

    Console output when running this program (in french but it shouldn’t be important) :

    1. QAxBase: Error calling IDispatch member SaveAs: Exception thrown by server

    2. Code : 1004

    3. Source : Microsoft Excel

    4. Description: Fichier inaccessible. Essayez l'une des op?rations suivantes?:

    5. ? V?rifiez que le dossier sp?cifi? existe.

    6. ? V?rifiez que le dossier dans lequel se trouve le fichier n'est pas en lecture seule.

    7. ? V?rifiez que le nom du fichier ne comporte les caract?res suivants: | < > ? [ ] : ni *

    8. ? V?rifiez que le nom du fichier ou du chemin ne d?passe pas 218 caract?res.

    9. Help : xlmain11.chm

    To copy to clipboard, switch view to plain text mode 

    Last edited by thomas@itest; 12th December 2013 at 15:17.

    Reason: added console output


  7. 24th September 2015, 15:09


    #7

    Default Re: QAxBase exception signal

    damn…I hit the same problem to you.
    Have you fixed it buddy?Could you mind telling me how to slove it?
    thanks all…


  8. 24th September 2015, 15:33


    #8

    Default Re: QAxBase exception signal

    No, I gave up with Qt ActiveX !
    Wrapping COM objects is not a huge work even if msdn documentation is a pain in the …


  9. 18th December 2017, 12:05


    #9

    Default Re: QAxBase exception signal

    There is my code, It maybe help.

    1. if (!xlObj->isNull())

    2. {

    3. xlObj->blockSignals(false);//<------- important

    4. connect(xlObj, SIGNAL(signal(QString, int, void*)), SLOT(signal(QString, int, void*)));

    5. }

    To copy to clipboard, switch view to plain text mode 

    In .h file

    1. public Q_SLOTS:

    2. void signal(const QString& name, int argc, void* argv);

    To copy to clipboard, switch view to plain text mode 

    in .cpp file

    1. void XXXXX::signal(const QString& name, int argc, void* argv)

    2. {

    3. VARIANTARG *params = (VARIANTARG*)argv;

    4. if (name.startsWith("BeforeNavigate2("))

    5. {

    6. IDispatch *pDisp = params[argc - 1].pdispVal;

    7. VARIANTARG URL = *params[argc - 2].pvarVal;

    8. VARIANTARG Flags = *params[argc - 3].pvarVal;

    9. VARIANTARG TargetFrameName = *params[argc - 4].pvarVal;

    10. VARIANTARG PostData = *params[argc - 5].pvarVal;

    11. VARIANTARG Headers = *params[argc - 6].pvarVal;

    12. bool *Cancel = params[argc - 7].pboolVal;

    13. }

    14. }

    To copy to clipboard, switch view to plain text mode 


   KUL

20.07.13 — 05:29

Доброго времени суток господа!

Хочется общаться с 1С сервером через COM, т.е. подключиться, посмотреть какие пользователи в базе, выбрать чего-нибудь, добавить пользователя, посмотреть текущие сеансы подключения к 1С серверу. В общем, хочется от определенных данных, например групп в AD, делать определенные действия в 1С.

Подскажите как это в Qt можно реализовать?

Например есть <s>чудесный, скриптовый язык</s> PowerShell, в нём можно релизовать следующее:

//подключаю ком объект

$connector = New-Object -ComObject “V82.ComConnector”

//подключаюсь к базе 1С

$connection = $connector.Connect(“Srvr=”“сервер1С”“;Ref=”“база”“;Usr=”“пользователь”“;Pwd=”“пароль”“;”)

//смотрим пользователей в базе

$users = Get-Property -comObj $connection -prName “ПользователиИнформационнойБазы”

Вроде разобрался как использовать COM соединение

   #include <QApplication>

   #include <QtCore/QObject>

   #include <ActiveQt/QAxObject>

   #include <iostream>

   #include <oleauto.h>

   #include <QDebug>

   
   int main(int argc, char *argv[])

   {

       HRESULT r = OleInitialize(0);

       if (r != S_OK && r != S_FALSE)

       {qWarning(«Qt:(error %x)»,(unsigned int)r);}

       QCoreApplication a(argc, argv);

       QAxObject ax(«V82.COMConnector»,0);

       qDebug()<<ax.dynamicCall(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);

   
   //Здесь не выполняется выборка, потому что верхнее соединение уже разорвано  

    QAxObject *query = ax.querySubObject(«NewObject(QString)», («ПользователиИнформационнойБазы»));

   }

Если посмотреть логи 1С сервера, то происходит успешная авторизация, но через 2 секунды происходит разрыв. Почему??? Ведь я объект не удаляю!!!

Так-же можно отписываться о идеях здесь http://www.cyberforum.ru/qt/thread925124.html или здесь http://qt-project.org/forums/viewthread/29235/

   KRV

1 — 20.07.13 — 08:14

А чем, мон шер, Вас штатные возможности не прельщают? Нафуя городить велосипед с шестиугольными колесами? Или надо оправдать зарплату?

   mselling_ru

2 — 20.07.13 — 08:14

экономия на лицензиях

   jsmith82

3 — 20.07.13 — 08:16

вирус пишешь?

   IOL

4 — 20.07.13 — 09:16

(3) ага с ГУИком :-)

   KUL

5 — 20.07.13 — 11:18

Извиняюсь, господа, а от куда столько негатива и бреда? Какой вирус, какая зарплата, какой велосипед? Есть 1с, есть AD, связать группы пользователей AD + добавлять/удалять в 1с, может быть ещё какую-нибудь плюшку.

И причем вирус с гуи, если ни одного класса виджен и/или диалог не задейстовано?

зы Если по делу писать нечего, лучше не писать (или направить туда, где могут подсказать), а не бестолковофлудием заниматься.

   KUL

6 — 20.07.13 — 11:20

mselling_ru

И кстати, соединение COM полноценно ест 1 ключ лицензии как положено.

   DmitrO

7 — 20.07.13 — 11:36

Ошибка в том, что метод Connect именно ВОЗВРАЩАЕТ IDispatch* , через который и надо выполнять все дальнейшие действия с 1С.

V82.COMConnector это соединитель, а не соединение. Объект соединения возвращает его метод Connect.

В скрипте повершел правильно написано.

А вот с++ коде не так.

   DmitrO

8 — 20.07.13 — 11:38

А закрывается оно потому, что возрвщенное Методом Connect значение уходит из области видимости, и вероятно смарт указатель релизится.

   Fragster

Модератор

9 — 20.07.13 — 12:57

а я ющу пример нативной ВК на QT, потому что самому разбираться лень

   Fragster

Модератор

10 — 20.07.13 — 12:57

ищу

   KUL

12 — 20.07.13 — 14:06

DmitrO

Спасибо за разъяснение! Но, что это за тип возвращаемый такой  IDispatch* не могу понять.

Допустим можно сделать вызов и получить через методы querySubObject и dynamicCall данные QAxObject * и QVariant соответственно. Но блин про IDispatcher нет ни слова в типе возвращаемых данных http://qt-project.org/doc/qt-5.0/activeqt/qaxbase.html#querySubObject-2

Ладно, ОК. Создадим указатель на активикс объект с адресом на результат, который мы получим при вызове внутреннего метода 1С connect.

QAxObject * ax = new QAxObject(«V82.COMConnector»);

QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);

Через 30 сек после запуска вывалится всё та же ошибка!

QAxBase: Error calling IDispatch member Connect: Exception thrown by server

            Code       : 16389

            Source     : V82.COMConnector.1

            Description: {????????????????????????(36)}: ???????????? : 1C-Qt-B

ot-vostok ?? ??? ?????? ? ??????????? ?????????????. ???????? ?????? ??? ???????

??? ???????????? ? ??????????.

{???????????.????????????????????????.??????(172)}: ?????? ??? ?????? ?????? ???

?????? (????????): ?????? ??? ?????????? ??????????? — ‘????????????’: {????????

???.????_???????????.??????(186)}: ?????? ??? ????????? ???????? ???????? ??????

??? (?????????????????????????????????????): ??????? ????????? ?????????????????

???? ???????? ????????? ??????

            Help       :

        Connect to the exception(int,QString,QString,QString) signal to catch this exception

Почему? Я же результат объекту передал!

   KUL

13 — 20.07.13 — 14:09

Главное на 1С сервере происходит коннект -> авторизация(успешная) и через 3 сек -> завершение. Т.е. всё логично, как будто разрушается область выполнения запроса connect в функции ax->querySubObject. Но блин, адрес то отдан, почему разрушается то?

   МихаилМ

14 — 20.07.13 — 14:28

(13)

IDispatch базовый com интерфейс.

   KUL

15 — 20.07.13 — 14:32

Блин, уважаемые, если знаете киньте примерчиком из десяточки строк. Я понимаю почти логику, почти понимаю что нужно. Но блин всё почти …

   arsik

16 — 20.07.13 — 14:36

А зочем Qt?

Товарищ все плюшки по общению с сервером приложения на AutoIt написал. Минимум знаний, минимум времени, максимум КПД

   KUL

17 — 20.07.13 — 15:16

arsik

есть уже что-то подобное на PowerShell. Но время выполнения длинное и памяти ОЗУ ест много. Хочется бинарно, быстро и стандартно.

   DmitrO

18 — 20.07.13 — 15:29

мне кажется либо так:

QAxObject * ac = ax->querySubObject(«Connect(«Srvr=172.0.0.100;Ref=base1;Usr=1C-Bot;Pwd=56q;»)»);

либо так:

QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»»172.0.0.100″»;Ref=»»base1″»;Usr=»»1C-Bot»»;Pwd=»»56q»»;»)»);

либо так:

QAxObject * ac = ax->querySubObject(«Connect(const QString&)», «Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»);

   etc

19 — 20.07.13 — 15:51

(17) большую часть памяти съедает COM объект, а больше всего времени уходит на его создание. Разве нет?

   etc

20 — 20.07.13 — 15:55

(19)+ точнее даже не на создание а на соединение с базой.

   KUL

21 — 20.07.13 — 16:29

DmitrO

Я в 12 сообщении тоже самое попробовал, и всё равно та-же ошибка :(, что Error calling IDispatch member Connect: Exception thrown by server

etc

Большую часть съедает платформа .NET (больше стони мегабайт (в то и две)) на которой собственно этот PowerShell и работает. Ну и + задержки самого скриптового языка.

А на C++ com при старте в поток, пока грузится тем временем к базе LDAP коннект и выборка юзверей из AD.

   etc

22 — 20.07.13 — 16:36

(21) тогда понятно. Хотя задержки скриптового языка не особо я думаю велики. А так если бы интерейс не нужен то можно было бы на простом vbscript реализовать. Тогда по памяти было бы не особо затратно. Но параллельности конечно там нет.

   KUL

23 — 21.07.13 — 16:00

Уважаемые господа, больше идей как правильно прикрутить соединение Connect 1С к QAxObject нет?

   KUL

24 — 23.07.13 — 10:55

Оказалось, что коннект я правильно делаю и соединение успешно, просто моего пользователя небыло в справочнике пользователей, поэтому и не пускал :)

Теперь вот голову ломаю, как правильно список пользователей выбрать …

QAxObject * ax = new QAxObject(«V82.COMConnector»);

QAxObject * ac = ax->querySubObject(«Connect(«Srvr=172.0.0.100;Ref=jkh02;Usr=1C-Bot;Pwd=qaz;»)»);

QAxObject * ab = ac->querySubObject(«CreateObject(ПользователиИнформационнойБазы)»);

Так не получается, говорит что нет такого метода :/. Может кто-нибудь подскажет, где можно описание этих волшебных методов посмотреть?

   arsik

25 — 23.07.13 — 23:59

(17) сравнил, то же мне. автоайти и повершелл.

Автоайти — это по сути конструктор скриптов, никаких потерь на загрузку нетфраемворка нет. Можно гуи слепить там же.

   KUL

26 — 24.07.13 — 02:14

Тут вопрос не в том как можно, можно хоть на питоне, хоть на вбс, хоть на повершеле (и еще десятки других скриптовых обработчиков / и систем с компиляцией в «типо» байткод).

Вопрос в том, как это на Qt сделать правильно. (фанат GNU, C++ и т.д.).

Например, насколько я понял для коннектов внутри базы есть метод NewObject() ?! (с 1с программированием совсем не работал). Тогда не понятно, почему не выходит сделать :(

QAxObject * ab = ac->querySubObject(«NewObject»,QString::fromLocal8Bit(«ПользователиИнформационнойБазы»));

   KUL

27 — 25.07.13 — 06:14

Сейчас уже вопрос наверно не кутистам, а к 1сникам.

Подскажите пожалуйста, как правильно выбрать всех пользователей из справочника?

Например, захожу в конфигуратор — открыть конфигурацию

Слева есть список объектов и всего всего, есть пункт Справочники — Пользователи

Как правильно сделать NewObject чтобы получить ссылку на этих пользователей?

[CPP]    QAxObject * ax = new QAxObject(«V82.COMConnector»);

    QAxObject * ac = ax->querySubObject(«Connect(«Srvr=»172.0.0.100″;Ref=»base1″;Usr=»1C-Bot»;Pwd=»56q»;»)»);

    QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники.Пользователи;»));[/CPP]

но в ответ ругается

[CPP]QAxBase: Error calling IDispatch member NewObject: Exception thrown by server

             Code       : 1001

             Source     : 1C:Enterprise 8.2.15.319

             Description: ??? ?? ????????? ‘???????????.????????????;’

             Help       :

         Connect to the exception(int,QString,QString,QString) signal to catch t

his exception[/CPP]

По коду 1001 я понял, что это отсутствие данного метода, собственно поэтому и ошибка Error calling IDispatch member NewObject что никакой указатель не вернулся.

Но если сделать

[CPP]QAxObject * ab = ac->querySubObject(«NewObject»,QAxObject::tr(«Справочники;»));[/CPP]

То какая то другая ошибка будет (кодировку не могу победить, извините), не 1001, т.е. как бы существует Справочники, но что-то не то вызываю.

Вопрос — как правильно сделать соединитель на Справочники.Пользователи и потом через метод String выбрать всех пользователей?

зы И ещё, если кто знает, подскажите пожалуйста, где можно посмотреть подробные логи действий на 1С сервере, ведь ошибка которая мне вопросиками отдается, должна же она где то на сервере храниться?!

   Cube

28 — 25.07.13 — 06:22

(5) Хм… А я наоборот — из 1С рулю составом группы домена… И ничё, всё работает.

См. тут: v8: Как из 1С добавить пользователя в группу домена

   KUL

29 — 26.07.13 — 08:39

Пытаюсь сделать

QAxObject * ab = ac->querySubObject(«NewObject(«InfoBaseUsersManager»);»);

Это как ab = ac.InfoBaseUsersManager по 1совски

Но блин получаю ошибку

QAxBase: Error calling IDispatch member NewObject: Bad parameter count

Т.е. как бы возвращается не указатель на менеджер пользователей, а что-то другое?

Делаю для того, чтобы потом GetUsers с объектом ab сделать.

   sikuda

30 — 26.07.13 — 08:53

(0,9) Блок ActiveQt — входит только в платную версию Qt, вы честны и ее уже купили ~2000$? Сам в свое время тыкал, но отказался от этой идеи.

А вот если нативную компоненту сделали бы. Это бы был бы шаг вперед..

   KUL

31 — 26.07.13 — 08:56

Почему это он платный? Скачал обычную сборку, установил, указал CONFIG   += qaxcontainer и динамически линкую. Вроде ничего не нарушил.

   sikuda

32 — 26.07.13 — 09:21

Молодой человек(Стаж: 6 дней) Раньше так было.

Сейчас с Digia запутаней http://qt-project.org/legal.html

   KUL

33 — 27.07.13 — 17:17

Да нет, что то вы черезчур утрируете закрытость къюта

http://www.digia.com/ru/What-we-do/Qt/Qt-licensing/

Главное статично не линковать, да и всё. (было бы много проблем с лицензированием, кеды, влк и т.д. уже бы от къюта отказались бы)

Вопрос лицензирования конечно очень интересен, но хотелось бы по участвовать в дискуссиях по коннекту к 1С через COM средствами къюта

Для заблудших душ и для поиска гугла, ссылки где ребята мало-мальски разжевали чайнику 1С как правильно делать:

http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=615219#615219

http://www.cyberforum.ru/1c/thread928446.html

Понравилась статья? Поделить с друзьями:
  • Qt platform plugin could be initialized ошибка как исправить
  • Q flash no disk drive found как исправить
  • Qt out of memory error opening database
  • Qt error processing project file
  • Pyzmq install error