Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Automation Object, Ошибка 'Недопустимая строка с указанием  
V
    Опции темы
Ellmi
Дата 13.12.2010, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Здраствуйте!
Создаю сервер автоматизации и контроллер автоматизации компилится без ошибок, запускаю клиент вылетает сообщение "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;
}
...


PM MAIL   Вверх
xvr
Дата 13.12.2010, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



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


PM MAIL   Вверх
Ellmi
Дата 13.12.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 1.12.2008

Репутация: нет
Всего: нет



Не видно =( .. за то время, что с этим мучаюсь пару раз приложение срабатывало... вот видимо для них я нашла записи в 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 

Это сообщение отредактировал(а) Ellmi - 13.12.2010, 16:22
PM MAIL   Вверх
Balog
Дата 4.10.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.3.2008

Репутация: нет
Всего: нет



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

Кто-нибудь сталкивался с таким? 
Перезагрузка не помогла.
PM MAIL   Вверх
xvr
Дата 4.10.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



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

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

PM MAIL   Вверх
Balog
Дата 4.10.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.3.2008

Репутация: нет
Всего: нет



Я уже подумал об этом. У меня то все права административные а там не факт. Завтра проверю.
В любом случае отпишусь.
PM MAIL   Вверх
Balog
Дата 6.10.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.3.2008

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Balog - 6.10.2011, 00:43
PM MAIL   Вверх
xvr
Дата 6.10.2011, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1030 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.