|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
Вызываю функцию из DLL(С++), на выходе параметр unsigned char* который в C# поступает как StringBulder. В середине параметра (строки) встречаются терминаторы, соответственно StringBulder на первом из них обрезается. Далее этот параметр надо передавать опять в DLL, а он передается только обрезанным. Как исправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 17:43 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 18:35 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
bazileFullKettle, покажи пример. Строки в .NET могут работать с нулем внутри. Даже если их несколько подряд идет. Мочь то могут, но она уже на выходе из функции обрезается по самый терминатор. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:12 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:27 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
bazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. Код: c# 1.
Код: c# 1. 2.
Библиотека на VC++, параметр buff в ней объявлен как unsigned char* ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:40 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff); а если так? у СтрингБилдера не так много входных параметров ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:50 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettlebazileFullKettle, из какой функции? Из C++ DLL или C# кода? Если первое, то или функция плохо работает со строками с 0-terminator или ты не так вызываешь эту функцию. Приведи пример для вопроизведения. Код: c# 1.
Код: c# 1. 2.
Библиотека на VC++, параметр buff в ней объявлен как unsigned char* Соответственно DLL возвращает строку длиной скажем 20 с терминатором по центру, в в StringBuilder строка длиной по терминатор ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:51 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
beg-in-erFullKettle, автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, string buff); а если так? у СтрингБилдера не так много входных параметров Так вообще пустую строку возвращает ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:53 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettlebeg-in-erFullKettle, пропущено... а если так? у СтрингБилдера не так много входных параметров Так вообще пустую строку возвращает Если с параметрами out или ref, то System.ExecutionEngineException ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:54 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 15:59 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
beg-in-erFullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? нет, не длина. Но длина фиксированная и я ее знаю. Провобовал как byte[] - Exception ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:00 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, в конце концов это должно работать. если addr это длина. автор[DllImport("d12.dll")] public static extern int ReadDev(int addr, char* buff); [DllImport("d12.dll")] public static extern int ReadDev(int addr, ushort* buff); ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:00 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, ну если длина фикс , ловите через указатель. и там выковыривайе в строку. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:01 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
beg-in-erFullKettle, ну попробуйте дайте то что он хочет [DllImport("d12.dll")] public static extern int ReadDev(int addr, char[] buff); а параметр addr это не длинна строки? Тоже самое что и с String. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:02 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
beg-in-erFullKettle, ну если длина фикс , ловите через указатель. и там выковыривайе в строку. Использование в небезопасном контексте? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:03 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, да. разумеется. этот небезопасный контекст придуман незнамо для чего. т.к. в CLR упоминание о нём оттсвует . метот помеченый как unsafe выглядит точно так же , как не помеченный. Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:07 |
|
StringBuilder и терминатор
|
|||
---|---|---|---|
#18+
FullKettle, проблема не в StringBuilder, в правилах по умолчанию для маршаллинга строк. .NET предполагает, что строка заканчивается нулевым символом и останавливается на нем. Тебе нужно написать код для обработки таких строк. Смотри пример в обсуждении Работа с GetEnvironmentStrings: как получить список переменных окружения и статью Advanced Topics in PInvoke String Marshaling . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 16:08 |
|
|
start [/forum/topic.php?fid=20&fpage=172&tid=1405007]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 151ms |
0 / 0 |