Как работать с библиотеками СОМ?

Здравствуйте!

Не могу решить задачу: используя средства WIA (Windows Image Acquisition) получить сканированное изображение документа. Последовательность действий такая: создать экземпляр СОМ-объекта CommonDialog c:\windows\system32\wiaaut.dll, вызвать его метод ShowSelectDevice, получить интерфейс Device и далее произвести сканирование. Вопрос “как создать экземпляр СОМ-объекта” сразу же поставил меня в тупик. Прошу помощи, покажите хотя бы какой-нибудь рабочий пример создания СОМ-объекта в Pascal ABC.NET.

Всё что мне сейчас удалось - это получить переменную с типом System.__ComObject. Что с ней дальше делать?

  1. В документации по PascalABC.net нет никаких сведений о том, реализовано ли в нём взаимодействие с COM (что-то такое нужно, так как компонента COM – это машинный код, из MSIL его прямо вызывать нельзя). Или оно не реализовано, или оно не документировано.

  2. На С# это реализуется примерно так: https://habr.com/ru/company/tinkoff/blog/310562/ В крайнем случае, может быть, стоит сделать прослойку на C# и вызывать из PascalABC.net её, а не прямо компонент в машинном коде. (Кстати, минус в карму Тинькову за использование Windows на рабочих местах сотрудников банка.)

Ну и бред! Вы хоть пробегитесь по справке, посмотрите какие есть базовые возможности, перед тем как делать такие заявления.

В C#, чтоб вызывать функции из неуправляемых .dll - их надо объявить с атрибутом System.Runtime.InteropServices.DllImportAttribute. В паскале этот атрибут тоже можно использовать, но лучше - использовать external. Он сам разворачивается в [DllImport], но выглядит приличнее.

Я сам никогда не работал с COM и считаю его огромным куском костыля. Но, если я правильно понимаю - IDE вроде студии создают внутренние классы-обёртки, добавляя в них все нужные методы с [DllImport], чтоб их не надо было прописывать ручками. Если сильно надо - можно написать такой кодогенератор и самостоятельно.

Его таковым считает и Microsoft и не рекомендует к использованию в дотнетовских приложениях (натыкался я на такое в фирменной документации).

  1. Фирменный термин – “обёртка”, а не “оболочка”. Слово “оболочка” закреплено за shell.
  2. Примерно так, только, насколько я помню, есть какие-то тонкости с управлением памятью, см https://docs.microsoft.com/en-us/cpp/dotnet/calling-native-functions-from-managed-code?view=msvc-160
1 симпатия

Вам придется слишком многим свои “минусы в карму” раздавать. Например, Центробанку, в котором у всех сотрудников на столах Windows и который другим банкам рабочие места для коммуникации под Windows раздает. Линуксоиды - это диагноз…

1 симпатия

Это нормально.

Я солярщик вообще-то. :cowboy_hat_face: Доводилось даже под ксеникс софт писать (железки, в которых он стоит, работают до сих пор).

А вот это диагноз. Острое хроническое разгильдяйство. С такими деньгами, как у них, могли бы и миникс с хурдом до продакшена довести. (Попробуйте угадать, почему именно их.) Тут не только в вендузятничестве дело: у экономистов ЦБшная методика расчёта объёма вывода капитала стала профессиональным анекдотом.

Да-да. И весь офисный софт, писанный на MS-офисе, перетянуть под Опен. Типа, им там больше заняться нечем. Кстати, когда-то у них опердень под соляркой работал. Но это было очень давно. Долю линукса видите по отношению к Windows? Вот поэтому я пока и называю линуксоидов сектантами.

  1. Поскольку атаки через макросы в LO существенно менее эффективны,чем через MSO, такое перетягивание – очень неплохая мысль.Тем более что можно писать макросы на питоне, а не на VBA.

  2. Макросы для MSO обычно не сопровождаются и не контролируются так же аккуратно, как “автономный” софт, потому такого рода разработки являют собой отличную дыру в безопасности компаний, которые их используют. Для примера: гугол и оракель их не используют, это политика компаний.

  3. Как работает подсадка, я знаю. Доводилось сходить самому и стаскивать других (спрос на услугу появился после появления 146-й и вала дел по ней), процесс достаточно тяжёлый и сложный.

  4. Как делаются оценки распространённости ОС, я тоже знаю.

  5. Сектантами являются вендузятники: секта тоже может составлять большинство населения, например кальвинисты в Швейцарии и харизматы в Нигерии. Несектант не использует персоналку вообще. )))))

