У меня есть автономное приложение, которое обнажает COM интерфейсы/CoClasses/перечислений и т.д. Один из этих интерфейсов экспортирует следующие функции:Как обрабатывать параметры var (или ref) в COM Interop?
procedure FindTask(const TaskId: WideString; var Task: OleVariant); safecall;
Примечание: Task
также подвергается как CoClass
.
Примечание: Task
является [в, из]
До сих пор мое унаследованное приложение, которое также написано в Delphi, имел возможность общаться с автономным приложением. Учтите, что автономное приложение является COM-сервером вне очереди и рассматривает это устаревшее приложение как клиентское приложение.
Поскольку я переписываю старое приложение Delphi (клиент) в C#, я должен использовать COM Interop в C# для связи с этим приложением. Поэтому я использовал tlbimp.exe для перевода этих COM-интерфейсов на интерфейсы C#.
Этот метод был переведен следующим образом:
void FindTask(string, TaskId, ref object Task);
Как я могу позвонить FindTask и получить результат уже существующей задачи с этой подписью?
Я попытался это: (Task типа CoClass)
ScTask target = new CsTask();
scheduler.FindTask("A GUID value", ref target);
Но компилятор вопил о типе, так как нет никакой перегрузки с этим типом класса (переведенный метод получает объект)
Мог ли я сделать это вместо этого?
object target = new object();
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;
Как можно назвать метод, который ожидает var
(in, out)
Variant *
, поэтому переводится как объект, но на самом деле есть более точный тип?
Вы правы, Дэвид. Это должно быть [out, retval]. Я не проектировал это, это просто глупо быть [in, out]. Ну, я не могу изменить, теперь ... слишком много проблем с обратной совместимостью, я буду использовать 'target = null' вместо' new object() '; – EProgrammerNotFound