Решение проблемы передачи данных между COM-сервером на Delphi и клиентом на C
Пользователь столкнулся с проблемой, при которой COM-клиент на C# некорректно получал возвращаемые значения от COM-сервера, созданного на Delphi. Проблема заключалась в том, что при вызове методов EchoInt, EchoDouble и EchoString возвращаемые значения были корректными только для типа int. Для типов double и string клиент получал некорректные значения (NaN и ошибка выполнения соответственно).
Подтвержденный ответ
Проблема была решена после изменения типа возвращаемого значения метода EchoString с LPWSTR на BSTR. В Delphi для работы с строками в COM-объектах используется тип BSTR, который является управляемым и освобождается автоматически клиентом. Это означает, что при возврате строки из метода COM-сервера, необходимо использовать BSTR, а не обычный указатель на символы (LPWSTR).
Пример кода на Object Pascal (Delphi)
function TTest.EchoString(s: PWideChar): BSTR; stdcall;
begin
writeln('[string] Delphi receives: ', s);
SetLength(Result, Length(s) * SizeOf(WideChar) + SizeOf(WideChar));
StrCopy(Result, s);
end;
В данном примере кода создается новый BSTR с копией переданной строки s. Важно отметить, что BSTR должен быть освобожден клиентом, поэтому Delphi не должен освобождать его внутри метода.
Альтернативный ответ
Попытка использовать safecall вместо stdcall привела к решению проблемы, но это было следствием изменения типа возвращаемой строки, а не самого вызова. Также было отмечено, что использование LPWSTR как типа возвращаемой строки может привести к утечке памяти или неопределенному поведению, так как управление памятью остается на стороне клиента.
Заключение
При работе с COM-серверами на Delphi важно правильно обрабатывать строки, используя тип BSTR. Это позволяет клиентам, написанным на других языках, корректно получать и освобождать строки, возвращаемые из методов COM-сервера.
Пользователь столкнулся с проблемой некорректной передачи данных между COM-сервером, написанным на Delphi, и клиентом на C#, связанной с неправильной обработкой возвращаемых строк.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS