ラベル ActiveX の投稿を表示しています。 すべての投稿を表示
ラベル ActiveX の投稿を表示しています。 すべての投稿を表示

2012年4月24日火曜日

LibreOffice「ActiveX Control to Display Documents in Internet Explorer」の件

或る時のOpenOffice.org Writer/Calcでは、Internet Explorerに文書を表示できていました。

参考になる画面写真:
http://sites.google.com/site/kaihatsublog/activex-control-plugin-viewer/openoffice-org-writer
http://sites.google.com/site/kaihatsublog/activex-control-plugin-viewer/openoffice-org-calc


これが、LibreOfficeになってから、表示できなくなっています。

しかし、ヘルプによりますと、表示できることになっています。

Internet Explorer でドキュメントを表示させるための ActiveX コントロール
http://help.libreoffice.org/Common/ActiveX_Control_to_Display_Documents_in_Internet_Explorer/ja


どういう事か調べましたら、情報が有りました。

Windows build with ActiveX
http://nabble.documentfoundation.org/Windows-build-with-ActiveX-td3926953.html

~~~~~
英文:

I tried to find the activex dll (so_activex.dll & so_activex64.dll) in my  
latest official install (LibreOffice 3.5.2.2 / Version ID :  
281b639-6baa1d3-ef66a77-d866f25-f36d45f) and did not find it.
I did find it in the latest build of
Win-x86@15-Prague_Win32 tinderbox  
though (program subfolder).

Is it intentional we do not provide it by default or not ?

Yes, it is. We disable it in distro-configs/LibreOfficeWin32.conf
(--disable-activex-component). You can enable it in your own build and
play with it. As Tor mentined in the other thread, it does not work as
one can expect
, and it has no maintaner, so in order to avoid numerous
bug reports we simply disable it.


~~~~~
和訳:

私は公式の最新版LibreOffice3.5.2.2から、activex dllを見つけ出そうとしましたが、見付かりませんでした。
Tinderboxの最新ビルドからは、その機能を見つけることができましたが…

その機能の提供有無についての判断は、故意によるものですか?

はい。そうです。我々はdistro/configs/LibreOfficeWin32.conf (--disable-activex-component)で、その機能を無効にしています。
あなたは、自分のビルドにおいて、その機能を有効にできます。
Tor氏が他のスレッドで言及しているように、その機能は期待するようには動いておらず、手入れできる人材もいません。数え切れない数のバグレポートを回避するために、我々は単にその機能を無効にしています。

