PowerPoint, Запущенный через C#, не Выходит

Значение адреса назначается компоновщиком, поэтому компилятор не знает точного значения адреса.

cout << fp(5.0); 

Это работает, потому что он оценивается во время выполнения после того, как точный адрес был разрешен.

Как правило, вы не можете использовать фактическое значение (адрес) указателя constexpr, поскольку оно не известно во время компиляции.

Язык программирования С ++ Бьярна Страуструпа, 4-е издание , упоминает:

10.4.5 Выражения адресной константы

Адрес статически выделенный объект (§6.4.2), такой как глобальная переменная, является константой. Однако его значение присваивается компоновщиком, а не компилятором, поэтому компилятор не может знать значение такой адресной константы. Это ограничивает диапазон константных выражений указателя и ссылочного типа. Например:

   constexpr const char∗ p1 = "asdf";
   constexpr const char∗ p2 = p1;     // OK 
   constexpr const char∗ p2 = p1+2;   // error : the compiler does not know the value of p1 
   constexpr char c = p1[2];          // OK, c==’d’; the compiler knows the value pointed to by p1
9
задан Paul Keister 7 August 2012 в 18:16
поделиться

4 ответа

Завершение работы приложения Microsoft Office поначалу может показаться сложным, но как только вы установите правильный порядок операций, на самом деле это совсем не сложно.

Выпустить приложение MS Office можно безопасно и эффективно в два этапа:

(1) Сначала освободите все второстепенные объекты, на которые вы не имеете ссылки в именованной переменной. Это можно сделать с помощью вызова GC.Collect () , а затем GC.WaitForPendingFinalizers () . Обратите внимание, что если вы используете Visual Studio Tools для Office (VSTO), вам необходимо вызвать эту пару команд дважды , чтобы добиться успешного освобождения COM-объектов. Однако вы не используете VSTO, поэтому достаточно один раз вызвать их.

(2) Затем явно освободите объекты, которые вы храните, с помощью именованной переменной, используя вызов Marshall.FinalReleaseComObject () для каждой имеющейся у вас переменной.

Не забудьте явно освободить все переменные, которые у вас есть для компонентов COM. Если вы пропустите хотя бы один, то ваше приложение MS Office зависнет. В вашем коде, похоже, есть три именованные переменные, которые содержат ссылку на ваше приложение PowerPoint: ppApp , ppPres и cell .

Принимая это учитывая все обстоятельства, я думаю, что ваша очистка должна выглядеть примерно так, как показано ниже, в котором используется с использованием System.Runtime.InteropServices либо в пространстве имен, либо в верхней части документа с кодом:

// using System.Runtime.InteropServices

// Cleanup:
GC.Collect();
GC.WaitForPendingFinalizers();

Marshal.ReleaseComObject(cell);

ppPres.Close();
Marshal.ReleaseComObject(ppPres);

ppApp.Quit();
Marshal.ReleaseComObject(ppApp);

Дайте ему попробуйте, я думаю, это должно сработать для вас ... (Если нет,

12
ответ дан 4 December 2019 в 12:20
поделиться

После вызова Quit () для вашего объекта ppApp попробуйте следующее

System.Runtime.InteropServices.Marshal.ReleaseComObject(ppApp);

Никаких обещаний, но это может сработать или ничего не сделать вообще. Правильное закрытие работы с Office COM всегда было для меня чем-то вроде вуду.

0
ответ дан 4 December 2019 в 12:20
поделиться

Похоже, вы делаете экземпляр приложения Power Point видимым, но в противном случае возможно, что отображается диалоговое окно, которое вы не видите - возможно, диалоговое окно сохранения изменений. Если приложение работает скрыто, сделайте его видимым, чтобы увидеть, появляются ли какие-либо такие диалоговые окна, предотвращающие закрытие Power Point.

1
ответ дан 4 December 2019 в 12:20
поделиться

Вот статья MSDN, в которой описывается проблема и решение

http://msdn.microsoft.com/en-us/library/aa679807%28office.11%29.aspx

в основном рекомендуется делать (примечание : две итерации GC.Collect ()

 GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers(); 
2
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

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