2011-12-09 4 views
2

レガシーVB6アプリケーションで使用するために、VC++ 2010でOCXモジュールを作成しました。その中には、任意のデータ(メモリへのポインタ)の配列をとる関数があります。C++ OCXモジュールでvoid *をとる関数を指定する方法は?

機能が今空体として実装として宣言されています。

BEGIN_DISPATCH_MAP(COcxTestCtrl, COleControl) 
    DISP_FUNCTION_ID(COcxTestCtrl, "Test", 1, Test, VT_EMPTY, VTS_PI1 /*??*/) 
END_DISPATCH_MAP() 

とIDLファイルは言う::

afx_msg void Test(void const* pSrc); 

ディスパッチマップがある

dispinterface _DOcxTest { 
    properties: 
    methods:  [id(1)] void Test(void const* pSrc); 
}; 

VB6のオブジェクトカタログには、関数の種類が

Sub Test(pSrc As Any) 
Member of OcxTestLib.OcxTest 

と私の呼び出しコードしかし、それは常に "エラー13:タイプの互換性がない" と言われます

Private Sub TestButton_Click() 
    Dim text() As Byte 
    Dim buflen As Long 
    buflen = 2^16 
    text = String(buflen, "Z") 
    OcxTest1.Test (text(0)) 
End Sub 

です。これは私が問題を抱えている唯一のタイプです、他のすべての呼び出しは計画どおりに行われます。

void const*の代わりにchar const*,byte const*INT8 const*を使って遊んでいますが、これはどれも動作しません。 INT8 const*を使用すると、VB6はその機能をSub Test(pSrc As Byte)と表示しますが、同じエラーが表示されます。

バイト配列へのポインタをOCXモジュールに渡すにはどうすればよいですか?

+0

void *はオートメーション互換型ではありません。代わりにVARIANTを使用してください。配列を渡す場合はSAFEARRAYを指定します。 –

答えて

2

VBのバイト配列は既にネイティブのSAFEARRAYなので、それをSAFEARRAY(またはSAFEARRAYを含むVARIANT)としてOCXに渡します。

+0

'SAFEARRAY'を含む' VARIANT'として渡すことは成功しました: 'static_cast ((*(pSrc-> pparray)) - > pvData)' :) –

関連する問題