Передача строк в / из 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;