- 題名: VC++で作成されたDLLの使用
- 日時: 2006/03/06 12:30:11
- ID: 15437
- この記事の返信元:
- (なし)
- この記事への返信:
- [15439] Re[1]: VC++で作成されたDLLの使用2006/03/06 15:14:08
- ツリーを表示
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpguide/html/cpcondefaultmarshalingforarrays.asp を参考に確かめてみました。 [VC](VC++6.0) int WINAPI Sample( LPSAFEARRAY* arg ) { SAFEARRAY* psa = *arg; if ( psa->cDims != 1 ) return 0; ::SafeArrayLock( psa ); long int i, lb, ub; ::SafeArrayGetLBound( psa, 1, &lb ); ::SafeArrayGetUBound( psa, 1, &ub ); int result = 0; for ( i = lb; i <= ub; ++i ) { int n; ::SafeArrayGetElement( psa, &i, &n ); result += n; } ::SafeArrayUnlock( psa ); return result; } [C#] (.NET Framework 1.1) using System.Runtime.InteropServices; public class test { [ DllImport( "csdll.dll", EntryPoint = "Sample" ) ] private static extern int Sample ( [ MarshalAs( UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4 ) ] ref int[] arg ); public static void Main() { int[] arg = new int[] { 1, 2, 3, 4 }; int result = Sample( ref arg ); System.Console.WriteLine( "結果は {0} です。", result ); } }
>Blueさん 色々と調査の上のご教授に感謝します。 Blueさんからのアドバイスを元に色々試した所、 VC++のDLL側をLPSAFEARRAY*で受ける事で正しく動作しました。 [VC++] extern "C" int VCTEST_DECLSPEC TestSetDataBuffer(LPSAFEARAY* pData) { SAFEARRAY* pWkData = *pData; return VcTest.SetDataBuffer(pWkData); } [C#] private static extern int TestSetDataBuffer ([MarshalAs(UnmanagedType.SafeArray)] ref double[] pBuffer); 体調を壊していたため確認が遅くなりましたが、 どうもありがとうございました。
分類:[.NET]