C# 从C中调用StrFormatByteSize64函数#

C# 从C中调用StrFormatByteSize64函数#,c#,winapi,C#,Winapi,如何从C#中从Win API调用StrFormatByteSize64函数?我正在尝试以下代码,但没有成功: [DllImport("shlwapi.dll")] static extern void StrFormatByteSize64(ulong qdw, char[] pszBuf, uint cchBuf); char[] temp = new char[128]; ulong size = 2000; StrFormatByteSize64(size, temp, 128); Co

如何从C#中从Win API调用StrFormatByteSize64函数?我正在尝试以下代码,但没有成功:

[DllImport("shlwapi.dll")]
static extern void StrFormatByteSize64(ulong qdw, char[] pszBuf, uint cchBuf);

char[] temp = new char[128];
ulong size = 2000;
StrFormatByteSize64(size, temp, 128);
Console.WriteLine(temp);
函数的文档可在此处找到:


谢谢大家!

尽管这可能不是最干净的方式,但这是可行的:

using System;
using System.Runtime.InteropServices;
using System.Text;

public class Test
{    
    [DllImport("shlwapi.dll")]
    static extern void StrFormatByteSize64(ulong qdw, StringBuilder builder,
                                           uint cchBuf);

    static void Main()
    {
        ulong size = 2000;
        StringBuilder builder = new StringBuilder(128);
        StrFormatByteSize64(size, builder, builder.Capacity);
        Console.WriteLine(builder);
    }
}

恐怕我对互操作知之甚少-例如,您可能不需要指定
StringBuilder
的初始容量。我不确定:(无论如何,它应该为您提供进一步调查的起点。

尝试在
char[]
之前添加
[Out]


编辑:

我不敢相信我没有更早地注意到这一点,但另一个问题是您的函数不是
void
!它返回一个指针。如果希望它工作,您可能需要修复它。:)


尝试将ref关键字添加到pszBuf参数。静态外部无效标准格式字节64(ulong qdw,参考字符[]pszBuf,uint cchBuf)。。。纳米。。这不起作用。@gbogumil:它通过引用而不是内容传递指向数组的指针。谢谢!它工作得很好。最后是一个很好的解决方案,将字节转换为其他内存单元,如KB、MB、GB。。。我将进一步研究StringBuilder类的问题国际海事组织。
[DllImport("shlwapi.dll")]
static extern IntPtr StrFormatByteSize64(long qdw, [In] StringBuilder pszBuf,
                                         uint cchBuf);

//...
ulong num = 10000000;
var sb = new StringBuilder(1024);
if (StrFormatByteSize64(num, sb, (uint)sb.Capacity) != IntPtr.Zero)
{
    //Conversion successful... do stuff
}