1

私は C++ にかなり慣れていないので、明らかな何かが欠けている可能性があります。オブジェクト モデルがどのように機能するかを完全には理解していないことは認めますが、この問題から何かを学べることを願っています...

wxFrameカスタムクラスを持つ単純な wxWidgets アプリケーションがあります。イベントをフックし、そのイベント ハンドラー内で、フレームのタイトルを設定したいと考えています。しかし、イベント ハンドラーが実行されると、デバッガーはSetTitle関数のアドレスを示し0x00000000、アクセス違反の例外が発生します。

class BrowserFrame : public wxFrame {
public:
    BrowserFrame();

    void OnChangeTitle(AweChangeTitleEvent& evt);

private:
    AweWebView* m_webView;
};

BrowserFrame::BrowserFrame() : wxFrame(NULL, wxID_ANY, wxGetApp().Name) {
    m_webView = new AweWebView(this, wxID_ANY);
    m_webView->Connect(aweEVT_CHANGE_TITLE, AweChangeTitleEventHandler(BrowserFrame::OnChangeTitle));
    m_webView->WebView()->LoadURL(Awesomium::WebURL(Awesomium::WSLit("http://www.google.com")));
}

void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
    SetTitle(evt.GetTitle()); // SetTitle == 0x00000000, Access violation
}

私の最初の考えは、BrowserFrameどういうわけか破壊されているということでした。ただし、でアクセスできるため、そうではないようですGetEventObject()。これは問題なく機能します。たとえば、次のようになります。

void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
    static_cast<wxFrame*>(static_cast<wxWindow*>(evt.GetEventObject())->GetParent())->SetTitle(evt.GetTitle());
}

画像バッファーで独自のメモリ管理を行う 1 つのインスタンスを除いて、v テーブルを何らかの形で破損するような記述は考えられません。私はその部分を完全に削除しましたが、それでもアクセス違反がSetTitle発生するため、それが問題の原因ではないと思います。

私は何が欠けていますか?

4

1 に答える 1

0

私はそれを修正することができました。私はできる限り解決策を説明しようとします。

問題を正しく理解していれば、イベント ハンドラーは実際には のインスタンスに関連付けられていませんでしたBrowserFrame。wxWidgets イベントを接続するより現代的な方法に切り替えて、次Bind<>()のインスタンスを渡しましたBrowserFrame

m_webView->Bind(aweEVT_CHANGE_TITLE, &BrowserFrame::OnChangeTitle, this);

また、カスタム イベント宣言を更新して と互換性を持たせる必要がありましBind<>()たが、その後、SetTitle()が呼び出され、すべてがうまく機能します。

于 2012-07-30T02:27:51.650 に答える