ACTIVEXの使用方法

[戻る]
コム 2009/09/08(火) 17:56:29
お世話になっております。

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によるサンプルコードしかなく、僕の知識では参考になりません。。。

どうかご指導の程、宜しくお願いします。

コム 2009/09/14(月) 16:43:48
自己レスです。
CoCreateInstanceでオブジェクト生成は出来たんですが、
AfxConnectionAdviseでのシンク間の接続時に
戻り値0になってしまうんです。。。

なかなか難しいですね。。。

コム 2009/09/14(月) 17:07:27
どなたか

AfxConnectionAdviseメソッドが失敗する原因

について、お分かりの方

教えて頂けませんか?

コム 2009/09/14(月) 17:26:58
エラー内容を
GetLastErrorで取得したところ、

122:システム コールに渡されるデータ領域が小さすぎます。 

と言われました。

コネクション側での領域生成等、何か関係あるんでしょうか。。。。

ITO 2009/09/14(月) 20:21:55
>122:システム コールに122:システム コールに渡されるデータ領域が小さすぎます。 

をコムさんのパターンにあわせるとこうなります。

 「実行するACTIVEXコントロールに渡されるデータ領域が小さすぎます。」

心当たりないですか?

ITO 2009/09/14(月) 20:22:54
あっとこうですね。
コピーミスです。
>122:システム コールに渡されるデータ領域が小さすぎます。

コム 2009/09/15(火) 09:33:23
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ともにデバッグ上
正常に取得しているとおもうのでこれ以外の原因があるのではと、
調査中です。。。。

コム 2009/09/15(火) 09:36:09
あと、もう1点気になったのですが、
こんな文書がありました。

IConnectionPointContainer::FindConnectionPoint() で失敗すると
AfxConnectionAdviseで0が返されます。

http://support.microsoft.com/kb/190148/ja

これは関係あるのでしょうか。。。

ITO 2009/09/17(木) 15:51:39
>これは関係あるのでしょうか。。。
VC6.0ですか、それよりも上のバージョンの場合改善されている可能性もありますね。

ダイ 2009/09/17(木) 17:32:38
いえ、2005です。

つまりVB6.0のACTIVEXに対して、
6.0以上のバージョンでの
操作や接続にかかわる仕様が
変更されている可能性があるということでしょうか?

ITO 2009/09/17(木) 20:02:38
> 操作や接続にかかわる仕様が
> 変更されている可能性があるということでしょうか?

http://support.microsoft.com/kb/190148/ja
 ここに書いてある解決方法のことをしなくても、動作する可能性が
あるのではないかと思いました。
つまり、問題が解決している可能性があると思いました。

コム 2009/09/18(金) 14:25:19
残念ながら6.0の環境がないため、
確認できないのですが、バージョンアップによる
DLLの仕様変更について細かな資料を探してみます。

古いスレッドには追加発言できません。