Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Automation Object


Автор: Ellmi 13.12.2010, 03:21
Здраствуйте!
Создаю сервер автоматизации и контроллер автоматизации компилится без ошибок, запускаю клиент вылетает сообщение "class EOleSysError with message 'недопустимая строка с указанием класса'". Голову уже поломала над ней smile 

Сервер (реализация методов)
Код

#include <vcl.h>
#pragma hdrstop
#include <atl\atlvcl.h>
#include "Unit1.h"
#include "CALCULATORIMPL.H"

/////////////////////////////////////////////////////////////////////////////
// TCalculatorImpl

STDMETHODIMP TCalculatorImpl::Protocol(BSTR str)

 try
   {
   Form1->Memo1->Lines->Add(str);
   }
 catch(Exception &e)
   {
   return Error(e.Message.c_str(), IID_ICalculator);
   }
 return S_OK;
}


STDMETHODIMP TCalculatorImpl::Mul(int x, int y, int* res)

 try
   {
   *res = x*y;
   }
 catch(Exception &e)
   {
   return Error(e.Message.c_str(), IID_ICalculator);
   }
 return S_OK;
}



Клиент
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <ComObj.hpp>
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Variant Serv;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Serv=CreateOleObject("Project1.Calculator");
 if (VarType(Serv)==varDispatch)
    {
    AnsiString str = "Пользователь  "+ Edit1->Text;
    Serv.OleProcedure("Protocol",str.c_str());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 int x = StrToInt(Edit2->Text);
 int y = StrToInt(Edit3->Text);
 int res;
 Serv.OleProcedure("Mul", x, y, &res);
 Edit4->Text =  res;
}
...


Автор: xvr 13.12.2010, 14:10
Ваш Project1.Calculator в системе зарегистрирован? В dcomcnfg его видно? (dcomcnfg -> Console Root -> Component Services -> Computers -> My Computer-> DCOM Config)
Или в OLEView (из VS)


Автор: Ellmi 13.12.2010, 15:53
Не видно =( .. за то время, что с этим мучаюсь пару раз приложение срабатывало... вот видимо для них я нашла записи в dcomcnfg (в свойствах путь той папки в котрой было приложение), а Project1.Calculator нету.. а как его зарегистрирокать?.. после описания реализации методов кнопкой Register Type Library регистрировала.. пункт меню Run -> Register ActiveX Servtr не активен 
Цитата

Или в OLEView (из VS)

в Borland Builder OLEView  не нашла

Весь алгоритм создания:

1. Создаю обычное приложение, которое будет сервером, сохраняю.
2. File->New->ActiveX->Automation Object->Ok
3. Добавляю методы, щелкаю Refresh Implementation, пишу реализацию этих методов
4. Компилю
5. Щелкаю Exsport to IDL
6. Все это сохраняю, закрываю
7. Открываю опять, щелкаю Register Type Library, закрываю

8. Создаю обычное приложение, которое будет клиентом, сохраняю.
9. Project -> Import Type Library, Add - нахожу нужную библиотеку -> Create Unit
10. подключаю #include <ComObj.hpp> 
11. дописываю код, компилю, запускаю -> EOleSysError with message 'недопустимая строка с указанием класса'



А ума запустить сервер после компиляции то не хватило! smile .. запустила, он зарегистрировался и все заработало  smile 

СПАСИБО! smile 

Автор: Balog 4.10.2011, 15:57
Не хочу заводить новую тему.
Проблема та же самая что описано выше за исключением того что запуск сервера не приводит к регистрации в DCOM 
Точнее на моем компьютере все выходит нормально, на пробных виртуальных компьютерах тоже все ок, а у заказчика почемуто запуск того же самого файла сервера не добавляет нужный класс в настройках DCOM 

Кто-нибудь сталкивался с таким? 
Перезагрузка не помогла.

Автор: xvr 4.10.2011, 16:58
Цитата(Balog @  4.10.2011,  15:57 Найти цитируемый пост)
а у заказчика почемуто запуск того же самого файла сервера не добавляет нужный класс в настройках DCOM 

Ну например не хватает прав для записи себя в реестр (регистрация COM сервера очень активно туда пишет). Запускаете от администратора?

Автор: Balog 4.10.2011, 19:49
Я уже подумал об этом. У меня то все права административные а там не факт. Завтра проверю.
В любом случае отпишусь.

Автор: Balog 6.10.2011, 00:36
Да, дело было в недостающих правах пользователя.
Но есть еще вопрос:
Есть компьютер-сервер на котором настроен DCOM и несколько компьютеров с программой-клиентом. С одного компьютера клиент связывается с серверной программой без проблем. А с другого через раз, и вообще иногда связь срабатывает а иногда нет, хотя в программе ничего не меняется. Выдает ошибку "Сервер RPC недоступен". Может имеет смысл ловить ошибку и как-то обрабатывать? Например повторно подключаться или еще что?
Или может не настроено что-то?
Что посоветуете?

Автор: xvr 6.10.2011, 09:42
Цитата(Balog @  6.10.2011,  00:36 Найти цитируемый пост)
Или может не настроено что-то?

Покопайтесь в настройках firewall'а. Он (начиная с XP) с настройками по умолчанию не позволяет делать сервера на клиентских машинах  smile Так же можно посмотреть в сторону имен и прав пользователей (желательно, что бы это были доменные пользователи). DCOM во всю пользуется системой security Windows, и если к DCOM серверу попытается присоединится неизвестный (на сервере) клиент - будет облом  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)