2010-08-03 3 views
2

Как я могу вызвать функцию StrFormatByteSize64 из Win API из C#? Я пытаюсь следующий код, но без успеха:Вызов функции StrFormatByteSize64 изнутри 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

Спасибо!

+0

попробуйте добавить ключевое слово ref к параметру pszBuf. static extern void StrFormatByteSize64 (ulong qdw, ref char [] pszBuf, uint cchBuf); ... nm .. это не сработал. –

+0

@gbogumil: Это передает указатель * в массив по ссылке, а не по содержимому. – Mehrdad

ответ

2

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

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

Я боюсь, что я не знаю много о Interop - это может быть, что вам не нужно указать начальную емкость от StringBuilder, например. Я не уверен :(Во всяком случае, он должен предоставить вам отправной точкой для дальнейшего изучения

+0

Спасибо! Это работает очень хорошо. Наконец, хорошее решение для преобразования байтов в другие блоки памяти, такие как KB, MB, GB ... Я еще раз изучу вопрос о классе StringBuilder. –

+0

Лучше использовать 'StrFormatByteSize64 (размер, построитель, (uint) builder.Capacity);' IMO. –

+0

@Ian: Да, это хорошая идея. Будет редактировать. –

0

Попробуйте добавить [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 
} 
Смежные вопросы