C ++ / CLI将跟踪句柄转换为Win32的本机指针?

时间:2010-11-25 11:09:05

标签: interop c++-cli

以下代码在从C#调用时有效,但由于我获取数据,因此效率低下 从托管世界,制作它的本地本机副本,调用Win32函数,然后复制 数据返回到托管参数,然后返回给调用者。

有没有办法完成以下任务?

1)将blittable UInt32引用参数直接传递给Win32调用?请注意    这个Win32调用更新值,我想返回调用者(即theSerialNumber)在本质上,我可以将UI_32的UInt32引用参数(即theSerialNumber)pin_ptr为LPDWORD    本机函数可以使用并直接更新其值吗?

2)将StringBuilder缓冲区直接传递给本机函数?我想我会的    需要设置StringBuilder.Capacity = MAX_PATH + 1;但是,我不知道怎么pin_ptr到    它的内部缓冲区,本机函数将使用和更新。

我几个小时以来一直在试验,搜索和敲打这些问题 我真的很感激你的帮助!

谢谢,

麦克


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));

2 个答案:

答案 0 :(得分:0)

由于两种字符串类型(托管字符串和本机wchar *)根本不同,因此无法以两种方式摆脱编组。此外,GC需要跟踪已分配的托管资源,这就是为什么您总是需要构建一个System::String^对象以发送回托管世界。

答案 1 :(得分:0)

只需使用C ++ / CLI中的P / Invoke。有关详细信息,请参阅here