はじめまして。
以前,違うサイトで同じ質問をしたのですが,返事がつかず一ヶ月近く経過し,今もなお
困っているので,こちらで質問させてください。
Windows2003/VC++2005/MFC環境で,WebBrowserコントロールを使って,ブラウザ機能を
もったプログラムを作成しています。
コンパイル中(プログラム実行中?),アクセス違反発生のエラーがwinocc.cpp中の
void AFX_CDECL CWnd::InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE
vtRet,void* pvRet, const BYTE* pbParamInfo, ...)
{ ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
←★ここで
if (m_pCtrlSite == NULL)
return;
va_list argList;
va_start(argList, pbParamInfo);
m_pCtrlSite->InvokeHelperV(dwDispID, wFlags, vtRet, pvRet, pbParamInfo,argList);
va_end(argList);
}
出てきます。
ブレークポイントを打って,追いかけてみたら,
m_browser1.Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
のプログラムの部分からとんでいるようです。
(m_bowser1はWebBrowserコントロールのコントロール変数です)
検索をしてみたのですが原因がわからず,お手上げ状態です。
なぜこのエラーが出るのか,どうしたら解決できるのか,わかる方がいらっしゃいました
らご教授お願いします。
CWinAPP:InitInstance() で AfxOleInitをCALLしていますか?
chamaroさん,お返事ありがとうございます!
調べてみましたら
CWinApp::InitInstance();
// OLE ライブラリを初期化します。
if (!AfxOleInit())
{
AfxMessageBox(IDP_OLE_INIT_FAILED);
return FALSE;
}
とありました。
これはコールしてるってことですよね?
VC++の環境がある所に来たので若干調べてみました。
ASSERT(m_pCtrlSite != NULL);
問題は上記のASSERTに引っかかるって認識でよいですかね?
であれば、m_browser1が該当のWebBrowserコントロールに関連づいてないだけではない
でしょうか?
m_browser1はどうやって作りましたか?
chamaroさん,度々おつきあいいただきありがとうございます!!
実は・・・一ヶ月前にこの質問をしたときと今とでは違う方法でプログラムを進めています。
ですが,結局同じ所で行き詰まってしまうので・・・今進めている方法で説明いたします。
>ASSERT(m_pCtrlSite != NULL);
>問題は上記のASSERTに引っかかるって認識でよいですかね?
まさにそのとおりです。
m_browser1ですが,これはdispViewに配置しているWebBrowserコントロールで,
このViewをimDialogというダイアログから呼び出して(?)実行させるようにしようとして
います。
つまりこのm_browser1.Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);を現在では,
view.m_browser1.Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
↑dispViewのこと
として書いています。
以前の書き込みをそのまま使ったので,書き加えるのを忘れていました。すみません。
また,先に言っておくべきことだったのですが,
このプログラムはまずSDIで作成し成功したものです。
それをMDIに変えたいと考え,このプログラムをいじってみています。
その際に必要な何かをしていないのかも・・・と不安を感じているのですが,わかりません。
自分自身がいっぱいいっぱいな状況ですので,このような書き込みになってしまっている
のですが・・・
お力を貸していただければと思います。
>view.m_browser1.Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
とりあえず、↑を↓に変更してください
((*1)view.GetDlgID(*2)).Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
*1 : ウェブブラウザのクラス名
*2 : ウェブブラウザのリソースID
これで旨くいけば、たぶん移植時にDDXの定義が抜けているのだと思います。
移植元のソースでm_browser1で検索すれば、DDX_XXXXX(IDXXX, m_browser1)
ってのがあると思うので、それをコピペでもってくれば良いかと。
訂正
>((*1)view.GetDlgID(*2)).Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
((*1)view.GetDlgItem(*2)).Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
chamaroさん,迅速なお返事ありがとうございます。
早速やってみました。
しかし,ビルドの時点でエラーが。。。
((CdispView)view.GetDlgItem(IDC_EXPLORER1)).Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
としたのですが,上記のプログラムの部分で,
: error C2440: '型キャスト' : 'CWnd *' から 'CBookmarkView' に変換できません。
と
: error C2228: '.Navigate2' の左側はクラス、構造体、共用体でなければなりません
というエラーが出ます。
少し,上記の部分をいじってみたのですが,やはりエラーが・・・・
お手数おかけして申し訳ありませんが,お付き合いいただければ幸いです。
>((CdispView)view.GetDlgItem(IDC_EXPLORER1)).・・
((CdispView*)view.GetDlgItem(IDC_EXPLORER1)).・・
では?
CdispViewの所をWebBrowserコントロールクラスのポインターにしてください
>view.GetDlgItem(IDC_EXPLORER1)
↑で取れるものは、WebBrowserコントロールへのポインターですよね?
# すみませんが、今環境がないのでクラス名がわからんとです・・・
それでも分からなければ、m_browser1の定義している部分にクラス名が書いてあるので
それにしてください
例)
Cxxx m_browser1;だったら
↓のようにする
((Cxxx*)view.GetDlgItem(IDC_EXPLORER1)).Na・・・
# *を忘れないように
chamaroさん,ホントにありがとうございます!!
してみました。
ですが・・・・エラーが・・
今度は
: error C2228: '.Navigate2' の左側はクラス、構造体、共用体でなければなりません
というエラーでした。
何がなにやら・・・・
> ((Cxxx*)view.GetDlgItem(IDC_EXPLORER1)).Na・・・
((Cxxx*)view.GetDlgItem(IDC_EXPLORER1))->Na・・・
すみません、間違えました
ポインターなので アロー演算子です。
気づけなかった自分が情けないです。。
書き換えてみました・・エラーです・・・・
: error C2039: 'Navigate2' : 'CBookmarkView' のメンバではありません。
とのことです。。
アロー演算子を書いた時点で出てくる選択肢(?)の中にもNavigateはありませんでした。
すみません!!
((CExplorer1*)view.GetDlgItem(IDC_EXPLORER1))->Navigate2(COleVariant(url[k]),NULL,NULL,NULL,NULL);
で,ビルドは通りました!!
(CExplorer1にするようにとのアドバイスを見落としていました。
また,1つまえの書き込みの'CBookmarkView'はCdispViewのことです。)
ビルドは通ったのですが,次はwinocc.cpp内の
CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd)); ←★ここ
if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}
で止まってしまいます。。
こちらについては初めて詰まったので,調べてみます。
何かアドバイスありましたら,よろしくお願いします。
すみません、今環境がないのでこちらが正解を出す事は出来ません。
自分としては、既に回答を書いているつもりでいますので、
後は私の回答を何度も読み直して、理解していただけるとありがたいです。