array< Byte> ^ TO unsigned char * :: Marshallクラス-相互運用の問題
-
06-07-2019 - |
質問
配列を変換したい<バイト> ^から符号なしchar *へ。私がやったことを説明しようとしました。さらに進む方法がわかりません。正しいアプローチを教えてください。 MS VC 2005を使用しています。
//Managed array
array<Byte>^ vPublicKey = vX509->GetPublicKey();
//Unmanaged array
unsigned char vUnmanagedPublicKey[MAX_PUBLIC_KEY_SIZE];
ZeroMemory(vUnmanagedPublicKey,MAX_PUBLIC_KEY_SIZE);
//MANAGED ARRAY to UNMANAGED ARRAY
// Initialize unmanged memory to hold the array.
vPublicKeySize = Marshal::SizeOf(vPublicKey[0]) * vPublicKey->Length;
IntPtr vPnt = Marshal::AllocHGlobal(vPublicKeySize);
// Copy the Managed array to unmanaged memory.
Marshal::Copy(vPublicKey,0,vPnt,vPublicKeySize);
ここでvPntは数字です。しかし、どのようにしてvPublicKeyからvUnmanagedPublicKeyにデータをコピーできます。
ありがとう
Raj
解決
最後の2行を次のように置き換えてみてください:
Marshal::Copy(vPublicKey, 0, IntPtr(vUnmanagedPublicKey), vPublicKeySize);
キーのコピー先のアンマネージメモリにバッファを既に割り当てているため、AllocHGlobalを使用してアンマネージメモリを割り当てる必要はありません。 Marshal :: Copyが使用できるように、アンマネージポインター(vUnmanagedPublicKey)をマネージポインター(IntPtr)に変換する必要がありました。 IntPtrは、コンストラクターの引数の1つとしてネイティブポインターを使用して、その変換を実行します。
したがって、完全なコードは次のようになります。
array<Byte>^ vPublicKey = vX509->GetPublicKey();
unsigned char vUnmanagedPublicKey[MAX_PUBLIC_KEY_SIZE];
ZeroMemory(vUnmanagedPublicKey, MAX_PUBLIC_KEY_SIZE);
Marshal::Copy(vPublicKey, 0, IntPtr(vUnmanagedPublicKey), vPublicKey->Length);
他のヒント
マーシャリングAPIを使用する代わりに、マネージドアレイを固定する方が簡単です:
array<Byte>^ vPublicKey = vX509->GetPublicKey();
cli::pin_ptr<unsigned char> pPublicKey = &vPublicKey[0];
// You can now use pPublicKey directly as a pointer to the data.
// If you really want to move the data to unmanaged memory, you can just memcpy it:
unsigned char * unmanagedPublicKey = new unsigned char[vPublicKey->Length];
memcpy(unmanagedPublicKey, pPublicKey, vPublicKey->Length);
// .. use unmanagedPublicKey
delete[] unmanagedPublicKey;
所属していません StackOverflow