Извините, но если Вы не в теме, то не надо писать, лишь бы писать. Управление офисными функциями внутри самого офиса на несколько ПОРЯДКОВ эффективнее потуг реализовать все то же внешними средствами. Тем более, на Пайтоне. И кто это будет толпу бухгалтеров/экономистов, которая офис с трудом, но все же освоила за десяток лет, переучивать на всякие Пайтоны, да и ради чего? Чтобы Ваши странные взгляды потешить? Давайте заканчивать это пустое “му-му”.

Свой питоновский движок встроен в LO вообще-то. ))))) Если не встречались с таким программированием, так и напишите. Я встречался. LO Basic чуть удобнее в отладке, но питон на три порядка мощнее, при этом ещё и быстрее работает.

В LO ещё и яваскриптный движок для макропрограммирования есть.

Пусть нерадивый бухгалтер/экономист платит за разработку биржевых ботов и подобного софта другим, а не пишет их сам. Основной язык для написания подобных проектов – питон.

За моими взглядами набитые на личной голове шишки в 5 слоёв и опыт оракеля с гуглом. Обратите внимание на то, что эти компании никогда не становятся жертвами обычных атак, ориентированных на Windows и MSO. Последняя удачная атака такого рода была ещё на SUN году в 2006-м, после чего там Windows на рабочих станциях с доступом к Интернету и почте стал по спецразрешению. )))))

Уважаемые участники форума, RAlex, KIA-it! Спасибо за то, что оживили эту ветку. Однако, вы ушли от темы и мой вопрос что дальше делать с переменной типа System.__ComObject (читай - как получить обёртку времени исполнения) остался неотвеченным. Если есть чем помочь менее опытному коллеге, то жду ваших идей. Надеюсь на понимание: я слежу за этой темой и каждая ваша реплика приходит отдельным e-mail-ом на мой электронный адрес. Спасибо!

1 симпатия

Ну, я изначально обошёл стороной потому что:

Это вообще ни о чём. Как получили? Надо было сразу с примером кода. И не только потому, что вы могли получить не тот ComObject

И - переменная с типом System.__ComObject и значение этого типа - совершенно разные вещи.

Далее, как я и сказал, вы можете написать свой кодогенератор. Чтоб понять откуда брать информацию о классах в .dll - начинайте читать откуда то отсюда:

Если коротко: CoCreateInstance как external из соответствующей системной библиотеки. var o:=CoCreateInstance (…); Естественно, что в о я жду указатель на интерфейс созданного СОМ-объекта. В принципе о.GetType и говорит что о есть System.__ComObject. Теперь надо о обернуть в RCW? Или не так?

Ну указатель на объект Вы зря ждете, в .NET-среде Вы его не получите. Ссылку - да.

Вы уже второй раз говорите коротко. А я сказал - исполняемый код в студию.

P.S. И выделяйте код обратными апострофами (`, находится за ё в англ. раскладке):

Внутри строчки `код` выглядит как код, а если несколько строк:

```
код
```

Выглядит так:

код

Sun_Serega, вот так и хочется тоже сказать: рабочий код в студию! Если Вы имели дело с использованием unmanaged СОМ-объектов конкретно в PascalABC.Net, то наверняка поняли бы чего я хочу добиться. Строчить с мобильного на память код такой-то давности это дело мягко говоря непростое. Поэтому извините, сейчас никак. Не спорю, что Ваши знания в области программирования могут быть намного обширнее моих. Но я ожидал большей отзывчивости.

Проблема та же: wiaaut.dll, написана до появления .net В ней кучка интерфейсов и пара перечислимых типов. TLB из неё получил. Guidы Clsidы и прочие детали известны. Каков порядок действий (код вообще в принципе не нужен, я сам его напишу)?

Спасибо!

1 симпатия

В общем, работы довольно до чёрта много, а инструментария для неё (например, tlbimp.exe) в pascalabc.net что-то не видно.

Вот код C#:

using WIA;
...
WIA.CommonDialog dlg = new WIA.CommonDialog();
dlg.ShowSelectDevice(WIA.WIADeviceType.ScannerDeviceType);

В PascalABC.Net нельзя вот так просто взять и любую TypeLib DLL поместить в References и включить в uses.

1 симпатия

Пробовали генерировать сборку для взаимодействия с COM и потом подключать её по import? Чистым pascalabc это не сделать, вижуалстудия нужна или как минимум Windows SDK.

В этом вся загвоздка, что VS нет.

1 симпатия
 Институт математики, механики и компьютерных наук ЮФУ, 2005–2018
Администрация форума: В.Н. Брагилевский, С.С. Михалкович, А.М. Пеленицын
Yandex.Metrica