2017-02-23 11 views
1

RTFドキュメントから切り離されたOLEバイナリがあります。たとえば、OLEバイナリはMS Wordに属します。このOLEバイナリは、FAT32複合ストレージ形式です。私はこのバイナリをC++のヘッダを使ってネイティブアプリにロードしようとしています。ネイティブアプリケーションで分離されたOLEバイナリを開きます。

私はバイナリ使用してstgopenstorageexからのIStorageオブジェクトを取得することができるが、私は、メソッドを呼び出すOleLoadしようとすると、エラー「クラスが登録されていないが、」スローされます。

誰でも続行する方法上の任意のアイデアを持っていますか?

+0

確かに、OLEファイルが表すどう思うかのオブジェクトを参照するファイルの名前を使用してGetClassFile()を呼び出します。 また、ストレージを開き、その上でReadClassStg()を呼び出して、OLEがオブジェクト内のファイルのCLSIDを取得するようにします。 あなたがCLSID(複数可)を取得した後、それを処理するために登録されているサーバーがあることを確認します。あなたのコメントのために@JoeWillcoxsonさんに感謝します。 –

+0

私の更新を確認してください。 :-) – Brlja

答えて

0

今日は少し進歩しました。 IStorageオブジェクトで "Word.Document.8"ストレージを開き、 "Word.Document.8"ストレージでOleLoadを呼び出して、 "Class not registered"エラーが解決されました。

私は今のIOleObjectを持っています。 DoWerbメソッドを呼び出すと、MS Wordが開き、ドキュメントが表示されます。 これは良い進歩です。

今私は、この文書にCOMのハンドルを取得したいと思います。 アイデアは隠された(ヘッドレス)MS Wordでドキュメントを読み込んで、doc、docx、またはPDFとしてディスクに保存することです。

誰でもご存知ですか?

+0

"COMハンドル"が何を意味するかわからない...オブジェクトを取得したら、IDispatchインターフェイスを問い合わせることができます。 IDispatchインターフェイスから、SaveAsメソッドを呼び出すことができます。 C++で最も簡単な方法は、CComDispatchDriverを使用し、メソッドとしてL "SaveAs"を指定し、その後に2番目の引数としてファイル名を指定するInvoke1メソッドです。 –

+0

@JoeWillcoxson IDispatchインターフェイスを取得しようとしていますが、エラーがスローされました。「E_NOINTERFACEそのようなインターフェイスはサポートされていません。 これは私の行です:result = oleObj-> QueryInterface(IID_IDispatch、(void **)&disp); – Brlja

+0

IDispatchを呼び出す前にOleRunを呼び出そうとしていますか?オブジェクトが実行状態でないときに、オブジェクトで実装されているインタフェースについては知らない –

関連する問題