きちんと事情が有るようでした(^^;

2012年1月18日水曜日

Reg-Free COM on .NET 2.0の実践

.NET 2.0 C#から、MFCで作ったようなCOM DLLを、レジストリに登録しないで呼び出す方法を、備忘したいと思います。
MFCにはCOleDataSourceクラスとか、OLEと連携する上で役立つクラスが多数有ります。

これらを.NETだけで実現しようとすると、膨大な手数になります。

C#でドラッグ・アンド・ドロップできるアプリ(バックアップの復元ソフト)を作る際に、活用できました。

具体的な手法は又の機会に譲るとして、ここでは要素技術のみを列挙いたします:

Handling Shell Data Transfer Scenarios
  FILEDESCRIPTOR
  FILECONTENTS
IAsyncOperation

Registration-Free Activation of COM Components: A Walkthrough
  Assembly Manifests

手順:

マニフェストファイルを用意します。紫色の部分を変えていきます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="DiffBkRestore"
      processorArchitecture="x86"
      version="1.0.0.0"
      />
  <file name="VFCopy.dll">
    <comClass clsid="{8FADBC22-CF67-4AEE-9B67-451C106B187E}" threadingModel="Apartment" />
  </file>
</assembly>


mt.exeでexeの中に入れ込みます。外付けのmanifestファイルでは、Reg-Freeが機能しませんでした。
紫色の部分を変えます。

mt.exe -manifest DiffBkRestore.manifest -outputresource:bin\x86\release\DiffBkRestore.exe;#1

私はNSISでセットアップを構築しています。NSISのビルド実行時にmt.exeが動くように作りこみするのも絶妙な手でしょう。

!system '"C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\mt.exe" -manifest DiffBkRestore.manifest -outputresource:bin\x86\release\DiffBkRestore.exe;#1' = 0
;C:\Program Files (x86)\Microsoft Visual Studio 8\VC\bin\mt.exe
;C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\Bin\mt.exe
;C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin\mt.exe

mt.exeのパスが大量にメモってあるのは、環境が変わった際に探しやすいようにする為です。

where mt.exeで探してきました。

NSISでは、!systemでシェルコマンドを実行できます。失敗したらビルドが停止するように、" = 0"を最後に足しています。指定しないと失敗しても止まりません→ほぼ確実に見落します。

後、注意点として、processorArchitectureをx86等に固定しないといけません。

.NETのアセンブリは、x86でビルドしましょう。

Any CPUでビルドしてしまうと、64ビットWindowsでは、x64で起動してしまいます。これではx86で作ったCOM DLLを読み込みできません。具体的には、BadImageFormatExceptionが発生すると思います。

2011年8月31日水曜日

PDFファイルを表示できるActiveX コントロール

PDF4Ax

Internet Explorer等のホストでPDFファイルを表示できるActiveX Controlです。

https://github.com/HiraokaHyperTools/PDF4Ax/releases

このような物に頼らなくても、Adobe Reader又はAcrobatが必要な機能を提供するものと確信しています。

しかしながら、ニッチな要望が有り、多少の需要を見込んでいます。

2011年7月9日土曜日

"ControlSource/コントロールソース" プロパティ を持つATLコントロールを作成する

Microsoft Accessでフォームを構築する際には、多数のテキスト ボックス(コントロールソースを設定した物)を多用するかと思います。


開発者がこのようなコントロールを自作したい場合は、どのような作りこみをすれば良いか?

例えばExcelで見られるような、セル幅に合わせた表示をしてくれるラベル・コントロールを作りたい場合です。

Microsoft Visual Studio 2005で、Control Sourceを持つコントロールを作成できました。そのテクニックをご紹介したいと思います。

※ Microsoft社様のサイトにHow to情報が有りました:How to add Excel LinkedCell support to your ATL ActiveX control

既に作成しているコントロールを調整する場合:
  • 次のINTERFACE_ENTRYをすべて含みます:
    • COM_INTERFACE_ENTRY(IConnectionPointContainer)
      COM_INTERFACE_ENTRY(IProvideClassInfo)
  • 次のCONNECTION_POINT_ENTRYを含みます:
    • CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
  • IDLファイルで次の定義をinterfaceに含みます。Valueの名称、idの序数、displaybindの有無は任意。但しbindable必須、defaultbind必須、VARIANT型を用いることも必須です:
    •  [propput, bindable, displaybind, defaultbind, id(0)]
       HRESULT Value([in]VARIANT *rhs);
       [propget, bindable, displaybind, defaultbind, id(0)]
       HRESULT Value([out,retval]VARIANT *prv);
  • Valueプロパティの実装を作りこみます。
 この手はずでいけると思います。

新たにコントロールを作成する場合:
  • 「クラスビュー」を表示、プロジェクトを右クリック、「追加」クリック、「クラス」クリック、「ATL コントロール」選択、「追加」クリック。
  • 「オプション」では、「接続ポイント」のサポートにチェックを入れてください。
  • 「インターフェイス」では、「IPropertyNotifySink」「IProvideClassInfo2」をサポート有りに移動します。
  • IDLファイル中の作成したinterfaceに、Valueプロパティの定義を追加します。例:
    •  [propput, bindable, displaybind, defaultbind, id(1001)]
       HRESULT Value([in]VARIANT *rhs);
       [propget, bindable, displaybind, defaultbind, id(1001)]
       HRESULT Value([out,retval]VARIANT *prv);
  • 作成したクラスのヘッダファイルにValueプロパティ操作の実装を追加します。例:
    •  public:
        CComVariant m_vt;

        virtual HRESULT STDMETHODCALLTYPE put_Value(VARIANT *rhs)
        {
         return m_vt.Copy(rhs);
        }

        virtual HRESULT STDMETHODCALLTYPE get_Value(VARIANT *prv)
        {
         return VariantCopy(prv, &m_vt);
        }
注意する箇所の図解です:
[ATLコントロールウィザード]-[オプション]画面
 [ATLコントロールウィザード]-[インタフェイス]画面
IExcellyLabel6のinterface定義にValueプロパティを追加
CExcellyLabel6にValueプロパティ操作の実装を追加

2011年4月14日木曜日

ホスト(Internet Explorer等)のサイト(IOleClientSite等)を得る方法

Visual Studio 2005の、Windows Control Libraryプロジェクトで作成致します、UserControlでの話です。

一日掛けて試行錯誤しました所、次の方法で落ち着きました:

    IOleClientSite pClientSite = (IOleClientSite)Site.GetService(new AntiMoniker().GetType());

  [ComImport(), Guid("00000305-0000-0000-C000-000000000046")]
  class AntiMoniker {
  }


ポイントはnew AntiMoniker()の部分で、System.__ComObjectをインスタンス化しているという点です。かなり姑息な方法ですが… 他に良策を思いつきません。

必ずしもAntiMonikerである必要は無いと思います。

然しながら、何とかMoniker系は歴代Windowsでも問題なく使えそうなクラスだと思いましたので、AntiMoniker辺りを選びました。

また、AntiMonikerの中身は省いています(メソッド・プロパティは今回使いませんので)。

---
本件で参考にしたポストです:

How to use IOleClientSite in C#?
http://www.eggheadcafe.com/software/aspnet/33997199/how-to-use-ioleclientsite-in-c.aspx
How to cast a control to IOleObject
http://stackoverflow.com/questions/1216760/how-to-cast-a-control-to-ioleobject