プロが教えるわが家の防犯対策術!

VS2010 C#からVC6で作成したDLLへint配列を引数として渡したい。
VC++6で作成されたDLLがあります。
ここで定義されている

int test(char*fname,int* x,int* y);

ファイルのフルパスを渡すと
返り値が関数の成否のコードを返す。
処理内で x,y
にファイルから読み込んだ値が
それぞれ上限100個としてセットして返す
といったような関数を
C#から呼び出したいのですが

1
[DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int test(IntPtr fname, ref int* x,ref int* y);

2
[DllImport("dll名", EntryPoint = "test", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int test(IntPtr fname, ref IntPtr x,ref IntPtr y);

と2種類の呼び出し方法をこころみました。


ファイルのフルパスは
IntPtr fnamePtr = Marshal.StringToHGlobalAnsi(string型ファイルフルパス);
としております。

1の場合は
int[] resX = new int[100];
int[] resY = new int[100];
fixed(int* x= resX)
fixed(int* x= resY)
として呼び出そうとすると

: エラー CS1657: '固定変数' であるため、'x' を ref または out 引数として渡せません
となり失敗してしまいます。

2
で試みた場合
int size = sizeof(int)*100;
IntPtr x = Marshal.AllocHGlobal(size);
IntPtr y = Marshal.AllocHGlobal(size);
と引き渡したところ
ビルドは通りますが
実行時に
System.AccessViolationException' のハンドルされていない例外が 発生しました。

追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
となってしまいます。

どのようにすれば思惑通りの結果を得られますでしょうか。

A 回答 (1件)

難しく考えなくても出来るようですよ



[DllImports("DLL名", CharSet=CharSet.Ansi, EntryPoint="test")]
public static extrn int test( string fname, [Out] int[] xx, [Out] int[] yy );
と宣言して

int[] x = new int[100];
int[] y = new int[100];
int res = -2;

res = test( "ファイル名", x, y );
でOKみたいですよ …

unsafeにしなくても いいみたいですし
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!