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

Ваш аккаунт

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

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

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

Dcom

292
31 августа 2005 года
Matush
726 / / 14.01.2004
Имеется СОМ объект (DLL). Я подключаю клиентскую программу через COM. А хочу подключить через DCOM.
Инфы по DCOM я практически не нашел. Если у кого есть, поделитесь пожалуйста.
292
02 сентября 2005 года
Matush
726 / / 14.01.2004
Люди. Будте активнее, неужели никто DCOM не юзал?

На даный момент я пытаюсь подключить так:
COSERVERINFO csi, *pcsi=NULL;
WCHAR wsz [512];
if (RemoteMachine != NULL)
{
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, RemoteMachine, -1, wsz, MAX_PATH);
memset(&csi, 0, sizeof(COSERVERINFO));
csi.pwszName = wsz;
pcsi = &csi;
}
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

MULTI_QI mq;
mq.pIID = &IID_ISeminar;
mq.pItf = NULL;
mq.hr = S_OK;

hr = CoCreateInstanceEx(CLSID_Seminar, NULL, CLSCTX_SERVER, pcsi, 1, &mq);

Вот в этом месте происходит еррор, в котором сказано что интерфейс непотдерживается, какой мамы?

P.S. идея подключки взята из семпла, что идет вместе с VC6
10
02 сентября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Matush
Люди. Будте активнее, неужели никто DCOM не юзал?


Как всегда, на выручку приходит Борланд. Вот выдержка из ComObj.pas (Delphi):

Код:
function CreateRemoteComObject(const MachineName: WideString;
  const ClassID: TGUID): IUnknown;
const
  LocalFlags = CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER or CLSCTX_INPROC_SERVER;
  RemoteFlags = CLSCTX_REMOTE_SERVER;
var
  MQI: TMultiQI;
  ServerInfo: TCoServerInfo;
  IID_IUnknown: TGuid;
  Flags, Size: DWORD;
  LocalMachine: array [0..MAX_COMPUTERNAME_LENGTH] of char;
begin
  if @CoCreateInstanceEx = nil then
    raise Exception.CreateRes(@SDCOMNotInstalled);
  FillChar(ServerInfo, sizeof(ServerInfo), 0);
  ServerInfo.pwszName := PWideChar(MachineName);
  IID_IUnknown := IUnknown;
  MQI.IID := @IID_IUnknown;
  MQI.itf := nil;
  MQI.hr := 0;
  { If a MachineName is specified check to see if it the local machine.
    If it isn't, do not allow LocalServers to be used. }
  if Length(MachineName) > 0 then
  begin
    Size := Sizeof(LocalMachine);  // Win95 is hypersensitive to size
    if GetComputerName(LocalMachine, Size) and
       (AnsiCompareText(LocalMachine, MachineName) = 0) then
      Flags := LocalFlags else
      Flags := RemoteFlags;
  end else
    Flags := LocalFlags;
  OleCheck(CoCreateInstanceEx(ClassID, nil, Flags, @ServerInfo, 1, @MQI));
  OleCheck(MQI.HR);
  Result := MQI.itf;
end;

Когда приходилось пользоваться DCOM-ом, вроде работало.

ЗЫ. OleCheck получает код ошибки OLE/DCOM и превращает его в исключение.
292
02 сентября 2005 года
Matush
726 / / 14.01.2004
Одна ошибка уже исправлена. Надо передавать вначале IID_IUnknown а не IID_ISeminar:

COSERVERINFO csi, *pcsi=NULL;
WCHAR wsz [512];
if (RemoteMachine != NULL)
{
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, RemoteMachine, -1, wsz, MAX_PATH);
memset(&csi, 0, sizeof(COSERVERINFO));
csi.pwszName = wsz;
pcsi = &csi;
}
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

MULTI_QI mq;
mq.pIID = &IID_IUnknown; ////// вот она
mq.pItf = NULL;
mq.hr = NULL;

if (RemoteMachine != NULL)
hr = CoCreateInstanceEx(CLSID_Seminar, NULL, CLSCTX_REMOTE_SERVER, pcsi, 1, &mq);
else
hr = CoCreateInstanceEx(CLSID_Seminar, NULL, CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER| CLSCTX_INPROC_SERVER, pcsi, 1, &mq);

IUnknown* pUnk = (IUnknown*)mq.pItf;
hr = pUnk->QueryInterface(IID_ISeminar, (void**)&pSeminar);

тут, я имею указатель на IUnknown, по идеи через него я должен получить указатель на IID_ISeminar. Но такого не происходит. Опять ошибка что интерфейс не потдерживается.

И походу еще глюк: при попытке законнектиться к СОМ объекту на удаленной машине происходит еррор "сервер RPC недоступен", хотя RPC включен на обоих машинах.
10
02 сентября 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Matush
И походу еще глюк: при попытке законнектиться к СОМ объекту на удаленной машине происходит еррор "сервер RPC недоступен", хотя RPC включен на обоих машинах.


А ты уверен, что фабрика класса срабатывает верно? В частности, какая модель потоков используется?

292
03 сентября 2005 года
Matush
726 / / 14.01.2004
Цитата:
Originally posted by Freeman
А ты уверен, что фабрика класса срабатывает верно? В частности, какая модель потоков используется?



Фабрика работает правильно (потому как, если коннектится как СОМ, то все ОК).
На счет потоков не могу сказать, поскольку плаваю пока что в СОМ программировании. Думаю, (а точнее оно так и есть) что проблема в моем слабом умении работать с СОМ. На выходных почитаю инфу, надеюсь тогда все прояснится.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог