Поиск:

Ответ в темуСоздание новой темы Создание опроса
> vb-скрипт для получения объекта COM, не работает при втором запуске 
V
    Опции темы
Peter
Дата 7.3.2012, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Есть объект COM, написанный на C#.
Код
[Guid("........")]
public interface IBPMXConverterQualityControl
{
    bool ShowConverterDialog(string sConfPath, int iDiagramID);
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("........"),
ComVisible(true), ProgId("BPMX.Converter.QualityControl")]
public class BPMXConverterQualityControlClass : IBPMXConverterQualityControl
{
    public bool ShowConverterDialog(string sConfPath, int iDiagramID)
    {
        Application.SetCompatibleTextRenderingDefault(false);
        Application.EnableVisualStyles();
        Application.Run(new frConversion(sConfPath, iDiagramID));
        return true;
    }
}

Компилирую и регистрирую с помощью regasm с ключом /codebase. В OpenOffice.org создаю макрос
Код
Sub Main
      Dim conv as Object
      Set conv = CreateObject("BPMX.Converter.QualityControl")
      conv.ShowConverterDialog("", 0)
End Sub

Запускаю. На экране появляется окошко класса frConversion (см. код на C#). Делаю, что нужно, и закрываю это окно. Exe-шник COM-объекта блокируется программой OpenOffice.org! Почему?
Запускаю vb-скрипт второй раз. На экране вместо окошка класса frConversion появляется сообщение о необработанном исключении: "До создания первого объекта IWin32Window в приложении необходимо вызвать SetCompatibleTextRenderingDefault".
Выгружаю OOo, запускаю опять, вызываю тот же скрипт - работает. Вызываю вторично - опять та же ошибка. В чем может быть дело?

Это сообщение отредактировал(а) Peter - 7.3.2012, 12:38


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Peter
Дата 7.3.2012, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Решено!
Код
        try
        {
            Application.SetCompatibleTextRenderingDefault(false);
        }
        catch { }

Читаем MSDN.
Цитата
Exception: InvalidOperationException
Condition: You can only call this method before the first window is created by your Windows Forms application.

Значит, если процесс висит в памяти, одно окошко уже было показано, так что второй вызов SetCompatibleTextRenderingDefault() приводит к выбросу исключения.


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
Peter
Дата 8.3.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: нет
Всего: 1



Еще хитрая штука: нельзя в компоненте было писать
Код
        Application.Run(new frConversion(sConfPath, iDiagramID));

OpenOffice.org от этого не страдает, а вот Excel, например, страдает: при закрытии окошка, принадлежащего компоненту, закрывается и сам Excel. Надо было так:
Код
        frConversion win = new frConversion(sConfPath, iDiagramID);
        win.Show();


Это сообщение отредактировал(а) Peter - 8.3.2012, 15:43


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.