sutni > 13-02-2006 10:38:10 |
Есть желание вызывать MS Excel из FireFox для представленея неких данных в таблицах екселя. Написал простенькое расширение, которое пытается вызвать такой код: if (window.GeckoActiveXObject){ var oXL=new GeckoActiveXObject("Excel.Application"); } или так: var oXL=new GeckoActiveXObject("{00024500-0000-0000-C000-000000000046}"); появляется такая ошибка: Ошибка: uncaught exception: [Exception... "Unable to create an instance of the desired COM classCOM Error Result = 80004002" nsresult: "0x80570039 (NS_ERROR_XPC_COM_CREATE_FAILED)" location: "JS frame :: chrome://quasy/content/quasyOverlay.js :: go2Excel :: line 21" data: no] Line 21 - это как раз var oXL=new ... Как можно побороть? Заранее спасибо. |
sutni > 14-02-2006 17:20:29 |
Поскольку никто не отвечает, расскажу куда мне удалось продвинутся. Может после этого дадут навигацию... ) Во-первых, изменил CLSID на 00020812-0000-0000-C000-000000000046 - соответствующий Excel2003 (он у меня и установлен). Во-вторых, установил http://www.iol.ie/~locka/mozilla/plugin.htm#download. Но это как я понял можно было и не делать. Код теперь выглядит так: netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); if (window.GeckoActiveXObject){ var oXL=new GeckoActiveXObject("{00020812-0000-0000-C000-000000000046}"); alert (oXL); } if(oXL){ oXL.Visible = true; var oWB = oXL.Workbooks.Add(); var oS = oWB.ActiveSheet; } Alert возвращает "xpconnect wrapped IDispatch". В памяти повисает Excel. Но его не видно. Ошибка происходит в строке oXL.Visible = true : Ошибка: uncaught exception: [Exception... "Cannot modify properties of a WrappedNative" nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)" location: "JS frame :: .......... То есть как я понимаю, я не могу изменять никаких свойств объекта. Это как-то обойти можно? ....или приговор? PS. Под мазиллу пишу впервые. Так что принимаются все советы. |
Aerina > 14-02-2006 19:00:26 |
Я не знакома GeckoActiveXObject, так что как разобраться с ошибкой не подскажу. Но могу предложить просто пойти другим путем. http://www.iosart.com/firefox/xpcom/ - сделайте свою компоненту... тут очень хороший пример. Если Вы просто при нажатии на кнопку тулбара(или каком-то другом событии) создадите элемент своей компоненты и передатите в нее все необходимые данные, то там с помощью COM спокойно запустите Excel. |
sutni > 15-02-2006 11:33:11 |
Aerina пишетЯ не знакома GeckoActiveXObject, так что как разобраться с ошибкой не подскажу. Но могу предложить просто пойти другим путем. http://www.iosart.com/firefox/xpcom/ - сделайте свою компоненту... тут очень хороший пример. Если Вы просто при нажатии на кнопку тулбара(или каком-то другом событии) создадите элемент своей компоненты и передатите в нее все необходимые данные, то там с помощью COM спокойно запустите Excel.
Большое человеческое спасибо! |
sutni > 15-02-2006 14:16:38 |
Можно тогда ещё один вопросик? Как в метод интерфейса передать массив? А точнее двумерный массив. Например строк. interface IUSUExcel : nsISupports { long PutTable(in string titleTable, in "НУЖЕН 2-мерный массив строк" bodyTable ); }; Ожидаются ли тут проблемы на этапе передачи данных от JS к xpcom? Нигде не могу найти примера.... |
Aerina > 15-02-2006 14:50:58 |
sutni пишетМожно тогда ещё один вопросик? Как в метод интерфейса передать массив? А точнее двумерный массив. Например строк. interface IUSUExcel : nsISupports { long PutTable(in string titleTable, in "НУЖЕН 2-мерный массив строк" bodyTable ); }; Ожидаются ли тут проблемы на этапе передачи данных от JS к xpcom? Нигде не могу найти примера....
Ну, тяжело сказать... вообще-то JS - подозрительно относится к массивам... Надо искать примеры на JS - а я мало работала с этим языком. Я передавала только строчку, это получалось и возвращала строку. Что за информацию Вам надо передать? если что-то о страничке - то не легче передать все содержимое странички... а там в компоненте его на части разложить?... |
sutni > 15-02-2006 15:18:43 |
В принципе можно передавать длинную строку, в которую включать разделители. А С++ уже формировать массив. Но это как-то не по-человечески ). Да и опасно. С передачей всего содержимого страницы видится ещё больше сложностей. Сформировать 2-х мерный массив на JS легко. Вот как описать массив в интерфейсе не понятно. |
sutni > 15-02-2006 16:21:07 |
Ещё одна глупая просьба. Не могу воспользоваться утилитой xpidl.exe для создания xpt-файла. Похоже, что проблема в том, что у меня нет файлов libIDL-0.6.dll и glib-1.2.dll и неоткуда их взять. Может кто кинет ссылку. Или почтой... на sutni@mail.ru |
Aerina > 15-02-2006 16:37:00 |
http://www.mozilla.org/projects/plugins/ - посмотрите здесь (Plugin samples in the tree) - в этом разделе одна из первых ссылок - там порыться в примерах - есть длл. Я их брала от туда |
sutni > 15-02-2006 17:00:40 |
http://www.mozilla.org/projects/plugins … sWin32.zip Второй раз выручаешь. : ... и это только за сегодня.... |
sutni > 16-02-2006 12:30:26 |
Выгрузку в Excel сделал. Из локального файла всё работает замечательно. Если кому нужно поделюсь. В виде компоненты ещё не оформлял. Хочу потестировать код и осмыслить будущую структуру компоненты. Поэтому сейчас использую комманду netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); Столкнулся с такой проблемой: при попытке выполнить код с сервера такое сообщение: Сценарию с http://localhost было отказано в правах: UniversalXPConnect. Наверное в мозилле нужно какие-то настройки сделать.... Использую FireFox 1.5.0.1 из под WinXP. Помогите. Добавлено: С вызовом из crome та-же история. Написал специально xul-файлик (типа посредник), в котором при открытии пытаюсь выполнить код: function ToExcel() { try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); const cid = "@mydomain.com/XPCOMExcel/USUExcel;1"; obj = Components.classes[cid].createInstance(); obj = obj.QueryInterface(Components.interfaces.IUSUExcel); obj.OpenExcel(); } window.close(); } Cообщает то-же что и из обычного html. |
sutni > 16-02-2006 13:15:01 |
Нашел. user_pref("signed.applets.codebase_principal_support", true); |