質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1994閲覧

wxWidgetsでPDFを表示する

nishisyun

総合スコア8

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/03 04:23

お世話になります。
初めて質問させていただきます。
タグにwxWidgetsがありませんでしたので、C++とさせていただいております。

wxWidgetsでの開発が初心者のため、試行錯誤しております。

###前提・実現したいこと
AcrobatSDKプラグインからWxWidgetsを呼び出してウィンドウを表示します。
ウィンドウ内をさらにwxSashLayoutWindowで分割して、右ペインのウィンドウにファイルオープンダイアログで
選択されたPDFを表示します。
PDFを表示する方法として、ActiveX(wxAutomationObject、wxActiveXContainer)を使用して
AcroPDF.dllを呼び出します。

###発生している問題・エラーメッセージ
ファイルオープンダイアログでPDFを選択しても、AcroPDF.dllのLoadFileメソッドでなにかしらの
エラーが発生してしまい、失敗します。
エラーの取得方法も分からないため、原因追究もできていない状況です。

ソースコードの不備、エラーの取得方法をご存じの方がおりましたら、ご教示いただけませんでしょうか。

###ソースコード

●MyFrame.cpp

//ファイルオープン時 void MyFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event)) { wxMediaCtrl* mymediactrl = new wxMediaCtrl(m_leftBottomWindow, wxID_ANY, wxT("C:\\test.pdf"), wxDefaultPosition, wxDefaultSize, 0, wxT("wxPDFMediaBackend")); }

※m_leftBottomWindowはPDFを表示するウィンドウです。

●wxPDFMediaBackend.hファイル

#pragma once #include "wx/mediactrl.h" // wxMediaBackendCommonBase #include "wx/msw/ole/activex.h" // wxActiveXContainer #include "wx/msw/ole/automtn.h" // wxAutomationObject #include "wx/variant.h" const IID DIID__DPdf = {0x3B813CE7,0x7C10,0x4F84,{0xAD,0x06,0x9D,0xF7,0x6D,0x97,0xA9,0xAA}}; const IID DIID__DPdfEvents = {0xE790E1D1,0x9DE8,0x4853,{0x8A,0xC6,0x93,0x3D,0x4F,0xD9,0xC9,0x27}}; const CLSID CLSID_Pdf = {0xCA8A9780,0x280D,0x11CF,{0xA2,0x4D,0x44,0x45,0x53,0x54,0x00,0x00}}; class WXDLLIMPEXP_MEDIA wxPDFMediaBackend : public wxMediaBackendCommonBase { public: wxPDFMediaBackend() : m_pAX(NULL) {} virtual ~wxPDFMediaBackend() { if(m_pAX) { m_pAX->DissociateHandle(); delete m_pAX; } } virtual bool CreateControl(wxControl* ctrl, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { IDispatch* pDispatch=NULL; if( ::CoCreateInstance(CLSID_Pdf, NULL, CLSCTX_INPROC_SERVER, DIID__DPdf, (void**)&pDispatch) != 0 ){ return false; } m_PDF.SetDispatchPtr(pDispatch); // wxAutomationObject will release itself if ( !ctrl->wxControl::Create(parent, id, pos, size, (style & ~wxBORDER_MASK) | wxBORDER_NONE, validator, name) ){ return false; } m_ctrl = wxStaticCast(ctrl, wxMediaCtrl); m_pAX = new wxActiveXContainer(ctrl, DIID__DPdf, pDispatch); wxPDFMediaBackend::ShowPlayerControls(wxMEDIACTRLPLAYERCONTROLS_NONE); return true; } virtual bool Load(const wxString& fileName) { if(m_PDF.CallMethod(wxT("LoadFile"), fileName).GetBool()) //ここで必ずfalseが返ってきてしまう { m_PDF.CallMethod(wxT("setCurrentPage"), wxVariant((long)0)); NotifyMovieLoaded(); // initial refresh wxSizeEvent event; m_pAX->OnSize(event); return true; } return false; } wxActiveXContainer* m_pAX; wxAutomationObject m_PDF; wxDECLARE_DYNAMIC_CLASS(wxPDFMediaBackend); }; wxIMPLEMENT_DYNAMIC_CLASS(wxPDFMediaBackend, wxMediaBackend);

※wxWidgetsのリファレンスページで記載されていたサンプルを流用しています。
###補足情報(言語/FW/ツール等のバージョンなど)
言語:C++
Acrobatのバージョン:11
コンパイラ:VisualStudio 2010

情報の不備などがございましたら、ご指摘ください。
お手数をおかけいたしますが、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結果的にwxWidgetsでの実装を断念し、AcrobatSDKのみで対応する方向となりました。

投稿2016/10/12 08:11

nishisyun

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問