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
Инфы по 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
Цитата:
Originally posted by Matush
Люди. Будте активнее, неужели никто DCOM не юзал?
Люди. Будте активнее, неужели никто DCOM не юзал?
Как всегда, на выручку приходит Борланд. Вот выдержка из ComObj.pas (Delphi):
Код:
Когда приходилось пользоваться DCOM-ом, вроде работало.
ЗЫ. OleCheck получает код ошибки OLE/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_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 включен на обоих машинах.
Цитата:
Originally posted by Matush
И походу еще глюк: при попытке законнектиться к СОМ объекту на удаленной машине происходит еррор "сервер RPC недоступен", хотя RPC включен на обоих машинах.
И походу еще глюк: при попытке законнектиться к СОМ объекту на удаленной машине происходит еррор "сервер RPC недоступен", хотя RPC включен на обоих машинах.
А ты уверен, что фабрика класса срабатывает верно? В частности, какая модель потоков используется?
Цитата:
Originally posted by Freeman
А ты уверен, что фабрика класса срабатывает верно? В частности, какая модель потоков используется?
А ты уверен, что фабрика класса срабатывает верно? В частности, какая модель потоков используется?
Фабрика работает правильно (потому как, если коннектится как СОМ, то все ОК).
На счет потоков не могу сказать, поскольку плаваю пока что в СОМ программировании. Думаю, (а точнее оно так и есть) что проблема в моем слабом умении работать с СОМ. На выходных почитаю инфу, надеюсь тогда все прояснится.