Как я могу легко использовать COM-компонент в Собственном Visual C++

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

CSS явно предпочтителен в случаях, где представляемая разметка и CSS поддерживают тот же вид дизайна, никто в их правильном уме не утверждал бы, что font - теги лучше, чем определение книгопечатания в CSS, так как CSS дает Вам то же питание, чем font - теги, но намного более чистым способом.

проблема с таблицами, однако, в основном, что модель макета таблицы в CSS не поддерживается в Microsoft Internet Explorer. Таблицы и CSS поэтому не эквивалентны в питании. Недостающая часть подобное сетке поведение из таблиц, где края ячеек выравниваются и вертикально и горизонтально, в то время как ячейки все еще расширяются для содержания их содержания. Это поведение не легко достигнуть в чистом CSS без жесткого кодирования некоторых размеров, который делает дизайн твердым и хрупким (как долго, поскольку мы должны поддерживать Internet Explorer - в других браузерах, это легко достигается при помощи display:table-cell).

, Таким образом, это не действительно вопрос или таблицы или CSS, предпочтительно, но это - вопрос распознавания конкретных случаев, где использование таблиц может сделать расположение более гибким.

самой важной причиной не таблицы использования является доступность. Инструкции по Доступности веб-контента http://www.w3.org/TR/WCAG10/ совет против использования таблиц для расположения. Если Вы обеспокоены доступностью (и в некоторых случаях можно по закону быть обязаны к), необходимо использовать CSS, даже если таблицы более просты. Обратите внимание, что Вы можете всегда , создают то же расположение с CSS как с таблицами, могло бы просто требоваться больше работы.

8
задан AndreasT 17 July 2009 в 22:28
поделиться

5 ответов

Я использую комбинацию интеллектуальных COM-указателей ATL и класса ATL :: CAxWindow для COM-объектов и компонентов. Я считаю, что интеллектуальные указатели особенно удобны.

http://www.murrayc.com/learning/windows/usecomfromatl.shtml

http://76.105.92.243/notes/atlcom.html#import

http://msdn.microsoft.com/en-us/library/yx242b61%28VS.80%29.aspx

2
ответ дан 5 December 2019 в 13:00
поделиться

Я приветствую ваши усилия по переходу на собственный C ++ для работы с COM - вам нужно пройти через боль, чтобы по-настоящему оценить сегодняшнюю роскошную ( управляемая) среда разработки :)

Когда мир (и я) были моложе, книга Крейга Брокшмидта « Внутри OLE » была фолиантом для понимания COM (до COM даже был COM). Эта книга предшествует управляемому коду, поэтому здесь нет шансов на путаницу. Есть и второе издание.

Книги Дона Бокса " Essential COM " и "

3
ответ дан 5 December 2019 в 13:00
поделиться

Минимальные требования для создания экземпляра COM-объекта следующие:

1) Должен быть доступное COM-подразделение.

Это достигается большинством приложений путем вызова CoInitialize / CoInitializeEx для настройки библиотеки COM и начального COM-подразделения, если это первый раз для процесса.

2) Вызов CoCreateInstance / CoCreateInstanceEx для создания объект и укажите флаги для обозначения того, как он будет создан.

3) Правильно сбалансируйте вызовы AddRef и Release на интерфейсах любых COM-компонентов, которые вы создаете, вызывая последний Release (), когда вы закончите использовать COM компонент.

-

В управляемом приложении №1 почти всегда обрабатывается за вас. # 2 абстрагируется, если вы импортируете ссылку на библиотеку COM, и вы можете просто использовать импортированные имена, как если бы они были определениями классов .NET и т.п. №3 обрабатывается автоматически, но ваши потребности могут отличаться. К сожалению, иногда возникают причуды в обработке ссылок в управляемых приложениях, из-за которых COM-объекты могут оставаться дольше, чем предполагалось. Вспомогательный класс Marshal в System.Runtime имеет методы, которые могут помочь вам в случае возникновения проблем.

-

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

  1. Вызов CoInitialize / CoInitializeEx на раннем этапе основного потока вашего приложения для настройки квартиры.
  2. Когда основной поток вашего приложения собирается выйти, вызовите CoUninitialize (), чтобы закрыть квартиру.
  3. Для дополнительных потоков, которые вы создаете, вам также следует вызвать CoInitialize / CoInitializeEx при их запуске, если вам нужно использовать COM-объекты из этих потоков. Кроме того, в зависимости от вашего приложения вы можете захотеть установить параметры квартиры.
  4. Для этих потоков также вызывайте CoUninitialize (), когда они завершают правильную очистку.
3
ответ дан 5 December 2019 в 13:00
поделиться

Было бы полезно, если бы вы предоставили немного больше информации о том, что именно вы делаете. Знаете ли вы, какие интерфейсы реализует объект и т. Д.

В общем, API, с которым вы можете получить более конкретную помощь в Google, - это CoCreateInstance. Вам нужно будет передать ему GUID объекта, с которым вы хотите играть. Все COM-объекты реализуют интерфейс IUnknown, и вы можете запросить любые другие, которые он может иметь. Таким образом, некоторый пример псевдокода для начала может выглядеть примерно так:

CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
CoCreateInstance( CLSID,
                       ptrIUnknown,
                       ClassCxt, // generally CLSCTX_INPROC_SERVER,
                       riid , // reference id
                       (void **)&pRequest); // the interface that corresponds to the riid

Здесь вы можете запросить дополнительные интерфейсы, используя интерфейс IUnknown, полученный из ptrIUnknown.

Затем очистите с помощью

CoUninitialize()

Essential COM Дона Бокса - отличная книга по этой теме. Кроме того, просто для тестирования того, как работает ваш COM-объект, использование чего-то вроде VBScript упрощает эту задачу. Кроме того, это Вероятно, стоит отметить, что GUID идентификатора класса хранится несколько необычным образом, поэтому, если вы просто копируете GUID из реестра, у вас могут возникнуть проблемы с определением порядка. Хотя это, вероятно, для другого вопроса.

1
ответ дан 5 December 2019 в 13:00
поделиться

Try using #import from Visual C++. This will create smart pointer wrappers for the interfaces.

0
ответ дан 5 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: