Это довольно бессмысленно. Программирование Interop с помощью #import - это шаблон и рекомендуемый способ. Типы интеллектуальных указателей, которые он автоматически генерирует, явно предназначены для автоматического подсчета ссылок, поэтому вы не можете забыть вызвать Release(). Есть несколько острых краев, вам нужно понять, что умные указатели могут делать и не делать.
В противном случае это относится к курсу для команды, которая находится за рамкой кода «все-в-одном». Образцы создаются группой поддержки в Шанхае, изначально нанятой для помощи на форумах MSDN. Эти ребята не имеют таких учетных данных, которые вы ожидаете от программиста Microsoft, который работает в Редмонде, и их фрагменты не проверяются. Некоторые из них совершенно задуманы. Если вы когда-либо задавали вопросы на форумах MSDN и видели ответы, которые они публикуют, тогда вы знаете, что я имею в виду.
Образец Solution2.cpp использует последнее связывание через IDispatch. Это определенно трудный способ взаимодействовать с Office, вы не получаете никакой помощи, когда пишете код. IntelliSense не может предоставить вам какую-либо полезную информацию при написании вызова метода, а также не может компилятор сказать вам, что вы пропустили аргумент или неправильно присвоили тип аргумента.Ваша программа не работает во время выполнения с непрозрачным кодом ошибки, например DISP_E_BADVARTYPE или DISP_E_BADPARAMCOUNT. И вызовы Release() должны быть сделаны явно, что, конечно, делает проще пропустить один. Проблемы, которых у вас нет, когда вы используете интеллектуальные указатели, они дают вам автоматическое завершение и проверку типов. Вы сами можете видеть, насколько меньше и читается Solution1.cpp.
Диагностика пропущенного вызова Release() в противном случае легко, ваша программа завершается, но вы все равно увидите, что Outlook.exe запущен в диспетчере задач. Что-то вы привыкнете к проверке в любом случае, это также произойдет, когда вы отлаживаете свою программу, находите ошибку и останавливаете программу для исправления. Который, конечно, также запрещает вызывать Release(), чтобы Outlook продолжал работать. Вы должны убить его самостоятельно.
Рассмотрите возможность написания такого кода на управляемом языке, таком как C# или VB.NET. Вы получите дополнительную скидку , если у вас есть проблема, и вы найдете много примеров кода. И сборщик мусора никогда не забыл сделать звонок на освобождение. Это просто немного медленно при этом.
Отлично, спасибо! Я знаю о круговых ссылках, но я не знал, что это было причиной этого утверждения. Поэтому я могу безопасно использовать #import с этим. – divB
@divB, выполните «нормальный уровень предосторожности», если вы не обрабатываете события. В противном случае выполните «высокий уровень предосторожности» и явно освободите любые интеллектуальные указатели, когда закончите с определенным объектом Excel. ** Если ваше приложение завершается, но Excel.exe все еще зависает в списке процессов более чем на несколько секунд, это будет плохой знак. ** – Noseratio