Позднее связывание C # с сервером com / activeX, проблема с одним методом - PullRequest
4 голосов
/ 21 июня 2010

Я довольно новичок в Interop / Com / ActiveX и т. Д., Так что терпите меня.

Я запаздываю привязку к серверу com / activex (не уверен, какой именно) (в основном, exe, а не dll). Я успешно использую все методы на этом сервере, кроме одного, вот описание:

VT_INT GetLastCCTError (вариант * ERROR_STRING);

Описание : эта функция используется для получения последней сгенерированной ошибки по CCT. Функция может быть вызвана в любой момент, пока сервер CCT инициализируется. Если нет ошибки произошло, когда функция вызывается, возвращаемый код равен «0» (ноль), и строка ошибки будет пустой. Только последняя ошибка, которая произошла во время текущий прогон сервера CCT будет быть доступным.

Ввод : Нет

Выход : функция возвращает один выходной параметр, ‘Error_string’ типа VARTYPE VT_BSTR | VT_BYREF. Параметр содержит строка ошибки для кода ошибки связанный с последней функцией CCT отказ. Возвращаемое значение: эта функция возвращает целочисленное значение типа VT_INT. Это код ошибки связанный с последней функцией CCT отказ

Я впервые попробовал использовать этот код:

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, new object[] {this.LastErrorString});

Я получил следующее исключение: Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)

Затем, подумав, я изменил код на:

object[] Args = { "SomeString" };

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, Args);

Все та же ошибка. После некоторого поиска в Google я нашел эту статью: http://www.informit.com/articles/article.aspx?p=27219&seqNum=8

Если вы посмотрите на раздел 3.3, похоже, это решение моей проблемы, и поэтому я изменил свой код на:

object[] Args = { "SomeString" };

ParameterModifier ParMod = new ParameterModifier(1);
ParMod[0] = true;
ParameterModifier[] ArrParMod = { ParMod };

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, Args, ArrParMod, null, null);

this.LastErrorString = (string) Args[0];

Это все равно приводит к тому же исключению. Теперь я думаю, что проблема может быть не в передаче ссылки, а в чем-то другом. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Это потому, что строки в C # неизменны.

«SomeString» будет определяться компилятором как неизменяемая строка в управляемой памяти (стек или куча в большинстве случаев не имеют значения).

Таким образом, вы не передаете строковую ссылку, а литерал - что-то, что никогда не может быть параметром 'out', как в вашем примере ... поэтому сортировка не будет делать то, что он думает (знает) было бы плохой идеей.

Эндрю Д., я подозреваю, прав.

Могу предложить вам попробовать что-то вроде:

StringBuilder errorMessage = new StringBuilder();

this.LastErrorCode = (int)CCTType.InvokeMember("GetLastCCTError", BindingFlags.InvokeMethod, null, CCTObject, errorMessage );

this.LastErrorString = errorMessage.ToString();

С уважением,

Aidanapword

0 голосов
/ 21 марта 2011

Прошло много времени с тех пор, как я поработал над взаимодействием, но задумывались ли вы об использовании StringBuilder?См., Например, получение строк через interop .

надеюсь, это поможет,

Эндрю

...