Передача строк в / из Delphi COM Server

Я попробовал несколько вариантов кода ниже с возвратом HRESULT (который является предпочтительным стандартом COM) или с возвратом BSTR. Я пробовал и другие типы данных. Я обычно получаю сообщение об ошибке "отсутствует реализация метода интерфейса", но когда я использовал тип возвращаемого значения WideString, возникла исключительная ситуация AccessViolationException на result:=RetVal; инструкция.

Я использую C# на стороне клиента:

var msg = delphi.GetMessage("My Message");

Вот ми RIDL:

HRESULT _stdcall GetMessage([in] BSTR msg, [out, retval] BSTR* RetVal);

Вот моя реализация:

function TDelphiCom.GetMessage(msg:WideString; out RetVal:WideString):HRESULT;
var
  tempString: string;
begin
  tempString:=msg;
  RetVal:=WideString(tempString);
end;

Как правильно передавать строки в / из сервера Delphi COM?

1 ответ

Решение

Ваша декларация RIDL верна.

Вы не показали объявление метода на C#, поэтому мы не можем видеть, правильно ли вы маршируете параметры или нет.

На стороне Delphi в вашей реализации отсутствует stdcall соглашение о вызовах (в соответствии с декларацией RIDL), а также обработка исключений, чтобы вы могли вернуть правильное HRESULT на неудачи:

function TDelphiCom.GetMessage(msg: WideString; out RetVal: WideString): HRESULT; stdcall;
var
  tempString: string;
begin
  try
    tempString := string(msg);
    RetVal := WideString(tempString);
    Result := S_OK;
  except
    // do something...
    Result := DISP_E_EXCEPTION;
  end;
end;

Тем не менее, вы действительно должны использовать safecall вместо этого вызовите соглашение и позвольте ему разобраться с обработкой ошибок для вас:

function TDelphiCom.GetMessage(msg: WideString): WideString; safecall;
var
  tempString: string;
begin
  tempString := string(msg);
  Result := WideString(tempString);
end;
Другие вопросы по тегам