Описание проблемы.
1. Создать проект сервер с одним методом:
function TDelphiUpdDM.Test(var Server: OleVariant; out Error: WideString): WordBool; begin
Result := True;
end;
2.Создать проект клиент с вызовом метода.
procedure TfmDelphiUpd.Button1Click(Sender: TObject);
var
Err: String;
D: OleVariant;
begin
DCOMConnection.Connected := True;
D := ClientDataSet1.AppServer;
if DCOMConnection.AppServer.Test(D, Err) then
ShowMessage('Success!')
else
ShowMessage('Failed: ' + Err);
end;
Идея передачи свойства AppServer класса TClientDataSet, как переменной заимствована у Дэна Мизера из Essential Midas Pack.
3. Сервер и клиент должны быть на разных компьютерах.
Если на клиенте был установлен midas.dll
— выполняем
regsvr32 -u <path2midas>\midas.dll
— удаляем целиком ключ системного реестра, если он присутствует.
HKEY_CLASSES_ROOT\TypeLib\{83F57D68-CA9A-11D2-9088-00C04FA35CFA}
4. на сервере регистрируем наш сервер, запуская его
Если у нас на клиенте midas.dll от D7 то пример при вызове метода сервера будет работать, если от D7.1, то нет, будет выдано сообщение об ошибке EOleSysError inteface not supported:
Запуск клиента с midas 7.0 создает ключ реестра
HKEY_CLASSES_ROOT\TypeLib\{83F57D68-CA9A-11D2-9088-00C04FA35CFA}
а клиента с midas.dll от 7.1 — нет.
В случае, если указанный ключ был создан старой версией,
при при замене старой версии на новую, сообщения об ошибке нет. Запуск сервера на клиентской машине также создаёт на ней соответсвующую ветку реестра и проблема не определяется.
Демонстрационный пример имеется.
Что делать и кто виноват?
С уважением
Антон Глазунов