3

Oracle の Outside In API の機能を相互運用しようとしています。次の機能があります。

SCCERR EXOpenExport {VTHDOC hDoc, VTDWORD dwOutputId, VTDWORD dwSpecType, 
VTLPVOID pSpec, VTDWORD dwFlags, VTSYSPARAM dwReserved, VTLPVOID pCallbackFunc, 
VTSYSPARAM dwCallbackData, VTLPHEXPORT phExport);

ヘッダー ファイルから、パラメーターを次のように減らしました。
typedef VTSYSPARAM VTHDOC, VTLPHDOC *
typedef DWORD_PTR VTSYSPARAM
typedef unsigned long DWORD_PTR

typedef unsigned long VTDWORD   

typedef VTVOID* VTLPVOID  
#define VTVOID void  

typedef VTHDOC VTHEXPORT, *VTLPEXPORT  
These are for 32 bit windows 

ヘッダー ファイル、サンプル プログラム、および見つけたドキュメントを
調べます。
2. ドキュメント「開発者が 0 に設定する必要があります」に従って、dwFlags と dwReserved。
3. コールバックを処理したくない場合は、pCallbackFunc を NULL に設定できます。
4. 最後の 2 つは、[StructLayout(LayoutKind.Sequential)] を使用するために C# ラッパーを作成した構造体に基づいています。次に、インスタンスをインスタンス化し、最初に Marshal.AllocHGlobal(Marshal.SizeOf(instance)) で IntPtr を作成してパラメーターを生成し、次に dwCallbackData の uint および phExport の IntPtr として渡されるアドレス値を取得します。

最終的なパラメータ リストは次のとおりです。 1. 以前に呼び出された DAOpenDocument 関数によってアドレスと共にロードされた IntPtr としての phDoc。
2. FI_JPEGFIF を表す 1535 に設定された uint としての dwOutputId
3. IOTYPE_ANSIPATH を表す 2 に設定された int としての dwSpecType
4. 出力が書き込まれる IntPtr.Zero としての pSpec
5. 指示に従って uint として 0 に設定された dwFlags
6. dwReserved としてuint を指示どおりに 0 に設定
7. pCallbackFunc を IntPtr として NULL に設定 (結果を処理するため
) 8. dwCallBackDate を uint として構造体のバッファのアドレス
9. phExport を IntPtr として別の構造体バッファへ

API からまだ未定義のエラーが発生します。呼び出しが、どのヘッダー ファイルにも定義されていない 961 を返すことを意味します。過去に、パラメーターの型の選択が間違っていたときにこれを取得しました。
私は Interop Assistant を使い始めました。これは、変換されるパラメータ タイプの数を知るのに役立ちました。ただし、ヘッダー ファイルから正しいネイティブ型をどれだけうまく収集できるかによって制限されます。たとえば、前の関数で使用された hDoc パラメータは、ファイルシステム以外のハンドルとして定義されていたため、Marshal を使用してハンドルを作成しようとした後、IntPtr を使用し、最終的には int であることが判明しました (実際には、ここで使用された &phDoc でした)。 )。
では、試行錯誤以外に、これを行うためのより科学的な方法はありますか?
ジム

4

1 に答える 1

0

http://pinvoke.netで既存のソリューションを検索するか、 PInvoke Signature Toolkitを試すことができます。これらはいくつかの支援を提供するかもしれません。

于 2010-04-05T15:28:46.377 に答える