Передача строк в / из Delphi COM Server - PullRequest
0 голосов
/ 01 февраля 2019

Я пробовал несколько вариантов кода ниже с возвратом 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;

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

1 Ответ

0 голосов
/ 02 февраля 2019

Ваша декларация 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;
...