2012-02-17 20 views
1

C#とVBScriptで動作するCOMオブジェクトを開発しています。また、32ビットと64ビットをサポートしなければなりません。COMのIntPtrとAs Any Any

私が持っている問題は、ポインタです。このアプローチの問題は、私はできないということです

「いずれかのような」私がvoid *としてPTRTYPEを宣言すると、C#はのIntPtrとしてそれらを見て、VB6/VBScriptのは、それらを見て、私の.IDLの一部に

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

を参照してください。 「任意の」タイプのパラメータを使って簡単にポインタを計算します。

私はPTRTYPEを長く宣言すれば(64ビットで "ハイパー")、ポインタ計算を行うことができますが、C#では32/64ビットプラットフォームに応じて同じメソッドに対して2つの異なる定義があります。

VARIANTをPTRTYPEタイプとして使用しないでください。

C#とVBScriptの両方に互換性を持たせる方法はありますか?

ありがとうございます。 Mauro。

+0

ADO_LONGPTRの失敗を引き起こしたのと同じ間違いをしています。 Copy64()メソッドまたはIAddressインターフェイスを提供するだけです。 –

答えて

0

ソリューションは、以下の通りであった:

1)を別のフォルダにコピー

2を.IDL)あなたはのIntPtr

3になりたい変数でのvoid *で__int3264を交換してください) .idlから.tlbファイルを作成します。

4).t​​lbファイルに基づいてプライマリ相互運用機能を構築します。

Voilá!

よろしくお願いします。 Mauro。

0

あなたのタイプの消費者にポインタ計算を強制しないことをお勧めします。

これをvoidと宣言すると、消費者に操作を強制する代わりに、パラメータとして渡すことができます。これは、ソースと宛先が単純な整数として渡されたオフセットを持つ.NETフレームワークの中で、このような少し複雑に見えます(Array.Copyオーバーロード)。

これを行うことで、どの消費者が選択した場合でも、メソッドが正しく動作するようにすることができます。また、検証を行う手段を提供する(つまり、オフセットが正当であることを確認する)消費者に私が採用

+0

こんにちは。実際の関数は、ReadProcessMemoryのラッパーです。消費者が数学をする必要があることはほぼ確実です。 –

+0

@Calamardo「許容される」数学演算をオーバーロード/メソッドとして提供することができますが、この問題は避けてください。 –

関連する問題