分類:[C#]
2013/03/11(Mon) 18:08:08 編集(投稿者)
開発環境:VisualStudio2005 C#
現在、32bitOSから64bitOSへのシステム対応をしているのですが、下記コードで例外エラーになります。
該当行:「Marshal.Copy(bioApiData.Data, bitmapData, 0, (int)bioApiData.Length);」
エラー内容:「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」
[StructLayout(LayoutKind.Explicit, Size = 8)]
struct PvsApiIfBioAPIData
{
[FieldOffset(0)]public UInt32 Length;
[FieldOffset(4)]public IntPtr Data;
}
[StructLayout(LayoutKind.Explicit, Size=12)]
struct PvsApiIfBioAPIGuiBitmap
{
[FieldOffset(0)]public UInt32 Width;
[FieldOffset(4)]public UInt32 Height;
[FieldOffset(8)]public IntPtr Bitmap;
}
/// <summary>
/// Callback function for image notification.
/// </summary>
/// <param name="guiStreamingCallbackCtx">Context pointer</param>
/// <param name="sampleBuffer">Silhouette image information</param>
/// <returns>
/// <see cref="PvsBioAPITypes.PVS_APIIF_BIOAPI_OK">Normal end</see>(Fixed)
/// </returns>
/// <remarks>
/// Method that is called by Authentication library.<para/>
/// If callback function is set by application, notify the silhouette to application.<para/>
/// </remarks>
private UInt32 BioApiStreamingCallback(IntPtr guiStreamingCallbackCtx, IntPtr sampleBuffer)
{
if (!sampleBuffer.Equals(IntPtr.Zero)) {
PvsApiIfBioAPIGuiBitmap bioApiGuiBitmap = new PvsApiIfBioAPIGuiBitmap();
bioApiGuiBitmap = (PvsApiIfBioAPIGuiBitmap)Marshal.PtrToStructure(sampleBuffer, typeof(PvsApiIfBioAPIGuiBitmap));
PvsApiIfBioAPIData bioApiData = new PvsApiIfBioAPIData();
bioApiData = (PvsApiIfBioAPIData)Marshal.PtrToStructure(bioApiGuiBitmap.Bitmap, typeof(PvsApiIfBioAPIData));
if ((0 != bioApiData.Length) && (!bioApiData.Data.Equals(IntPtr.Zero))) {
byte[] bitmapData = new byte[bioApiData.Length];
Marshal.Copy(bioApiData.Data, bitmapData, 0, (int)bioApiData.Length);
PvsSilhouetteInfo info = new PvsSilhouetteInfo();
info.Width = bioApiGuiBitmap.Width;
info.Height = bioApiGuiBitmap.Height;
info.Data = new MemoryStream(bitmapData);
// Notify to application.
if (null != callbackToGui)
{
callbackToGui(PvsApiIfTypes.PVS_APIIF_SAMPLE_AVAILABLE, 0, info);
}
info.Dispose();
}
}
return PvsBioAPITypes.PVS_APIIF_BIOAPI_OK;
}
データの値は下のように入っています。
-----------64bitOS-----------
sampleBuffer 604031672
bioApiGuimap
width 640
height 480
bitmap 604031688
bioApiData
Data 2366844532814511099
Length 308278
-----------32bitOS-----------
sampleBuffer 112183332
bioApiGuimap
width 640
height 480
bitmap 112183344
bioApiData
Data 79888456
Length 308278
sampleBufferをbioApiGuimapにマーシャリングしているところで
64bitのbitmapはアドレスの値が16増えているのに対し、
32bitのbitmapはアドレスの値が12しか増えていないあたり
intPtrの扱いが64bitと32bitで違うのかもしれませんが
エラーの原因と具体的にどうすればよいのか分かりません。どうかご教授願います。
今までVBの経験しかなかったものでコードや内容で
足りない部分がございましたらご指摘お願いいたします。