25.06.2012, 15:38 | #1 |
NavAx
|
Параметр COM-метода - Enum
Пожалуйста, помогите решить задачку (сломал себе всю голову уже).
Есть следующий метод: PHP код:
PHP код:
как же все-таки передать из аксапты enum-параметр в COM-метод? Спасибо. Последний раз редактировалось Roman777; 25.06.2012 в 15:49. |
|
26.06.2012, 10:03 | #2 |
Участник
|
У меня были такие же проблемы с передачей Map во внешнюю обработку.
В итоге не найдя подходящего решения (не ясно какой тип ставить в стороннем коде так что бы аксапта поняла). В итоге пришлось делать запил. В Вашем случае, например так: X++: COM service = new COM("4E4CC63D-84CB-4c7a-AA97-85126917E2DA"); result = service.test(enum2int(ABC::A)); info(strfmt("%1", result)); X++: public enum ABC { None = 0, A, B, C } public string test(int en) { string ret; if (en == (int)ABC.A) ret ="A"; if (en == (int)ABC.B) ret = "B"; if (en == (int)ABC.C) ret = "C"; if (en == (int)ABC.None) ret = "None"; return ret; } Последний раз редактировалось Deepoint; 26.06.2012 в 10:26. |
|
26.06.2012, 10:24 | #3 |
NavAx
|
Дело в том, что стороннее приложение от меня не зависит,
в качестве параметра enum методу необходим класс COM, которого нет (или я не знаю как его найти) как зарегистрированного COM-ообъекта. Или как-то можно попробовать сделать COM-объект на основе system.enum, но это уже сборка .NET, ее как COM объект создать не удается. |
|
26.06.2012, 15:25 | #4 |
Участник
|
.Net сборку можно зарегистрировать в системе как COM объект. Для этого надо в настройках, в сведениях о сборке проставить идентификатор GUID(делал с помощью GUIDgen) и сделать её видимой для COM.
После этого сборку надо зарегистрировать в системе(regasm). Она становится доступной по GUID из кода аксапты. Выше и есть .net библиотека которая используется как COM. X++: COM service = new COM("4E4CC63D-84CB-4c7a-AA97-85126917E2DA"); Например: X++: namespace test { [Guid("C70456F3-D4F7-431b-9205-A8B4C2743BA6")] public interface IMyClass { [DispId(1)] string test_message(); } // Events [Guid("BD5E8C93-E078-4732-B841-2DD415C470A8"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IMyEvents { } [Guid("4E4CC63D-84CB-4c7a-AA97-85126917E2DA"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(IMyEvents))] public class MyClass : IMyClass { public MyClass() { } public string test_message() { return "ОК!"; } } |
|
26.06.2012, 16:06 | #5 |
NavAx
|
Попробую объяснить по-другому.
Есть dll, исходников которой у меня нет (собственно они и не нужны). В dll есть метод, на вход которого нужно передать значение enum в виде COM-объекта DocFlowStatus (это тип, который объевлен в dll). К dll имеется пример ее использования в виде html-странички, в которой этот метод успешно вызывается так: PHP код:
|
|
27.06.2012, 12:16 | #6 |
Участник
|
Задача стоит обмен со сторонней системой?
|
|
27.06.2012, 13:06 | #7 |
Читатель
|
могу ошибаться, но мне показалось, что приведенный кусок кода скармливает указанному методу строковое значение...
|
|
27.06.2012, 13:08 | #8 |
NavAx
|
|
|
27.06.2012, 13:09 | #9 |
NavAx
|
Была попытка скормить и строку и целое число - не работает и ошибку не пишет. Вернее метод возвращает набор данных, но не отфильтрованный по входящим параметрам метода
|
|
27.06.2012, 14:21 | #10 |
Участник
|
Загрузил COM библиотеку такскома.
В студии можно выдернуть этот злосчастный тип данных, но для того что бы переменную этого типа использовать надо свою библиотеку делать, что как я предполагаю, не вариант... Последний раз редактировалось Deepoint; 27.06.2012 в 14:30. |
|
27.06.2012, 14:34 | #11 |
NavAx
|
|
|
27.06.2012, 16:52 | #12 |
Участник
|
Пытался по всякому. К сожалению как Com-объект создать у меня не получилось. Как CLRObject создается, но для Ax 3.0 не подойдет за отсутствием References, если мне память не изменяет.
|
|
04.07.2012, 15:26 | #13 |
NavAx
|
Удалось передать параметры в виде строки.
До этого не получалось из-за того, что я варьировал только первым параметром (статус документа) – делал его целым и строковым, в то время как третий параметр (направление документооборота) у меня оставался целочисленным: PHP код:
|
|
|
За это сообщение автора поблагодарили: gl00mie (2). |
04.07.2012, 17:29 | #14 |
Участник
|
Да, есть такое. Почему-то все возвращаемые переменные (в оболочке, которая пинает обмен, через api стороннего разработчика) возвращаются в виде строк. Хотя на стороне сервера прописаны int, double и т.д.
|
|