質問

配列を変換したい<バイト> ^から符号なし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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top