或る時の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年4月24日火曜日
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が発生すると思います。
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が必要な機能を提供するものと確信しています。
しかしながら、ニッチな要望が有り、多少の需要を見込んでいます。
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
既に作成しているコントロールを調整する場合:
新たにコントロールを作成する場合:
開発者がこのようなコントロールを自作したい場合は、どのような作りこみをすれば良いか?
例えば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
一日掛けて試行錯誤しました所、次の方法で落ち着きました:
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
登録:
投稿 (Atom)