お世話になっております。
ACTIVEXコントロールには
ダイアログに張り付けるパターンと
CreateDispatchメソッドで生成するパターンの
主に2種類あると思います。
今回、CreateDispatchメソッドで生成するパターンにより、
メンバ変数をアクセスしたのですが、
AfxCallWndProcによりエラーをキャッチしてしまい。
「メンバが見つかりません」と言われました。
どのようにしたら、アクセスできるのでしょうか?
-------------------------------------------------------------------------
コードを以下に示します。
Device dev;
CoInitialize(NULL);//COMを利用するスレッド毎に呼び出さなければならないAPI
BOOL bRet = dev.CreateDispatch(xxxx.yyyy);// bRet はTRUE
dev.get_DeviceIsPresent();<-----------------ここでエラーが発生!!!
-------------------------------------------------------------------------
備考:今回外部から頂いたDLL(ActiveX)を使っています。
VBによるサンプルコードしかなく、僕の知識では参考になりません。。。
どうかご指導の程、宜しくお願いします。
自己レスです。
CoCreateInstanceでオブジェクト生成は出来たんですが、
AfxConnectionAdviseでのシンク間の接続時に
戻り値0になってしまうんです。。。
なかなか難しいですね。。。
どなたか
AfxConnectionAdviseメソッドが失敗する原因
について、お分かりの方
教えて頂けませんか?
エラー内容を
GetLastErrorで取得したところ、
122:システム コールに渡されるデータ領域が小さすぎます。
と言われました。
コネクション側での領域生成等、何か関係あるんでしょうか。。。。
>122:システム コールに122:システム コールに渡されるデータ領域が小さすぎます。
をコムさんのパターンにあわせるとこうなります。
「実行するACTIVEXコントロールに渡されるデータ領域が小さすぎます。」
心当たりないですか?
あっとこうですね。
コピーミスです。
>122:システム コールに渡されるデータ領域が小さすぎます。
ITOさん、お返事有難うございます。
>「実行するACTIVEXコントロールに渡されるデータ領域が小さすぎます。」
何がデータ領域と言われるのか考えたところ
2つあると思います。
1)インスタンスしたオブジェクト m_pSrc
2)IDispatchクラスのポインタ m_pUnk
コード抜粋)
_xxxx* m_pSrc;//接続するIDispatchクラス
MFCSink *m_pSink;//CCmdTargetの派生クラス
HRESULT hr=CoCreateInstance(CLSID_xxxx
,NULL,CLSCTX_INPROC_SERVER,IID__xxxx ,(void**) &m_pSrc);
LPUNKNOWN m_pUnk=m_pSink->GetIDispatch(FALSE);
int nRet = AfxConnectionAdvise(m_pSrc,IID__xxxx
,m_pUnk,FALSE,&m_dwCookie);
実際にはAfxConnectionAdviseで0が返されます。
しかし、m_pSrcとm_pUnkともにデバッグ上
正常に取得しているとおもうのでこれ以外の原因があるのではと、
調査中です。。。。
あと、もう1点気になったのですが、
こんな文書がありました。
IConnectionPointContainer::FindConnectionPoint() で失敗すると
AfxConnectionAdviseで0が返されます。
http://support.microsoft.com/kb/190148/ja
これは関係あるのでしょうか。。。
>これは関係あるのでしょうか。。。
VC6.0ですか、それよりも上のバージョンの場合改善されている可能性もありますね。
いえ、2005です。
つまりVB6.0のACTIVEXに対して、
6.0以上のバージョンでの
操作や接続にかかわる仕様が
変更されている可能性があるということでしょうか?
> 操作や接続にかかわる仕様が
> 変更されている可能性があるということでしょうか?
http://support.microsoft.com/kb/190148/ja
ここに書いてある解決方法のことをしなくても、動作する可能性が
あるのではないかと思いました。
つまり、問題が解決している可能性があると思いました。
残念ながら6.0の環境がないため、
確認できないのですが、バージョンアップによる
DLLの仕様変更について細かな資料を探してみます。