Проблема при работе с Excel в C++ Builder

программирование C++ excel Delphi C++ Builder

Проблема при работе с Excel в C++ Builder.
При работе с документами Excel есть такая проблема - программа отлично работает и делает все что необходимо - однако есть один минус - если открыть любой Excel документ во время работы программы все зависает - Excel остается в процессах, программа зависает - приходятся её выгружать вручную.
Работа с Excel осуществляется через COM - OLE.
Пример кода:

Variant ExcelDOK, Book, Sheet;
ExcelDOK = CreateOleObject("Excel.Application");
Book = ExcelDOK.OlePropertyGet("Workbooks").OlePropertyGet("Open", FileSource->Text.t_str());
Sheet = Book.OlePropertyGet("Worksheets", 1);

Model2 = Sheet.OlePropertyGet("Cells",i,price).OlePropertyGet("Value");
Model3 = Sheet.OlePropertyGet("Cells",i,cnt).OlePropertyGet("Value");

ExcelDOK.OleProcedure("Quit");

Вопрос собственно в чем причина данного глюка, и как его исправить?

Примечание:
Да суть то в том что нету там проблемного места - это вообщем то весь код для работы с Экселем.
Просто в цикле считываются ячейки и если Excel не открывать во время работы программы все отрабатывает на ура.

Примечание:
Я так понимаю что ExcelDOK = UnAssigned должен выполняется после ExcelDOK.OleProcedure("Quit");!
Я имею ввиду, что программа зависает когда Excel документ я пытаюсь открыть, когда программа находится в теле цикла - у меня есть файл на 10000 строк из которого я считываю 2 колонки в которых находятся цифры. Если Excel не открывать то он прекрасно из памяти выгружается после выполнения ExcelDOK.OleProcedure("Quit");

Примечание:
Проблема в том что CodeGear 2010 не принимает у меня конструкции вида
"ExcelDOK.Visible = false;"
Пишет 'Visible' is not a member of 'OleVariant' - либо 'Variant'
И ExcelDOK.Workbooks.Open(FileSource->Text.t_str());
тоже самое:
Именно поэтому и было написано при помощи
OleProcedure, OlePropertyGet, OlePropertySet.

Примечание:
Да и на сколько я знаю в C++ Builder работа с Excel отличается от Делфи и все как раз работает через OlePropertyGet/OlePropertySet/OleFuntion/OleProcedure.

Примечание:
Да я тоже раньше думал что не отличается.
C OleVariant тоже самое - никакой разницы.
При любом раскладе пишет 'Class' is not a member of 'Variant' либо
'Class' is not a member of 'OleVariant'.
Не так давно наткнулся на форуме на описание работы с Excel в Builder -
"Не-не-не... smile.gif Билдер - это тебе не Дельфи, тут вся работа происходит через OlePropertyGet/OlePropertySet/OleFuntion/OleProcedure.."

Примечание:
Часть проблем конечно ушла - при помощи
ExcelDOK = GetActiveOleObject("Excel.Application");
При открытии Excel файлов во время работы программы, считывание из файла не останавливается. Однако если закрыть пустую книгу Excel программа выкидывает ошибку:
OLE error 800A01A8
:-D
Вообще есть ли возможность работать с Excel одновременно с одновременной работой программы:)

Примечание:
Отлаживать DLL библиотеку затруднительно.
Вывод делается в ListBox при каждой итерации!

Примечание:
OLE error 800A01A8 - программа выдает когда любой открытый файл Excel (Кроме того с который работает программа) взять и закрыть.
Я так полагаю что это как то связано с работой COM. То есть при открытии Excel не создается очередной копии процесса Excel а он цепляется за уже созданный и при закрытии программы (Excel) освобождает ресурсы и убивает Excel.
Когда документы небольшого размера коды которые описывают в интернете работают отлично потому что не приходятся ждать долгой обработки документа!

Примечание:
В коде используется и то и другое - грубо говоря так:
try
{
ExcelDOK = GetActiveOleObject("Excel.Application");
}
catch(...)
{
ExcelDOK = CreateOleObject("Excel.Application");
}
Пока это самый рабочий метод.
Что за функция такая AddRef?

Примечание:
Нашел некое описание данной функции использованной в связке с InterlockedIncrement %)
IUnknown::AddRef() и IUnknown::Release()?
Только что то не совсем понятно куда сие прикручивать.
Ответы:
Скорее всего проблема не в Excel, а в коде.
Отладка должна помочь.
Попытайтесь повторить ситуацию под отладкой и найти проблемное место.
И вообще кто Вас учил работать через OleProcedure, OlePropertyGet, Ole******** и т.п, а тем более через варианты?
Примечание №2 >>>>
После создания экземпляра дописуешь
Примечание №4 >>>>
Абсолютно не отличается, разве что методы разделяются не точками, а этим '->' (кстати с этим пошамань)


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.