Чем отличается "ПолучитьCOMОбъект" от "Новый COMОбъект"? И в каких случаях нужно каждый отдельно использовать?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(5)Хорошо. Давайте разберем написанное в синтаксис-помощнике вместе.
Глобальный контекст (Global context)
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<ИмяФайла>, <ИмяКлассаCOM>)
Параметры:
<ИмяФайла> (необязательный)
Тип: Строка.
Имя файла, включающее полный путь.
<ИмяКлассаCOM> (необязательный)
Тип: Строка.
Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре, полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект - это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");
создает объект Excel.Application и открывает с его помощью файл документа "C:\DATA\DATA.XLS". Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("", "Excel.Application");
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:
// Получение объекта COM, соответствующего файлу
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");
// Создание нового экземпляра объекта
Таб = ПолучитьCOMОбъект("", "Excel.Application");
// Получение активного объекта
Показать
COMОбъект (COMObject)
Конструкторы:
По имени приложения
Описание:
Создает COM-объект (например, Word, Excel и т.д.). Методы и свойства СОМ-объектов в дальнейшем становятся доступными через данный объект.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Что именно не понятно из описания каждого из методов?
Глобальный контекст (Global context)
ПолучитьCOMОбъект (GetCOMObject)
Синтаксис:
ПолучитьCOMОбъект(<ИмяФайла>, <ИмяКлассаCOM>)
Параметры:
<ИмяФайла> (необязательный)
Тип: Строка.
Имя файла, включающее полный путь.
<ИмяКлассаCOM> (необязательный)
Тип: Строка.
Имя класса COM, экземпляр которого должен быть создан или получен. Если расширение имени файла, указанное в первом параметре, полностью идентифицирует класс объекта, то параметр может быть опущен.
Возвращаемое значение:
Тип: COMОбъект.
Описание:
Основное применение функции ПолучитьCOMОбъект - это получение COM-объекта, соответствующего файлу. Для этого следует в качестве первого параметра функции задать имя файла, который будет определять COM-объект. Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");
создает объект Excel.Application и открывает с его помощью файл документа "C:\DATA\DATA.XLS". Если указанный файл во время выполнения данного фрагмента уже открыт с помощью MS Excel, то будет получена ссылка на уже существующий объект.
Для файлов, указываемых в качестве параметра данной функции, должно быть установлено соответствие расширения имени файла и класса COM.
Если в качестве имени файла указана пустая строка, то будет создан новый экземпляр объекта. В этом случае необходимо указать имя класса COM.
Например, фрагмент кода:
Таб = ПолучитьCOMОбъект("", "Excel.Application");
создает новый документ Excel. В дальнейшем этот документ может быть программно заполнен и сохранен в файл.
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel, если таковое имелось, или будет вызвано исключение, если активных экземпляров MS Excel не было.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:
// Получение объекта COM, соответствующего файлу
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");
// Создание нового экземпляра объекта
Таб = ПолучитьCOMОбъект("", "Excel.Application");
// Получение активного объекта
COMОбъект (COMObject)
Конструкторы:
По имени приложения
Описание:
Создает COM-объект (например, Word, Excel и т.д.). Методы и свойства СОМ-объектов в дальнейшем становятся доступными через данный объект.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Что именно не понятно из описания каждого из методов?
(6) У меня задача, мне нужно просто прочитать Excel-файл, без каких либо изменений в самом файле Excel. И вот файл можно по-разному прочитать:
Первый способ:
ExcelApp = ПолучитьCOMОбъект("c:\file.xls");
Второй способ:
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);
Так вот, в чем разница вообще между этими способами?
Первый способ:
ExcelApp = ПолучитьCOMОбъект("c:\file.xls");
Второй способ:
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);
Так вот, в чем разница вообще между этими способами?
(28)Как вариант:
ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО, обрабатывающий файлы определенного типа
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машины для обработки файла определенного типа.
Так же Новый COMОбъект позволяет программировать само ПО: управлять его свойствами/методами и прочее.
ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО, обрабатывающий файлы определенного типа
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машины для обработки файла определенного типа.
Так же Новый COMОбъект позволяет программировать само ПО: управлять его свойствами/методами и прочее.
(17) я же уточнил, что 95 формат не читает. А именно этот и выложили.
Вот этот же лист, но в формате 97-2003. Проверьте.
Вот этот же лист, но в формате 97-2003. Проверьте.
Прикрепленные файлы:
Отчет_нов2.xls
(38) Ваш скрипт:
В чем нативность? Тот же ком-объект. Без установленного офиса работать не будет.
Const xlFrmt = -4143 ' Format Excel 2003 for Excel 2003
'Const xlFrmt = 56 ' Format Excel 2003 for Excel 2010
with CreateObject("Excel.Application")
.DisplayAlerts =False
.WorkBooks.Open(WScript.Arguments(0)).SaveAs WScript.Arguments(0),xlFrmt
.quit
end with
(48)Вопрос изначально был: как вообще прочитать EXCEL-файл, чтобы меньше морочиться?
Ответ: читайте сразу с помощью EXCEL.
Но оратор Platonov.E намекнул, что можно и без использования COM обойтись. Оказалось, что не всегда, и для того, чтобы было всегда, вы предложили использовать некий скрипт для того, чтобы пересохранить файл в другом формате, который может быть прочитан нативно 1С с помощью ТабДок.Прочитать(*.xls).
Как выяснилось, внутри скрипта, предложенного вами, используется все тот же COMОбъккт("Excel.Application"), ну так и для чего весь это процесс "удаления гланд через задний проход"?
Ответ: читайте сразу с помощью EXCEL.
Но оратор Platonov.E намекнул, что можно и без использования COM обойтись. Оказалось, что не всегда, и для того, чтобы было всегда, вы предложили использовать некий скрипт для того, чтобы пересохранить файл в другом формате, который может быть прочитан нативно 1С с помощью ТабДок.Прочитать(*.xls).
Как выяснилось, внутри скрипта, предложенного вами, используется все тот же COMОбъккт("Excel.Application"), ну так и для чего весь это процесс "удаления гланд через задний проход"?
(45) тут несколько скользких моментов.
1. Я не говорил, что только так нужно.
2. Помимо получения соединения и коннектора дальше еще данные нужно вытаскивать так же.
3. Когда через OLE подключаемся из 1С, то много побочных эффектов возникает. Таких, как некорректное закрытие соединения. Оно может подвиснуть. Это особенно может быть заметно, когда делается много таких соединений.
Это было просто предложено как вариант, на высказывание: "Оно не читает *.xls, только *.xlsx.".
Я никого не заставляю это использовать.
1. Я не говорил, что только так нужно.
2. Помимо получения соединения и коннектора дальше еще данные нужно вытаскивать так же.
3. Когда через OLE подключаемся из 1С, то много побочных эффектов возникает. Таких, как некорректное закрытие соединения. Оно может подвиснуть. Это особенно может быть заметно, когда делается много таких соединений.
Это было просто предложено как вариант, на высказывание: "Оно не читает *.xls, только *.xlsx.".
Я никого не заставляю это использовать.
(51)
1. Вы - нет, но вы активно поддерживаете способ чтения EXCEL-файла без использования EXCEL, даже не EXCEL, а целиком технологии COM.
2. Это уже OLE, который так же использует технологию COM для работы с собой.
3. Про OLE тут пока вообще речи не было. Было либо нативно 1С, либо EXCEL с помощью COM.
1. Вы - нет, но вы активно поддерживаете способ чтения EXCEL-файла без использования EXCEL, даже не EXCEL, а целиком технологии COM.
2. Это уже OLE, который так же использует технологию COM для работы с собой.
3. Про OLE тут пока вообще речи не было. Было либо нативно 1С, либо EXCEL с помощью COM.
(11)
Формат читаемого файла, зависит от действия ПриВыбореФайла (процедура на форме) там как раз и указывается формат читаемого файла.
Лично я использую формат
И после обработки или исключения ExcelApp.Quit
Формат читаемого файла, зависит от действия ПриВыбореФайла (процедура на форме) там как раз и указывается формат читаемого файла.
Лично я использую формат
ExcelApp = Новый COMОбъект("Excel.Application");
ExcelApp.WorkBooks.Open("c:\file.xls", 0);
И после обработки или исключения ExcelApp.Quit
(7) если действительно внимательно читать то можно увидеть что ПолучитьCOMОбъект
функциональнее
за счет
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel
...
и если знать другие языки программирование ключевое слово новый это создание объекта в памяти а не его получение
функциональнее
за счет
Если первый параметр функции пропущен, то будет произведена попытка получить активный объект указанного типа. Если активного объекта указанного типа в настоящий момент не существует, то будет вызвано исключение. Например, в результате выполнения оператора:
П = ПолучитьCOMОбъект( , "Excel.Application");
Переменная П получит значение типа COMОбъект, соответствующее активному приложению MS Excel
...
и если знать другие языки программирование ключевое слово новый это создание объекта в памяти а не его получение
(23) Постановка вопроса не совсем правильная. "ПолучитьCOMОбъект" позволяет обращаться к довольно узкому классу COM-объектов, взаимодействующих с файлами. Кроме приложений Microsoft Office мне что-то больше ничего в голову не приходит. COM-объектов, не имеющих отношения к файлам, гораздо больше. Например ADODb или Regexp.
К таким объектам можно обратиться только через "Новый COMОбъект".
К таким объектам можно обратиться только через "Новый COMОбъект".
(58)
Не всё так просто. Вот, например, создание объекта для работы с реестром:
Или объект для получения информации о локальных дисках:
Это в типовых конфигурациях. Как видите, никакого файла тут нет. Оба варианта, насколько я понимаю, могут быть реализованы и через Новый COMОбъект. Например, для работы с WMI средствами можно создать объект:
Вообще практика использования ПолучитьCOMОбъект мало распространена, поэтому никто не может дать внятного ответа на ваш вопрос.
"ПолучитьCOMОбъект" нужен для работы только с файлами
Не всё так просто. Вот, например, создание объекта для работы с реестром:
СистемныйРеестр = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv");
Или объект для получения информации о локальных дисках:
wbemFlagReturnImmediately = 16;
wbemFlagForwardOnly = 32;
ЛокальныйКомпьютер = ".";
WMIАдрес = "winmgmts:\\" + ЛокальныйКомпьютер + "\root\CIMv2";
WMIСервис = ПолучитьCOMОбъект(WMIАдрес);
оЭлементы = WMIСервис.ExecQuery(
"SEL ECT * FR OM Win32_LogicalDisk",
"WQL",
wbemFlagReturnImmediately + wbemFlagForwardOnly);
ПоказатьЭто в типовых конфигурациях. Как видите, никакого файла тут нет. Оба варианта, насколько я понимаю, могут быть реализованы и через Новый COMОбъект. Например, для работы с WMI средствами можно создать объект:
SWbemLocator = Новый COMОбъект("WbemScripting.SWbemLocator");
SWbemServices = SWbemLocator.ConnectServer();
Вообще практика использования ПолучитьCOMОбъект мало распространена, поэтому никто не может дать внятного ответа на ваш вопрос.
(61) Странно или я может чего то не понимаю до конца, но если я пишу:
ПолучитьCOMОбъект("WbemScripting.SWbemLocator")
то вызывается ошибка:
{Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
по причине:
Ошибка получения объекта COM: Синтаксическая ошибка
А если делать через "Новый COMОбъект("WbemScripting.SWbemLocator")" - то создается нормально без ошибок
ПолучитьCOMОбъект("WbemScripting.SWbemLocator")
то вызывается ошибка:
{Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (ПолучитьCOMОбъект)
по причине:
Ошибка получения объекта COM: Синтаксическая ошибка
А если делать через "Новый COMОбъект("WbemScripting.SWbemLocator")" - то создается нормально без ошибок
(62) Новый COMОбъект("WbemScripting.SWbemLocator") – альтернатива для ПолучитьCOMОбъект("winmgmts:\\.\root\CIMv2"), которую я привёл для того, чтобы указать на отсутствие четкого разграничения между двумя методами. Мне было бы интересно самому узнать, что такого умеет ПолучитьCOMОбъект, чего нельзя сделать с помощью Новый COMОбъект.
Процитирую уже написанное в (34)
ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО, обрабатывающий файлы определенного типа
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машиныдля обработки файла определенного типа.
К файлам эти методы имеют очень опосредованное отношение и не надо путать тёплое с мягким.
Первый метод для подключения к уже имеющемуся/запущенному экземпляру, например Excel-я, с не важно какими отрытыми или не отрытыми файлами и получения управления этим экземпляром.
Второй создает новый экземпляр.
ПолучитьCOMОбъект() - для случаев, когда необходимо использовать уже запущенный экзмпляр ПО
Новый COMОбъект - для случаев, когда необходимо создание нового экземпляра ПО в ОЗУ машины
К файлам эти методы имеют очень опосредованное отношение и не надо путать тёплое с мягким.
Первый метод для подключения к уже имеющемуся/запущенному экземпляру, например Excel-я, с не важно какими отрытыми или не отрытыми файлами и получения управления этим экземпляром.
Второй создает новый экземпляр.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот