2013-06-11 3 views
0

, что я имею в hidapi.c библиотеке:C# DllImport wchar_t * в StringBuilder

int HID_API_EXPORT HID_API_CALL testwchar(wchar_t * string) { 
    //... 
    wcsncpy(string, cur_dev->serial_number, wcslen(cur_dev->serial_number)); 
    return wcslen(cur_dev->serial_number); 
} 

, что я имею в C#:

[DllImport("hidapi.dll", CharSet = CharSet.Unicode)] 
public static extern unsafe int testwchar(StringBuilder stringt); 
StringBuilder sb = new StringBuilder(64); 
res = testwchar(sb); 

я пропустил какую-то часть кода в С функции// ... он перечисляет устройства и ищет vid/pid и возвращает серийный номер, он отлично работает, когда я тестировал его в testapi.cpp, но когда я попытался написать C# gui ... visual studio 2012 вызывает ошибку, говорящую о несбалансированном stack ... как я понимаю, если я использую строку как параметр out, мне нужно использовать stringbuilder вместо строки.

что я делаю неправильно? спасибо за любые советы.

p.s. извините, но форматирование doe не сработало, поэтому код беспорядок ...

+1

Опубликовать определения 'HID_API_EXPORT' и' HID_API_CALL'. Вероятно, проблема связана с неправильным соглашением о вызове. – Dennis

+0

Возможный дубликат [Unbalanced Stack!] (Http://stackoverflow.com/questions/4171790/unbalanced-stack) – shf301

+0

Не пишите такой код. Как может testwchar() угадать, сколько места доступно в StringBuilder? Угадание неправильно разлагает кучу GC, чрезвычайно трудно диагностировать. Добавьте еще один аргумент, указывающий, насколько велик буфер. –

ответ

0

Я бы предложил использовать функции hidapi самостоятельно, чтобы скомпилировать нужную вам информацию. Вы можете найти документацию для них here, вместо использования этой строковой функции. Это будет намного более эффективно.

Если вам нужны poniters, код на this page должен вам помочь.