以下代码在从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));
答案 0 :(得分:0)
由于两种字符串类型(托管字符串和本机wchar *)根本不同,因此无法以两种方式摆脱编组。此外,GC需要跟踪已分配的托管资源,这就是为什么您总是需要构建一个System::String^
对象以发送回托管世界。
答案 1 :(得分:0)
只需使用C ++ / CLI中的P / Invoke。有关详细信息,请参阅here。