- 締切済み
COMサーバ呼び出しでエラー
VC++初心者です。 COMサーバにおいて、メソッドにLONGのダブルポインタ(LONG **a)の ような引数を持つものを呼び出そうとすると、エラーコード:C0000005 (=ACCESS_VIOLATION)になってしまいます。どうしたら回避できるのでしょうか? 宜しくお願いいたします。(ちなみにIUnknownを継承して作成しています。)
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
さらに確認です。 1.COMサーバとクライアント、どちらがMFC製なのでしょうか? CoInitializeをクライアントで呼んでいるということはクライアントはSDKでごりごりですか? 2.こんなメソッドがもしあったとき、サーバ側でポインタaが指し示す内容(アドレス値ではない)を受け取れていますか? provider->test03(long * a); もし、MFCでCOMサーバを作成しているのであれば、独自のプロキシDLLがないとOLEオートメーション型と総称されるVBのVariantに格納できる種類以外の型は渡せないはずです。 OLEオートメーション型のみをメソッド、プロパティに使用しているのであれば独自のプロキシDLLは不要ですが、long**を使用しているので独自DLLが必要です。 そもそもポインタのポインタを使用する理由はなんでしょう? 1.long値の配列の配列をサーバに渡す アウトプロセスサーバであるならこれは不可能です。 メモリ空間が呼び出し元と同一ではないためです。 プロキシDLLは、そこまでしません。 このときは、固定長のlongの配列を渡す必要があります。 2.long値の配列をサーバ側から受け取る アウトプロセスサーバのタイプライブラリで[out]の属性が必要です。確認してください。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
「COMサーバにおいて」ということは、現在COMサーバを作成中で、別のCOMのメソッドを呼ぼうとしてエラーになっている ということでいいんですか? であれば、COMサーバのタイプライブラリを確認し、あっているのであればプロキシDLLが正しくレジストリに登録されているか確認してください。 でなければ、補足説明をお願いします。 (COMサーバの種類 DLL or EXE、MFC or #importディレクテブ or API直接、どんな言語で作られたCOMサーバかなど・・・)
補足
COMサーバを作成し、クライアントから呼び出す際にエラーになる。 ということです。ダブルポインタなどを使わないものは正常に呼び出す ことができるのを確認しているので、プロキシDLLの登録などは正常 に行われていると思います。 COMサーバの種類:EXE 使用言語:VC++Ver6.0 MFC使用 一応、クライアント側でやっていることは、 1.CoInitializeで初期化 2.CoCreateInstanceでインスタンス取得 3.取得したインスタンスを使用してメソッド呼び出し 4.インスタンスのリリース この3.において、仮に provider->test01(long a); のような呼び出しは正常に行えるのですが、 provider->test02(long **a); のような呼び出しを行うとエラーになるということです。 宜しくお願いいたします。
お礼
その後いろいろと調査しましたところ、引数として渡す領域の実体を 確保して呼び出しを行ったところ、正常に動作できることを確認しました。 いろいろとありがとうございました。