ユーザのDLLを「OOOのオブジェクト」として登録する方法は? †
ページ | OpenOffice.org FAQの登録ページ |
---|---|
投稿者 | kafuka |
分類 | |
優先順位 | |
状態 | |
カテゴリー | |
投稿日 | 2010-03-25 13:27:59 (木) |
OS | winXP |
依存するページ | |
バージョン |
メッセージ †
回答ページでは行末に「~」を付加する必要はありません |
Switerから、「VB6.0で作ったOLE.dll」経由でMaximaを呼び出そうと考えております。
VB6.0のDLLでのMaximaの呼び出しや結果の受け取りのインタフェースは、わかっています。
問題は、、、
Switerのオブジェクト挿入の画面に「VB6.0で作ったOLE.dll」
が表示されないことです。
(試しに「ファイルから作成」にすると、DLLがCallでなくRunされてしまいます)
ユーザのDLLを「OOOのオブジェクト」として登録する方法をお教え下さい。
参考になるドキュメントのURLでもかまいません。
よろしくお願いします。
その他のオブジェクト? †
M.Kamataki (2010-03-25 14:42:44 (木))
>(試しに「ファイルから作成」にすると、DLLがCallでなくRunされてしまいます)
「挿入」-「オブジェクト」-「OLEオブジェクト」で表示された「OLEオブジェクトを挿入」ダイアログの「その他のオブジェクト」を選ぶと表示されたりしませんか?
そこにも出ませんです †
kafuka (2010-03-25 15:04:16 (木))
「その他のオブジェクト」には、MicrosoftOffice関係のものや、Bitmapオブジェクトとかは出ていますが、、、
OLEオブジェクト †
M.Kamataki (2010-03-25 17:11:06 (木))
OLEオブジェクトはOSにインストールして利用できるものというのがわたしの理解です。単純に考えると、「VB6.0で作ったOLE.dll」がOSに登録されている必要があると思うのですが、どうでしょうか。
なお、OpenOffice.orgのマクロでは、Declare文でdllを指定できるのでなんとかできる可能性はあります。当サイトを「declare」で検索すると、faq/5/9「basic プログラムでマウスポインターを移動させたい」などマクロ例が見つかると思います。
Declare文でdllを指定する方法でやります †
kafuka (2010-03-25 23:34:07 (木))
ありがとうございました。
あとは、
1.「数式」を右クリックして出るメニューに、本DLLを呼び出す項目を
追加すること
http://codesnippets.services.openoffice.org/Office/Office.ContexMenuInterceptor.snip
では、数式でない場所での右クリックメニューも変わってしまいます。
それと、
2.OoBasicで、結果を入れる「数式オブジェクトを作ること」
がわかりません。
恐縮ですが、アドバイスお願いします。
>「VB6.0で作ったOLE.dll」がOSに登録されている必要がある
それは、VB6.0のIDEがやってくれます。
(VB6.0の「参照設定」には、本DLLが表示されています)
調べてみませんか †
M.Kamataki (2010-03-26 23:04:53 (金))
マクロについて以下のようなサイトが参考になります。
- OOoBasic Wiki
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?FrontPage- OOoForum
http://www.oooforum.org/- OpenOffice.org Community forum
http://user.services.openoffice.org/en/forum/index.php
OpenOffice.org Community forumですと、以下のようなBasicでのdllの利用方法の質問に、サンプルが多くアップされているのでOOoForumを調べてみたら、というようなQ&Aがあったりします。
Using objects instantiated by a DLL in Basic
http://user.services.openoffice.org/en/forum/viewtopic.php?f=45&t=14707&p=68796
以上のようなサイトを調べてみませんか。たぶん kafukaさんなら、何かヒントになるページが見つかるのではないでしょうか。
無題 †
ike@九州 (2010-03-27 15:37:09 (土))
1.数式でない場所での右クリックメニューも変わってしまいます。
Basicではこれは致し方ないと思います。選択されたものが数式でなければ何もしない等で回避でしょうか。Sub test oDoc = ThisComponent oSelection = oDoc.getCurrentController.Selection If Not oSelection.supportsService("com.sun.star.text.TextEmbeddedObject") then exit sub If oSelection.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997" then '処理 End if End sub
2.OoBasicで、結果を入れる「数式オブジェクトを作ること」
がわかりません。
以下にサンプルがありました(動作確認済み)
http://www.oooforum.org/forum/viewtopic.phtml?t=31265
ooBasicからVB6で作ったOLE.DLLが使えました †
kafuka (2010-03-29 12:03:05 (月))
皆様、ありがとうございます。
遅々としてですが進んでおります。
「Declare文でdllを指定する方法」は、手間がかかりすぎるので、
調べまくったら、
http://www.oooforum.org/forum/viewtopic.phtml?t=9815
のサンプルのB2のやりかたで出来ました。
僕の作ったDLLのProgIDは「testDll.class1」なのでSub Main() Dim oleService as object Dim IE as object oleService = createUnoService("com.sun.star.bridge.OleObjectFactory") IE = oleService.createInstance("tesDll.class1") call IE.testAAA 'これはmethodの呼び出しです IE = Nothing End sub調子に乗って、VBのCommonDialogもやってみましたが、これはダメでした。
Sub Main() Dim oleService as object Dim IE as object oleService = createUnoService("com.sun.star.bridge.OleObjectFactory") IE = oleService.createInstance("MSComDlg.CommonDialog") IE.ShowOpen ’ここでException発生!! IE = Nothing End sub尚、VB6で作ったクラスのProgIDは、「プロジェクト名.クラス」となります。
確認するには、oleview.exeで、AutomationObjects
を開けば、出てきます。
BASとしては完成したのですが、ライブラリにすると問題が!! †
kafuka (2010-04-17 20:45:07 (土))
ライブラリにして、インポートはできるのですが、
実行すると、
Thiscomponentに「getEvents()メソッドがない旨」のエラーとなります。
BASを Standard配下にコピペすると、OKです。
たぶん、ライブラリの親オブジェクトは、Swriterじゃないからと
思うのですが、、、
ライブラリの場合でも、マイマクロのStandard配下のBASと同じThiscomponent
を得るには、どうしたらいいのでしょうか?
尚、本プログラムは、すでに起動されているSwriterから呼ばれるので、
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")
Set objDesktop = oServiceManager.getCurrent何とか
Set objDocument = objDesktop.getCurrent何とか
とするのでは、と思うのですが、、、
全く分かりませんが †
ike@九州 (2010-04-19 16:47:20 (月))
Set objServiceManager = CreateObject("com.sun.star.ServiceManager") Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop") Set objDocument = objDesktop.getCurrentComponent
ではダメなのでしょうか
ご指示の方法でobjDocumentは取れましたが、、、 †
kafuka (2010-04-20 13:07:06 (火))
ありがとうございます。
しかしながら、この方法で取ったobjDocumentにコンテキストメニューを追加しても、
すでに起動されているSwriterの画面に出ません。
試しに、、、objDesktop = createUnoService("com.sun.star.frame.Desktop") objDocument = objDesktop.getCurrentComponent oController = objDocument.getCurrentController() oDocView =oController.getViewCursor() ・・・ここでエラー!! oDocView.setString("Now! 123")とすると、getViewCursor()メソッドが無い旨のエラーになります。
ライブラリでは、ViewCursorの位置に文字は挿入できないのでしょうか?
無題 †
tani (2010-04-20 14:15:53 (火))
私も状況がよくわかりませんが、単にStarDesktopでいいんじゃないですかね?oDocView = StarDesktop.getCurrentComponent().getCurrentController().getViewCursor()とか。
ちなみにgetCurrentControllerで取得したコントローラーのサポートサービスに"com.sun.star.text.TextDocument"とか"com.sun.star.text.GenericTextDocument"とか含まれていますか?
(getSupportServiceNameで確認できます。この辺が、マクロのIDE上で実行されたか、どのライブラリで内で実行されたか、どのドキュメント上で実行されたかで変わってくるように思います。)
完了です。ありがとうございました †
kafuka (2010-04-20 19:00:04 (火))
X-rayツールで調べてみました。
結果は、
objDesktop = createUnoService("com.sun.star.frame.Desktop")
objDocument = objDesktop.getCurrentComponent
でも
objDocument = StarDesktop.getCurrentComponent
でも同じで、objDocumentは「com.sun.star.comp.basic.BasicIDE」でした。
そこで、以下のようにgetComponents() を使ってみました。
objDocs = StarDesktop.getComponents().createEnumeration()
for i=0 to 9
objDocument = objDocs.nextElement()
xray objDocument ・・・2回目で SwXTextDocument!!
if objDocument.ImplementationName = "SwXTextDocument" then exit for
if not objDocs.hasMoreElements() then exit for
next i
2回目でSwriterがHitしました。
これで、ライブラリではThiscomponentが使えないわけと、回避策がわかりました。
ありがとうございました。
尚、getSupportedServiceNames() で出てくる内容は、
com.sun.star.document.OfficeDocument
com.sun.star.text.GenericTextDocument
com.sun.star.text.TextDocument
であり、SwXTextDocumentではありませんでした。
もっとうまい方法があれば、お教え下さい †
kafuka (2010-04-20 19:02:36 (火))
for i=0 to 9 なんてかっこ悪いですから、、、
無題 †
K.Tsunoda (2010-04-20 21:22:08 (火))
> objDocument = StarDesktop.getCurrentComponent
> でも同じで、objDocumentは「com.sun.star.comp.basic.BasicIDE」でした。
という事は、IDEウィンドウを前面に出して、IDEの「マクロ実行」ボタン
で動かしている訳ですよね。
> ライブラリにして実行すると、
> Thiscomponentに「getEvents()メソッドがない旨」のエラーとなります。
getEvents()メソッドが無いではなくて、ThisComponent そのものへの
アクセスエラーではないでしょうか?
下記解説で [ ThisComponent ]の(注)部分の障害に該当しませんか?
http://blog.livedoor.jp/addinbox/archives/51192547.html
そのようです †
kafuka (2010-04-20 23:48:30 (火))
正確に言えば、ドキュメントウインドウを全くActiveにしない場合で、
ライブラリであってもStandard配下なら、
Sub Test1()
MsgBox ThisComponent.Title
End Sub
は、エラーになりません。
しかし、ライブラリで他の名前のものの配下なら、エラーになります。
書かれているように、
「ドキュメントウインドウをActiveにしてから」IDEの「マクロ実行」ボタンを押すと
Standard配下であってもなくても、エラーになりません。
完了してはどうでしょう †
M.Kamataki (2010-04-23 10:00:19 (金))
当ページのシステムとして、「完了」か「完了回答待ち」にすると、分類メニューのカテゴリ別に整理されてリストに表示されます。ある程度まとまれば、リストに加えて、ユーザーの方の共有情報として利用しやすいようにしています。いったん「完了」にしてはどうでしょうか。
完了なのですが、、、 †
kafuka (2010-04-27 03:19:41 (火))
どうしたら「完了」にできるのか、ボタン?がわかりません。
お手数ですが、教えて下さいませんでしょうか。
完了方法 †
M.Kamataki (2010-04-27 07:26:20 (火))
kafukaさんが操作されるなら、「当サイトの使い方/高度な使い方」の「faq/4以降の状態などの変更」をご覧ください。
単に「完了にしてください」ということであれば、わたしが操作します。操作は簡単ですので、ぜひトライしてみてください。
ありがとうございました。 †
kafuka (2010-04-27 09:36:40 (火))
「鉛筆のアイコン」に気づきませんでした。