Показать сообщение отдельно
Старый 30.03.2011, 19:34   #1  
Delfins is offline
Delfins
Участник
 
320 / 39 (2) +++
Регистрация: 20.09.2005
Адрес: Riga, Latvia
Падает Ахапта-2009 при использовании .NET/CLRInterop/Word
Такой вот код (ниже). Ахапта падает именно при вызове функции.. Сам Word то всё делает, открывает фаил, можно закрыть сам Word (без открытия дока).
Сначала была проблема, что подавал NULL в CLRInterop неправильно, но потом нашёл "хияцк" - http://rik-ax.blogspot.com/2008/01/p...lrinterop.html
Вот не понимаю где теперь проблема.. вызов вроде правильный.. может чего забыл? Мистический `missing` то в Quit() работает...

Пробую написать интерфейс для Word/документа-оботрота через .NET/CLR

Падают все тру вызова.. сами обьекты до Open()/Add() существуют
X++:
static public void ESL_word_test(Args _args)
{
    //> Missing hijack
    System.Type                 type = System.Type::GetType("System.Reflection.Missing");
    System.Reflection.FieldInfo info = type.GetField("Value");
    System.Object               missing = info.GetValue(null);
    //< Missing hijack

    str _filename = "C:\\............dot";

    Object clrException;
    Object clrExceptionOwner;

    Microsoft.Office.Interop.Word.ApplicationClass wc;
    Microsoft.Office.Interop.Word.DocumentClass wd;
    Microsoft.Office.Interop.Word.Documents wds;
    Microsoft.Office.Interop.Word.Bookmarks wb;

    System.Object oTrue = true;
    System.Object oFalse = false;
    System.Object oFormat = Microsoft.Office.Interop.Word.WdOpenFormat::wdOpenFormatAuto;
    System.Object oDirection = Microsoft.Office.Interop.Word.WdDocumentDirection::wdLeftToRight;
    System.Object oEmptyStr = "";
    //System.Object oEncoding = Microsoft.Office.Core.MsoEncoding::msoEncodingAutoDetect;
    System.Object oFilename = _filename;
    ;

    try
    {
        wc = new Microsoft.Office.Interop.Word.ApplicationClass();
        wc.set_Visible(true);

        wds = wc.get_Documents();
        if (!wds)
            throw error("no get_Documents");

        if (1)
            wds.Add(byref missing,byref missing,byref missing, byref oTrue);

        if (0)
        wd = wds.Open(
                    byref oFilename,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing,
                    byref missing
                );

        if (0)
        wd = wds.Open(
                    byref oFilename,
                    byref oFalse,
                    byref oTrue ,
                    byref oFalse,
                    byref oEmptyStr,
                    byref oEmptyStr,
                    byref oFalse,
                    byref oEmptyStr,
                    byref oEmptyStr,
                    byref oFormat,
                    byref missing,
                    byref oFalse,
                    byref oFalse,
                    byref oDirection,
                    byref oTrue,
                    byref missing
                );
    }
    catch (Exception::CLRError)
    {
        setprefix("CLR error");
        clrException = CLRInterop::getLastException();
        if (CLRInterop::isNull(clrException) == false)
        {
            error(clrException.get_Message());
            error(clrException.get_StackTrace());

            clrExceptionOwner = clrException.get_InnerException();
            if (CLRInterop::isNull(clrExceptionOwner) == false)
            {
                error(clrExceptionOwner.get_Message());
            }
        }
    }
    catch
    {
        info("Ax stop...");
    }

    if (wc)
    {
        try
        {
            wc.Quit(byref missing, byref missing, byref missing);
        }
        catch
        {
            setprefix("CLR Word-quit error");
            clrException = CLRInterop::getLastException();
            if (CLRInterop::isNull(clrException) == false)
            {
                error(clrException.get_Message());
            }
        }
    }
}