次のコードはC#から呼び出されたときに機能しますが、管理対象の世界からデータ を取得し、そのローカルのネイティブコピーを作成し、Win32関数を呼び出すと、 のデータを管理対象のパラメータに戻します。呼び出し元に返されます。C++/CLI Win32のトラッキングハンドルをネイティブポインタに変換しますか?
次の方法がありますか?
1)blittable UInt32参照パラメータを直接Win32呼び出しに渡しますか? このWin32呼び出しが値を更新することを覚えておいてください。私は呼び出し元(ieSerialNumber)に戻りたいと思います。 ネイティブ関数がその値を使用して直接更新できるLPDWORDとしてUInt32参照パラメータ(ieSerialNumber)をpin_ptr pin_ptrできます?
2)StringBuilderバッファをネイティブ関数に直接渡しますか?私は StringBuilder.Capacity = MAX_PATH + 1を設定する必要があると思います。しかし、私はピン配列を の内部バッファにネイティブ関数が使用し更新する方法を知りません。
私は数時間にわたりこれらの質問に頭を突きつけて実験していますので、 あなたのhelPに本当に感謝しています!
おかげで、
マイク
void MCVolume::VolumeInformation(String^ theRootPathName,
StringBuilder^% theVolumeName,
UInt32% theSerialNumber,
UInt32% theMaxComponentLength,
MEFileSystemFeature% theFileFlags,
StringBuilder^% theFileSystemName)
{
pin_ptr<const wchar_t> rootPathName = PtrToStringChars(theRootPathName);
wchar_t volumeName[MAX_PATH+1];
memset(volumeName, 0x0, MAX_PATH+1);
wchar_t fileSystemName[MAX_PATH+1];
memset(fileSystemName, 0x0, MAX_PATH+1);
DWORD serialNumber = 0;
DWORD fileFlags = 0;
DWORD maxComponentLength = 0;
//pin_ptr<DWORD> serialNumber = &theSerialNumber;
if (GetVolumeInformationW(rootPathName,
volumeName,
MAX_PATH+1,
&serialNumber,
&maxComponentLength,
&fileFlags,
fileSystemName,
MAX_PATH+1) == false)
{
// Handle error
throw gcnew Exception("GetVolumeInformationW failed.");
}
// Send back results...
theVolumeName = gcnew StringBuilder(marshal_as<String^>(volumeName));
theSerialNumber = serialNumber;
theMaxComponentLength = maxComponentLength;
theFileFlags = (MEFileSystemFeature) fileFlags;
theFileSystemName = gcnew StringBuilder(marshal_as<String^>(fileSystemName));
実際には、*あなた*は、管理対象の世界に返されるオブジェクトを構築する必要はありません。 P/Invokeを使用して、コンパイラにあなたのために仕事をさせてください。 –
@ taspeotis:例を表示できますか?これは私のためにかなり新しいものです。 – Aamir
@Aamir - こんにちは、[このリンク](http://weblogs.asp.net/kennykerr/archive/2005/06/20/414010.aspx)には、P/Invokeの使用例と状況が表示されていますC + +/CLI対あなたは自分をマーシャリングしている管理(何も意図していない)。 –