Показать сообщение отдельно
Старый 16.08.2006, 00:38   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Cool Отрицательный результат - тоже результат
Пытался поиграться радикально-хацкерским сочетанием Exception + SendKeys. Не покатило. Т.е. катит, но случайным образом, через раз-два, иногда наполовину. Для использования, конечно, не рекомендуется, хотя, если бы катило устойчиво, то было бы прикольно.

С другой стороны, если бы катило, то Microsoft пришлось бы изобретать новую рогатку для борьбы с таким управлением доступа к VB Project. Ибо любой, простите, дурак мог бы подобным образом поступить в своих злодейских целях...

Подозреваю, что, возможно, у них предусмотрена, какая-то случайная временная задержка на переключение этой галки "Доверять доступ к Visual Basic Project", подразумевающая именно ручное (неторопливое) переключение. Поэтому программа, как умалишенная сбрасывающая и устанавливающая этот флажок втечение долей секунды, просто отдыхает...

На память все же выкладываю джоб-попытку как отчет о проведенном исследовании:
X++:
static void MVB_Excel_DocProperty_3(Args _args)
{
    COMExcelDocument_RU     excel;
    FileName                fileName = "C:\\Пример.xls";
    COM     doc;
    COM app;
    
    COM Workbook;
    COM prj;
    COM comp;
    COM module;
    COM code;
    str s;
    
    // added by Gustav
    // ----------------------
    COM comTemp;
    str vbCrLf, alertMessage;
    int langID;
    str strSendKeys;
    boolean useTrustAccessDefault;
    
    #define.msoLanguageIDUI(2)
    // ----------------------
    
    #define.vbext_ct_StdModule(1)
    ;
    
    excel = new ComExcelDocument_RU();
    excel.newFile(fileName,true);
    doc = excel.getComDocument();
    app = doc.Application();
    
    // added by Gustav: запрос на проверку доступа к VB-проекту
    // --------------------------------------------------------
    comTemp = app.LanguageSettings();
    langID = comTemp.LanguageID(#msoLanguageIDUI); // язык интерфейса Excel 
    
    switch (langID)
    {
        case 1033:
            strSendKeys = '%TMS%T%V~'; // английский Excel (латинские буквы в стринге)
            break;
        case 1049:
            strSendKeys = '%ЕМБ%Н%В~'; // русский Excel (русские буквы в стринге)
            break;
    }
    
    useTrustAccessDefault = true;
    try
    {
        // если в исходном состоянии галка "Доверять доступ" выключена, то здесь возникает ошибка      
        comTemp = app.VBE();   
    }
    catch (Exception::Error)
    {
        useTrustAccessDefault = false;
        // корректируем ошибку установкой галки
        app.SendKeys(strSendKeys, true);
    }
    // --------------------------------------------------------
    
    Workbook = app.ActiveWorkbook();
    prj = Workbook.VBProject();
    comp = prj.VBComponents();
    comp.add(#vbext_ct_StdModule);
    module = comp.item(comp.count());
    code = module.CodeModule();
    s = strfmt(
                "Sub SetDocumentProperties()\n" +
                "\n" +
                "ActiveWorkbook.BuiltinDocumentProperties(\"Author\").Value = \"%1\"\n" +
                "ActiveWorkbook.BuiltinDocumentProperties(\"Creation Date\").Value = CDate(\"%2\")\n" +
                "With ActiveWorkbook.CustomDocumentProperties\n" +
                "    .Add Name:=\"Автор\", _\n" +
                "        LinkToContent:=False, _\n" +
                "        Type:=msoPropertyTypeString, _\n" +
                "        Value:=\"%1\"\n" +
                "    .Add Name:=\"Дата создания\", _\n" +
                "        LinkToContent:=False, _\n" +
                "        Type:=msoPropertyTypeDate, _\n" +
                "        Value:=CDate(\"%2\")\n" +
                "End With\n" +
                "\n" +
                "End Sub",
                (select UserInfo where UserInfo.id == curuserId()).Name,
                date2str(today(), 123, 2, 2, 2, 2, 4)
              );
    
    code.addFromString(s);
    app.Run(strfmt("%1.SetDocumentProperties", module.name()));
    
    // added by Gustav: удаляем VBA-модуль из рабочей книги
    // --------------------------------------------------------
    comTemp = module.Collection();
    comTemp.Remove(module);
    
    if (!useTrustAccessDefault)
    {
        // восстанавливаем исходное состояние галки "Доверять доступ" (т.е. выключенное)    
        app.SendKeys(strSendKeys, true);
    }
    // --------------------------------------------------------
    
}
Через некоторое время еще немножко продолжу (есть некоторые мысли). Потерпите немножко?