2015-07-01 3 views
1

У меня есть автономное приложение, которое обнажает 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 *, поэтому переводится как объект, но на самом деле есть более точный тип?

ответ

2

Это скорее выглядит так, как будто параметр действительно является параметром out. На самом деле вы не пытаетесь передать что-либо. Метод, похоже, возвращает другой объект. Таким образом, в C# это должно быть:

void FindTask(string TaskId, out object Task); 

Вы бы тогда называть это так:

Вы должны были бы изменить тип библиотеки, чтобы указать из семантики.

Если это на самом деле в/из, то вы бы сохранить использование ref и вызвать метод как это:

object target = null; 
scheduler.FindTask("A GUID value", ref target); 
ScTask translated = (ScTask) target; 

Или, возможно, передать в реальном объекте с содержательным состоянием, если это, как она предназначена работать.

+0

Вы правы, Дэвид. Это должно быть [out, retval]. Я не проектировал это, это просто глупо быть [in, out]. Ну, я не могу изменить, теперь ... слишком много проблем с обратной совместимостью, я буду использовать 'target = null' вместо' new object() '; – EProgrammerNotFound

 Смежные вопросы

  • Нет связанных вопросов^_^