RegisterActiveObject возвращает успешно на сервере, но GetObject не работает ни на каких клиентах? - PullRequest
0 голосов
/ 02 сентября 2011

Я 2 дня работал над созданием простого COM-сервера exe, я тестировал все в Интернете, но все еще не работал!Я создаю простой объект с ATL и регистрирую интерфейс с помощью ATL RegisterClassObjects и RegisterActiveObject, он возвращает success, но любые клиенты не могут использовать метод GetObject для получения объекта, но CreateObject работает.

вот мои файлы проекта:http://www.mediafire.com/?365arde4jyd5v3x

Кто-нибудь может мне помочь?Мне это действительно нужно, это часть моего проекта.Спасибо.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Я наконец решил свою проблему с этим кодом: (CoRegisterClassObject все еще не работает!)

HRESULT hr;
CYourObject *your = new CComObject<CYourObject>();
void *p = NULL;
your->QueryInterface(IID_IUnknown,&p);
IUnknown *var = (IUnknown*)p;
DWORD pdwRegister;


IRunningObjectTable *pROT;
IMoniker *pMon;
LPOLESTR monikerName;
hr = GetRunningObjectTable(NULL,&pROT);

hr = StringFromCLSID(CLSID_YourObject, &monikerName);

LPOLESTR delim = L"!"; // moniker delimiter (set to ! always)
hr = CreateItemMoniker(delim,monikerName,&pMon);

hr = pROT->Register(ROTFLAGS_REGISTRATIONKEEPSALIVE,var,pMon,&pdwRegister);
CLSID id;
hr = CLSIDFromProgID(L"MyAtlProject.YourObject",&id);
0 голосов
/ 08 сентября 2011

Прежде всего, вам нужно проверить, удалось ли вам поместить ваши вещи в ROT.Ищите irotview (какой-нибудь старый SDK?) Или аналогичную утилиту, чтобы убедиться в этом (обновление - RotView вас поймет).

При условии, что запись есть (то есть вынеобходимо проверить код ошибки для вызовов API, которые создают запись ROT), есть два вероятных варианта для клиента, чтобы не получить доступ к записи:

  1. безопасность - нет разрешений для доступа к записи;это не должно быть в том случае, если по крайней мере вы запускаете сервер и клиент с учетными данными администратора и повышенными привилегиями
  2. маршалинг - вам необходимо убедиться, что ваш интерфейс может быть маршализован;самый простой способ - извлечь его из IDispatch и зарегистрировать библиотеку типов;без маршалинга COM не сможет создать пару прокси / заглушка для интерфейсов.
...