「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:2
総数:3030
現在:2


ユーザのDLLを「OOOのオブジェクト」として登録する方法は?

ページOpenOffice.org FAQの登録ページ
投稿者kafuka
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-03-25 13:27:59 (木)
OSwinXP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

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 (金))

マクロについて以下のようなサイトが参考になります。

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 (火))

「鉛筆のアイコン」に気づきませんでした。

お名前:
題名: