Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:56[Войти] | [Зарегистрироваться]
Ответ на вопрос № 69484

Вопросы с аналогичными сообщениями об ошибках:
  • Access violation at address ... (776)
  • Privileged instrution (6)

    25-03-2009 06:18
    Уважаемые жители Королевства, помогите!Плиз!
    Я в Delphi совсем недавно, потребовалось изучать при написании диплома.Задача следующего содержания: есть расчетные модули в MathCAD, мне надо передать туда ряд значение, провести расчет без визуализации,потом вытащить от туда другие значения и работать с ними в delphi (все это надо сделать несколько раз, а именно 7). Все это сделала через OLE, считать то считает, но при разрушении оле-контейнера выдает ошибку сперва Privileged instruction, а потом еще и AcessVialetion, причем на втором шаге цикла в котором это все происходит перерасчет документа не происходит, так же выдает AcessVialetion. Чтоя только ни делала :( сил уже нет. Вот этот проклятый цикл:

    for w6:=0 to 6 do
      begin
      ShellExecute(Application.Handle,'open','mathcad.exe',nil,nil,SW_HIDE);
      Sleep(15000);

     
        MatchCADWHandle:=FindWindow(nil, 'Mathcad - [Untitled:1]');
        ShowWindow(MatchCADWHandle, SW_HIDE);


        AssignFile (r7,'C:\Program Files\Borland\Delphi7\Projects\1\7.prn');
        Rewrite (r7);
        write (r7,IntToStr(t));
        CloseFile (r7);

        AssignFile (konec,'C:\Program Files\Borland\Delphi7\Projects\1\konec.prn');
        Append  (konec);
        write (konec,t,'  ');
        CloseFile (konec);

        GraphicFm.ComboBox1.Items.Add(IntToStr(t));
        TSL_K_fm.ComboBox1.Items.Add(IntToStr(t));

        t:= t+StrToInt(Edit12.Text);

        OLEContainer:=TOLEContainer.Create(Application);
        OLEContainer.Parent:=Panel1;
        OLEContainer.CreateObjectFromFile(ExtractFilePath(Application.ExeName)+mcdFileName,false);
        OLEContainer.DoVerb(OVPrimary);
        mcdDoc:=OLEContainer.OleObject;
        mcdDoc.ReCalculate;
        mcdDoc.GetComplex('Z1',I0,EmptyParam);

        mcdDoc.GetComplex('data1',data1,EmptyParam);
        mcdDoc.GetComplex('data2',data2,EmptyParam);
        mcdDoc.GetComplex('data3',data3,EmptyParam);
        mcdDoc.GetComplex('data4',data4,EmptyParam);
        mcdDoc.GetComplex('data5',data5,EmptyParam);
        mcdDoc.GetComplex('data6',data6,EmptyParam);
        mcdDoc.GetComplex('data7',data7,EmptyParam);

        mcdDoc.GetComplex('data0',data0,EmptyParam);
        OLEContainer.Close;



        tv0:=findvardata(I0)^;
        tv1:=findvardata(data0)^;

        I1:=findvardata(data1)^;
        I2:=findvardata(data2)^;
        I3:=findvardata(data3)^;
        I4:=findvardata(data4)^;
        I5:=findvardata(data5)^;
        I6:=findvardata(data6)^;
        I7:=findvardata(data7)^;

        k:=10;
        i:=StrToInt(Form2.Edit1.text);
        case i of
        1:j:=330;
        2:j:=400;
        3:j:=1000;
        4:j:=330;
        5:j:=400;
        6:j:=1000;
        7:j:=400;
        8:j:=400;
        9:j:=800;
        10:j:=800;
        end;

        SetLength(d0,k*j);
        d0:=tv0.VArray^.Data;
        SetLength(n_mas,k,j);


        SetLength(d1,2*j);
        d1:=tv1.VArray^.Data;
        SetLength(n_mas1,2,j);



        SetLength(int1,j);
        int1:=I1.VArray^.Data;

        SetLength(int2,j);
        int2:=I2.VArray^.Data;

        SetLength(int3,j);
        int3:=I3.VArray^.Data;

        SetLength(int4,j);
        int4:=I4.VArray^.Data;

        SetLength(int5,j);
        int5:=I5.VArray^.Data;

        SetLength(int6,j);
        int6:=I6.VArray^.Data;

        SetLength(int7,j);
        int7:=I7.VArray^.Data;


        l:=0;
        p:=0;


        for asa:=0 to 6 do
        begin
            for aza:=0 to Pred(j) do
            begin
            case asa of
            0 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int1[aza]);
            1 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int2[aza]);
            2 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int3[aza]);
            3 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int4[aza]);
            4 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int5[aza]);
            5 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int6[aza]);
            6 : (TSL_K_fm.FindComponent('Temp' + IntToStr(w6+1)) as  TChart).Series[asa].AddXY(aza,int7[aza]);
            end;
            end;
        end;


              for ik:=0 to Pred(k) do
              begin
              for ij:=0 to Pred(j) do
                  begin
                  n_mas[ik,ij]:=d0[l];
                  inc(l);
                  (GraphicFm.FindComponent('GrTemp_' + IntToStr(w6+1)) as  TChart).Series[ik].AddXY(ij,n_mas[ik,ij]);
                  end;
              end;



        for it:=0 to 1 do
        begin
              for ir:=0 to Pred(j) do
                  begin
                  n_mas1[it,ir]:=d1[p];
                  inc(p);
                  end;
        end;

    FileName:='C:\Program Files\Borland\Delphi7\Projects\1\LumMono'+IntToStr(w6+1)+'.prn';
    AssignFile (LumMono,FileName);
    Rewrite (LumMono);
          for ir:=0 to Pred(j) do
          begin
          writeln (LumMono,n_mas1[0,ir],' ',n_mas1[1,ir]);
          TSL_fm.TCL.Series[w6].AddXY(ir,n_mas1[1,ir]);
          end;
    CloseFile (LumMono);

        SetLength(d0,0);
        I0:=EmptyParam;
        SetLength(d1,0);
        data0:=EmptyParam;

        SetLength(int1,0);
        data1:=EmptyParam;

        SetLength(int2,0);
        data2:=EmptyParam;

        SetLength(int3,0);
        data3:=EmptyParam;

        SetLength(int4,0);
        data4:=EmptyParam;

        SetLength(int5,0);
        data5:=EmptyParam;

        SetLength(int6,0);
        data6:=EmptyParam;

        SetLength(int7,0);
        data7:=EmptyParam;

        OLEContainer.Destroy();//здесь ошибка Privileged instruction
        PostMessage(MatchCADWHandle,WM_QUIT,0,0);
        Sleep(25000);
        Application.ProcessMessages();
      end;

    я и приоритет повышала
    >>>SetPriorityClass(GetCurrentProcess,HIGH_PRIORITY_CLASS);
    не помогает:(
    СПАСИТЕ!

    [+] Добавить в избранные вопросы

    Отслеживать ответы на этот вопрос по RSS

    Ответы:


    Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
    Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

    29-03-2009 23:43 | Сообщение от автора вопроса
    Ура!Товарищи свершилось!Все работает идеально!
    После того как убрала
    >>>OLEContainer.Destroy();
    ошибка выскакивала в конце программы, там у меня еще есть пара моментов где приходится работать с оле. Попробовала Free поставить, не помогло. Потом нашла
    >>>FreeAndNil(OleContainer);
    Классная штука!

    26-03-2009 20:35 | Сообщение от автора вопроса
    Спасибо за совет, но метод  Free мне тоже не помог, выкрутилась вот как (конечно неправельно скорее всего):я вообще убрала
    >>>OLEContainer.Destroy();
    а оставила только
    >>>OLEContainer.Close;
    и после, закрытие приложения MathCAD
    >>>PostMessage(MatchCADWHandle,WM_QUIT,0,0);
    пока все работает без ошибок.

    26-03-2009 05:28
    Вы логику потеряли при чтении хелпа. Перевожу: Никогда не вызывайте Destroy непосредственно из приложения. И далее по тексту хелпа. Ваша ошибка заключается в том, что вы вызываете деструктор компонента перед вызовом унаследованного деструктора. В том же хелпе написано: Вызывайте метод Free . Вот этот метод корректно уничтожит ваш объект. И есть большая вероятность, что и память корректно освободится и ресурсы вернутся системе. А по поводу граблей в функции CreateOLEObject в двух словах ответить очень сложно. Все дело в том, что при позднем связывании не зная интерфейса COM-сервера вам с этим может быть очень трудно работать (при условии, что вы этого никогда не делали). Попробуйте импортировать таблицу типов (Project|Import Type Library) и попытаться разобраться с типами и интерфейсами MathCAD. Возможно, что в будущем это может пригодиться.

    25-03-2009 22:48 | Комментарий к предыдущим ответам
    А если не сложно подскажите как перейти от OLEContainer.CreateObjectFromFile к CreateOLEObject, какие грабли меня тут могут поджидать?Буду безумно благодарна если на моем примере продемонстрируете:)

    25-03-2009 22:35 | Комментарий к предыдущим ответам
    Не могу понять где я логику то потеряла...
    создала оле контейнер


    OLEContainer:=TOLEContainer.Create(Application);
    OLEContainer.Parent:=Panel1;
    OLEContainer.CreateObjectFromFile(ExtractFilePath(Application.ExeName)+mcdFileName,false);
    OLEContainer.DoVerb(OVPrimary);
    mcdDoc:=OLEContainer.OleObject;


    Вытащила переменные
    >>>mcdDoc.GetComplex('Z1',I0,EmptyParam);
    закрыла оле
    >>>OLEContainer.Close;
    поработала с полученными данными,
    обнулила переменные
    >>>SetLength(d0,0);
        I0:=EmptyParam;
    разрушила оле контейнер
    >>>OLEContainer.Destroy();
    чего я не вижу???

    25-03-2009 10:38 | Сообщение от автора вопроса
    что значит "при нормальном вызове деструктора", что у меня то не нормально...help прочитала еще раз...не доходит до меня...наверно после рабочего дня мозг совсем отказывает:(

    25-03-2009 10:21
    Так Вы его, судя по вашему вопросу, так и не разрушили. А при нормальном вызове деструктора и объект разрушается и память, выделенная под него, освобождается. Внимательно прочтите хелп для TOLEContainer.Destroy.

    25-03-2009 09:56
    я и один раз пробовала его создавать и после отработки разрушать, так тоже не работает, виртуальную память забивает до отказа, а
    >>>ShellExecute(Application.Handle,'open','mathcad.exe',nil,nil,SW_HIDE);
    пришлось написать потому что по другому даные из маткада не вытаскиваются, на простом примере когда изучала всё это дело все работало нормально, но когда свои модули подключила вот тут и начались проблемы, честно говоря даже не знаю почему:(
    >>>OLEContainer.CreateObjectFromFile(ExtractFilePath(Application.ExeName)+mcdFileName,false);
    разве не анологично CreateOLEObject?
    простите конечно если туплю, но с делфи знакома всего 3 месяца.

    25-03-2009 07:51
    И как-то несовсем понятно:
    провести расчет без визуализации .
    Тогда зачем
    ShellExecute(Application.Handle,'open','mathcad.exe',nil,nil,SW_HIDE);.
    Импортируйте библиотеку типов и пользуйтесь MathCAD как COM-сервером. И не нужен тут никакой OLEContainer. Есть такая функция CreateOLEObject. И еще вопрос: зачем в цикле семь раз создавать объект и разрушать его? Может быть проще один раз создать, отработать цикл и уничтожить?

    25-03-2009 07:13
    OLEContainer.Destroy();//здесь ошибка Privileged instruction

    Цитата из хелпа:
    Do not call Destroy directly in an application. Instead, call Free. Free verifies that the TOleContainer reference is not nil, and only then calls Destroy.Destroy frees the OLE object before calling the inherited destructor.

    Добавьте свое cообщение

    Вашe имя:  [Войти]
    Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
    контрольный вопрос:
    Два кольца, два конца, посередине гвоздик.
    в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
    Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
    Тип сообщения:
    Текст:
    Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Вопросы с аналогичными сообщениями об ошибках:
  • Access violation at address ... (776)
  • Privileged instrution (6)


    Страница избранных вопросов Круглого стола.
  •   
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования