Вызовите функцию StrFormatByteSize64 из C # - PullRequest
2 голосов
/ 04 августа 2010

как я могу вызвать функцию StrFormatByteSize64 из Win API из C #? Я пытаюсь следующий код, но безуспешно:

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

Документацию по функции можно найти здесь: http://msdn.microsoft.com/en-us/library/bb759971%28VS.85%29.aspx

Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 августа 2010

Это работает, хотя это может быть не самым чистым способом:

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, например.Я не уверен :( В любом случае, он должен предоставить вам отправную точку для дальнейшего расследования.

1 голос
/ 21 января 2011

Попробуйте добавить [Out] до char[].


Edit:

Не могу поверить, что раньше не заметил, но другая проблема в том, что ваша функция не void! Возвращает указатель. Вы можете исправить это, если хотите, чтобы это работало. :)

[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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...