|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Есть такая штука Fax Service Extended COM Объект FaxServer , ему соответствуют интерфейсы IFaxServer (доступен на XP и выше) и IFaxServer2 (только начиная с Висты), аналогично Объект FaxDocument , ему соответствуют интерфейсы IFaxDocument (доступен на XP и выше) и IFaxDocument2 (только начиная с Висты), ну и в таком духе Про те которые с "2" на конце сказано: The IBlaBlaBla2 interface inherits from IBlaBlaBla. IBlaBlaBla2 also has ... Я здесь когда-то поступил так: сделал универсальный Interop а-ля XP и успешно им пользуюсь на всем подряд (от XP до Win10 с .Net2.0 и Net4.5 - один файл). Но: мне недоступны IFaxServer2, IFaxDocument2 и соотв. ряд методов, которые хотел бы использовать (на всем что старше XP/2003). Если я делаю Interop на Win10, то у меня там эти интерфейсы есть, и IBlaBlaBla, и IBlaBlaBla2. И в принципе он будет работать и на XP. Но здесь засада. Код: vbnet 1. 2. 3. 4. 5. 6.
На Win10 - работает, на XP - ругается на отсутствующие IFaxServer2, IFaxDocument2 (потому что их там нету, а он по дефолту хочет именно их) А если вот так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
то на XP уже не ругается, работает также как если б IBlaBlaBla2 в Interop не было. В то же время корректный вариант на Vista-Win10: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
А возможно ли как-то сделать грубо такую штуку (универсальную)? Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Т.е. на какой системе нахожусь код знает, и в зависимости от этого сказать использовать IBlaBlaBla или IBlaBlaBla2 интерфейс для объекта. (ну соотв. методы доступные только в IBlaBlaBla2 на XP не вызывать). Т.е. как мне сказать объекту: ты на XP, используй BlaBlaBla без "2"? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 03:31 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
У меня в частном случае прокатила такая конструкция. Но чет я в написанном не очень уверен (object = OtherObject). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
И как бы понадобится еще глобально в форме (для отслеживания событий), тоже как-то "задваивать" придется Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 05:46 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77 Код: vbnet 1.
а чё в vbnet только динозавроподобная подписка на события? AddHandler вроде как имеется ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 12:33 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Изопропила чё в vbnet только динозавроподобная подписка на события? AddHandler вроде как имеется Да подумал уже об этом, попробую, счас как бы на стадии проектирования. Но, за таким "универсальным" кодом надо оч. хорошо следить. Кейсы, потом если пишешь As Object, то он же методы/свойства не подставляет когда пишешь. Приходится временно менять на As BlaBlaObject М.б. кстати вариант - разные сборки под XP/2003 и под "все остальное", с ссылками на свой Interop не есть худший. Они у меня итак разные: XP/2003==.Net 2.0 "все остальное"==.Net 4.5 Но это тоже удовольствие еще то. Я с Ribbon например так вожусь. Проект веду в .Net 4.5, а когда делаю .Net 2.0, то приходится делать ряд стандартных изменений/комментировать куски кода при конвертации, удалять ссылку, чтоб убрать что касается Ribbon , наловчился, но не оч. удобно. Одно дело просто в .Net 2.0 конвертануть, другое дело каждый раз править. Но вести 2 параллельных проекта, еще накладнее, обезательно забудешь чего-нибудь когда-нибудь перенести. Самое простое во всех этих делах, отказаться вообще от поддержки XP/2003. Но обидно блин, жаба, столько наработок. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 16:44 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77М.б. кстати вариант - разные сборки под XP/2003 и под "все остальное", с ссылками на свой Interop не есть худший. да. условной компиляцией можно ветки разнести дабы исходник общий был ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 17:42 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77Т.е. на какой системе нахожусь код знает, и в зависимости от этого сказать использовать IBlaBlaBla или IBlaBlaBla2 интерфейс для объекта. (ну соотв. методы доступные только в IBlaBlaBla2 на XP не вызывать).Что значит "не вызывать"? Этот функционал на XP скрыт или этот функционал должен обрабатываться особым образом? Вообще это паттерн стратегия. Делаешь свой интерфейс по действиям который тебе нужны, и приводишь к этому интерфейсу как XP-реализацию, так и Win10 (возможно, понадобятся классы-адаптеры) При запуске инжектишь ту реализацию, которая требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 18:32 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77Изопропила чё в vbnet только динозавроподобная подписка на события? AddHandler вроде как имеется Да подумал уже об этом, попробую, Попробовал, ничего хорошего. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
На Win10 оно как бы работает. А на XP (пробовал на Win2003, пофиг) строчка c AddHandler выдает Код: vbnet 1.
при попытке подписаться на событие, он все равно ассоциирует g_objFaxServer с отсутствующим IFaxServer2, а если я не сделаю CType/DirectCast/TryCust то хрен он мой Object подпишет на событие. Поэтому думаю все таки правильно "раздельные exe" со своими Interop для каждого. Vista-десяточный Interop на XP только гадить будет не здесь так там. Если б не было нужно событий было бы проще, но это уже обсуждали пару лет назад. Я б не парился и использовал бы и дальше XP-шный, но чет я запал на .Bodies/ConnectedSubmit2 (возможность слияния двух документов в один факс, чего нет на XP). Т.е. напр. в mail2fax есть e-mail с 2-мя attachment, так я второе attachment отсекал, а с этим могу их объединить. Использовал бы "C/C++ API для Win2000" как я люблю, но сунулся в них и понял, что действительно COMEx умеет много больше как MS вещает. API хороши (и являются единственным вариантом) для Fax Service Provider и для Fax Routing Extension, но для клиентских задач увы нормально не катит. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 19:38 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77Если б не было нужно событий было бы проще, но это уже обсуждали пару лет назад. это проблема синтаксиса старого бейсика ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 22:26 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
ИзопропилДмитрий77Если б не было нужно событий было бы проще, но это уже обсуждали пару лет назад. это проблема синтаксиса старого бейсика Ну, а новый синтаксис то есть? Если он доступен с C#, то должен быть доступен и в VB.Net Просто при работе с COM, тот синтаксис что я использую в VB.Net, по сути тождественен старому VB6. При указании as Object (что я должен делать при позднем связывании, а также счас пытался делать за-ради привязки к конкретному интерфейсу), на событие я никак не подпишусь. (Ну, ты кажется чего-то пытался объяснять, как интерфейсы "ручками прописывать", чего-то получилось на простейшем примере, но делать эту огромную работу для "огромной штуки" понятно как минимум того не стоит). В VB.Net есть AddHandler, но он по сути ничего не дает, т.е. просто Object на событие все равно не подпишешь. CType/DirectCast/TryCust(object, BlaBlaObject) как я упомянул эквивалентно объявлению as BlaBla с автопривязкой к интерфейсу IBlaBla2 вместо желаемого IBlaBla. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 00:05 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77, делай две сборки - волки целы будут и овцы сыты ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 00:09 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Изопропилделай две сборки Ну так и сделаю. Напишу все под Win10==Vista==Net4.5(с новым Interop, со времен Виста эта кухня уже не менялась, хотя выкидывать ее MS похоже не собирается, любителей факсов по миру таки хватает, тем и живем) , потом урежу под XP==Net2.0(под старый Interop) - c описанием себе в комментариях алгоритма чего урезаю/меняю. Где возможно сразу сделаю case-ы в коде. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 01:28 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77, Не открою Америки если скажу, что есть еще позднее связывание, которое компилятором не проверяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 04:27 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Relic Hunter, Не откроешь. Более того, в случае .Net с его Interop-ами оно можно сказать оптимально. С одним жирным НО для случая когда надо подписываться на события, о чем вскользь было сказано в частности здесь, чуть выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 04:34 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77, А условную компиляцию использовать нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 05:01 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Relic HunterДмитрий77, А условную компиляцию использовать нельзя? Поясни на примере, что имеется ввиду. Вкладываю на всяк. случай 2 своих Interop-па 1. В папке "XP" -изготовлен 2 года назад, честно говоря уже не помню к каким точно извращениям я прибег, чтобы его сделать. В общем он .Net 2.0 и "старого образца", работает с любой .Net-версией и на любой OS от XP до Win10 вдоль и поперек, но не поддерживает IBlaBla2 интерфейсы. Проверен временем в продакшн (2+ года). 2. В папке "Vista_Win10" -изготовлен вчера на Win10, также .Net 2.0, поддерживает IBlaBla2, предположительно работоспособен на всем что >=Виста, на XP без танцев с бубном будет пытаться подставлять IBlaBla2 (кот. там нет) и ругаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 06:14 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Дмитрий77Кейсы, потом если пишешь As Object, то он же методы/свойства не подставляет когда пишешь. Приходится временно менять на As BlaBlaObjectА что если написать собственный IFaxServer3, который наследует и IFaxServer и IFaxServer2? И написать Dim objFaxServer As IFaxServer3 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 08:24 |
|
COM, объект Object, выбрать интерфейс IObject или IObject2 по условию
|
|||
---|---|---|---|
#18+
Antonariy, Нужен же не Код: vbnet 1.
а Код: vbnet 1.
Забей, только путать, решил уже. 2 сборки: Net4.5 под новый Interop, Net2.0 под старый. Лучше на смысловую часть кода время потратить, быстрее сделаю, чем на эти изыскания. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 19:14 |
|
|
start [/forum/topic.php?fid=20&fpage=39&tid=1399715]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
5ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 165ms |
0 / 0 |